我正在使用 Vue 为客户构建规格表,需要制作可查看和可打印的 PDF。
我一直在尝试使用 Puppeteer,但从我在网上看到的情况来看(如果我错了,请纠正我),Puppeteer 不支持可选文本,也不支持调整 PDF 的 DPI。我还遇到一个问题,Puppeteer 以低质量渲染 PDF - 字体模糊/没有抗锯齿。
有哪些(如果有的话)PDF 渲染器可以
编辑:到目前为止我发现的最好的是eKoopmans html2pdf,但不幸的是,它不允许选择文本(据我所知) - 这是一个交易破坏者。
似乎没有这样的 javascript 包,所以如果 PHP 或 C++ 有这样的包 - 也会考虑。
我找到的最佳解决方案是ebdrup/html2pdf.it。您可以在此处找到现场演示。它使用 Phantom JS,似乎支持我需要的所有功能,除了我尚未测试的分页符。
下一个障碍是弄清楚如何提取必要的函数,以便我可以使用脚本中的功能,而不必传递 GET 查询字符串(这值得它自己的问题)。
编辑:我没有意识到的一个问题是似乎没有办法延迟 PDF 生成,这是一个问题,因为我使用的是 Vue 并且必须首先构建页面。
自从这篇文章以来,我重新审视了 Puppeteer,它可以处理我需要的一切。
您可以通过设置页面视口来调整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');
这并不能解决您提出的两个最重要的问题:像素化文本和不可选择的文本。