任何 HTML 到提供可调 dpi、可选文本和 CSS 支持的 PDF 渲染器?

Any HTML to PDF renderers that offer adjustable dpi, selectable text, and CSS support?

我正在为使用 Vue 的客户构建规范 sheet,需要制作可查看和可打印的 PDF。

我一直在尝试 Puppeteer,但从我在网上看到的情况来看(如果我错了请纠正我),Puppeteer 不支持可选择的文本,也不支持调整 PDF 的 DPI。我还有一个问题,Puppeteer 以低质量呈现 PDF - 字体是 fuzzy/without 抗锯齿。

有哪些(如果有的话)PDF 渲染器

编辑:目前我发现的最好的是 eKoopmans html2pdf,但不幸的是,它不允许选择文本(据我所知)——这是一个交易破坏者。

javascript似乎没有这样的包,所以如果PHP或C++中有,也会考虑。

我找到的最佳解决方案是 ebdrup/html2pdf.it. You can find a live demo here。它使用 Phantom JS,似乎支持我需要的所有功能,除了我尚未测试的分页符。

下一个障碍是弄清楚如何提取必要的函数,这样我就可以在我的脚本中使用这些功能,而不必传递 GET 查询字符串(这值得它自己的问题)。

编辑:我没有意识到的一个问题是似乎没有办法延迟 PDF 的生成,这是一个问题,因为我使用的是 Vue 并且必须先构建页面。

2020 年编辑:

从这个 post 开始,我重新访问了 Puppeteer,它可以处理我需要的一切。

调整 DPI

您可以通过设置页面视口来调整 DPI。

Puppeteer 等同于 1in = 96px。 ctrl+f 对于 unitToPixels

示例。

const browser = puppeteer.launch();

const page = await browser.newPage();

// Multiply the desired length in inches by 96
await page.setViewport({ 
   width: 8.5 * 96,
   height: 11 * 96,
});

等待...

您可以在完成之前等待选择器。在我的例子中,我将 class 附加到正文以供 Puppeteer 收听和捕获。

const browser = puppeteer.launch();

const page = await browser.newPage();

const html = buildDOM();  // Has js that appends .finished class to <body>

await page.setContent(html);

await page.waitForSelector('.finished');