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

问题描述 投票:0回答:2

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

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

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

  • 将 HTML 页面渲染为 PDF*
  • 支持可选文本*
  • 允许可调节 DPI*
  • CSS 支持*(即它将渲染 CSS)
  • 可以接受 URL 作为参数
  • 允许多页
  • 并在 Node/Javascript 中运行(可选)

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

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

javascript php c++ pdf pdf-generation
2个回答
2
投票

我找到的最佳解决方案是ebdrup/html2pdf.it。您可以在此处找到现场演示。它使用 Phantom JS,似乎支持我需要的所有功能,除了我尚未测试的分页符。

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

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

2020 年编辑:

自从这篇文章以来,我重新审视了 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,
});

等待...

您可以在完成之前等待选择器。就我而言,我将一个类附加到主体中,供 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');

0
投票

这并不能解决您提出的两个最重要的问题:像素化文本和不可选择的文本。

© www.soinside.com 2019 - 2024. All rights reserved.