任何 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 渲染器
- 将 HTML 页面呈现为 PDF*
- 支持可选文本*
- 允许调整 DPI*
- CSS 支持*(即它将呈现 CSS)
- 可以接受URL作为参数
- 允许多页
- 并在 Node/Javascript 中运行(可选)
编辑:目前我发现的最好的是 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');
我正在为使用 Vue 的客户构建规范 sheet,需要制作可查看和可打印的 PDF。
我一直在尝试 Puppeteer,但从我在网上看到的情况来看(如果我错了请纠正我),Puppeteer 不支持可选择的文本,也不支持调整 PDF 的 DPI。我还有一个问题,Puppeteer 以低质量呈现 PDF - 字体是 fuzzy/without 抗锯齿。
有哪些(如果有的话)PDF 渲染器
- 将 HTML 页面呈现为 PDF*
- 支持可选文本*
- 允许调整 DPI*
- CSS 支持*(即它将呈现 CSS)
- 可以接受URL作为参数
- 允许多页
- 并在 Node/Javascript 中运行(可选)
编辑:目前我发现的最好的是 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');