如何自动化 HTML 到 PDF 的转换?
Posted
技术标签:
【中文标题】如何自动化 HTML 到 PDF 的转换?【英文标题】:How can I automate HTML-to-PDF conversions? 【发布时间】:2010-09-15 15:27:15 【问题描述】:我使用 htmldoc 已经有一段时间了,但我遇到了一些相当严重的限制。我需要最终解决方案才能在 Linux 机器上工作。我将从 Perl 应用程序调用这个库/实用程序/应用程序,所以任何 Perl 接口都会是一个奖励。
【问题讨论】:
【参考方案1】:很抱歉发现了这篇旧帖子,但它首先出现在我寻找最佳 HTML/PDF 转换工具的过程中。 在 Linux 上wkhtmltopdf 非常好(考虑到 CSS 等)和 GPL。
【讨论】:
为了支持您的观点,1) 像魅力一样工作 2) 使用 webkit 渲染引擎和 qt,这意味着它可以从更新中受益。虽然上一个 RC 是在 2011 年 2 月发布的。 要更新@kommradHomer 的评论,该项目仍处于活动状态;最新的稳定版本是上个月刚刚发布的。它也可以在 Ubuntu 官方存储库中找到,但在后面写几个版本时。 phantomjs 是另一种可能性,同样基于 webkit,如果您想获取远程页面并转换为 pdf。它还可以做许多其他事情,例如使用 javascript 和 DOM 进行抓取。wkhtmltopdf
太棒了。但它不支持弹性盒样式。
就像文档说的那样,您需要带有修补 Qt 的静态版本才能在没有 X 服务器的情况下运行它。【参考方案2】:
WeasyPrint 生成带有可选文本和超链接的精美 PDF。
weasyprint input.html output.pdf
如果您改用wkhtmltopdf
,请尝试以下选项:
wkhtmltopdf --margin-bottom 20mm --margin-top 20mm --minimum-font-size 16 ...
【讨论】:
这应该是选择的答案,它是免费的、开源的,是的,结果是惊人的!强烈推荐。 设置小边距:weasyprint docs.html docs.pdf -s <(echo '@page margin: 0.5cm; ')
【参考方案3】:
2019 年 5 月更新
谢天谢地,TheCodingMachine 将整个过程打包到了一个 docker 镜像中:https://github.com/thecodingmachine/gotenberg
这使得在生产环境中维护和使用基于 chrome 的 pdf 生成非常顺畅且无忧。
自 Chrome 59 以来出现了一种新的无头模式。由于所有其他解决方案都在与 flexbox 等较新(或不再那么新)的 CSS 功能作斗争,因此在我的情况下,这是生成正确 PDF 输出的唯一解决方案。
要从本地 html 文件创建 pdf,只需使用以下命令:
chrome --headless --disable-gpu --print-to-pdf file:///path/to/myfile.html
.
对于 Mac 操作系统,将 chrome
替换为 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
。
到目前为止,我注意到的唯一缺点是(目前)您不能通过标准输入传递 html,但创建临时文件并不是什么大问题。
欲了解更多信息,请参阅https://developers.google.com/web/updates/2017/04/headless-chrome#create_a_pdf_dom
更新:事实证明,chrome 家伙很可能会为此任务提供某种节点模块,这最终会弃用无头模式 (https://bugs.chromium.org/p/chromium/issues/detail?id=719921)。
最好的办法是使用 puppeteer 使用基于节点的方法 https://developers.google.com/web/updates/2017/04/headless-chrome#node 下记录的模块并通过 Page.printToPDF 命令打印页面,这也启用了一些额外的配置。
当然,您也可以从除 node 之外的任何其他环境(即 php 脚本)连接到调试控制台 websocket。
【讨论】:
我试过 weasyprint(不支持 display: grid,也有点慢),然后是 wkhtmltopdf(将近一个 GB,无法在 Ubuntu/WSL 上运行),然后是 puppeteer。 Puppeteer 工作,速度快,允许类似 Selenium 的自动化,适用于通过 JS 加载内容的页面等。感谢您的建议!【参考方案4】:注意:这个答案来自 2008 年,现在可能不正确;请检查其他答案
PrinceXML 是我见过的最好的(它解析常规 HTML 以及 XML/XHTML)。怎么样是最好的? Well, it passes the acid2 test 我认为这非常令人印象深刻
但是,很贵
【讨论】:
我也遇到过同样的问题。我最近评估了 Prince XML,并且可以保证它是一个非常棒的应用程序。输出的速度和质量简直令人难以置信。 当一个免费的开源软件也通过了 Acid 2 测试时,为什么要支付数千美元呢? weasyprint.readthedocs.io WeasyPrint 强烈推荐。惊人的结果。 2008 年,当我做出这个答案时,通过 acid2 测试给我留下了深刻的印象。 2016 年,还是今天?没那么多,但我想王子从那时起也走了很长一段路 当时的答案很公平。但现在已经过时了。【参考方案5】:我为你做了一些谷歌搜索,并提出了两个选项。可能还有更多,我的google策略是尝试“webkit command-line pdf”和“gecko command-line pdf”,基本上是在寻找在命令行渲染器中嵌入两个流行的开源渲染引擎的命令行程序。这是我发现的:
Firefox command-line printer - 输出为 pdf 和 png
wkpdf - 虽然这是针对 mac 的,但它可能非常便携。
【讨论】:
【参考方案6】:我不会声称这是“最佳”解决方案,但它是我使用过的“一个”解决方案。
HTML 输入 --> HTML 2 PS --> PS 2 PDF --> PDF 输出
【讨论】:
【参考方案7】:这完全是矫枉过正,但您可以下载并安装mirth。它是一个消息路由引擎,但它具有将 html 转换为 pdf 的能力,因此您可以将其设置为在文件夹中提取 html 文件,转换为 pdf,然后将 pdf 放入同一文件夹或其他文件夹中。就像我说的,矫枉过正,有点学习曲线,但它是免费的,而且 java,所以如果你愿意,你可以在 linux 上运行它。您的 perl 应用程序所要做的就是将 html 放到一个文件中。
【讨论】:
mirth
项目似乎已经死了,这个答案可能应该被删除。
从那以后它已经多次重命名,但肯定没有死。现在是 NextGen 连接集成引擎。【参考方案8】:
你应该看看http://phantomjs.org/
转换可以通过一个小脚本rasterize.js然后发出
phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
【讨论】:
【参考方案9】:我发现Electroshot 支持现代 CSS 功能,尤其是布局。这是在 wkhtmltopdf 在not supporting things like CSS3 中显示其年龄之后挣扎的。
来自 Electroshot 的功能描述:
Electroshot 使用 Electron,它提供了最新的稳定版 Chrome(而不是几年前的版本);这意味着页面会像在浏览器中一样呈现...
我已经能够使用 Bootstrap 4 设计一个页面,然后使用 Electroshot 渲染一个非常类似于 HTML/CSS 的 PDF。
【讨论】:
【参考方案10】:您可以安装免费的 Calibre,并使用它提供的 ebook-convert
命令行实用程序,将许多 html 文档转换为单个 epub 或 pdf。
https://manual.calibre-ebook.com/generated/en/ebook-convert.html
想法来了from here
我没用过,但this npm module 像我下面的 bash 脚本一样封装了这个过程,但可能更好;-)
对于我来说,在我的 mac 上,我使用以下 bash 脚本将本地 html 网站转换为 PDF:
convert_html_to_pdf.sh
function show_help()
ME=$(basename $0)
IT=$(cat <<EOF
Converts an html file to pdf, epub, mobi or more if you look!
usage: input.html output.pdf|epub|mobi
e.g.
$ME index.html output.pdf
Note: Requires Calibre be installed. more info here: https://ebooks.stackexchange.com/a/6285
EOF
)
echo "$IT"
exit
if [ "$1" == "help" ]
then
show_help
fi
if [ "$1" == "--help" ]
then
show_help
fi
/Applications/calibre.app/Contents/MacOS/ebook-convert $1 $2 --max-levels=1
【讨论】:
【参考方案11】:这里没有回答的另一种解决方案是使用 API。
它们的优势在于您可以将工作所需的资源外部化,并拥有实现最新功能的最新服务(无需更新代码或安装错误修复)。
例如,使用PDFShift,您可以通过以下位置的单个 POST 请求来做到这一点:
发布https://api.pdfshift.io/v2/convert/
并传递"source"
(URL 或原始HTML 代码),您将获得二进制PDF。 (免责声明:我在 PDFShift 工作)。
这是一个 Python 代码示例:
import requests
response = requests.post(
'https://api.pdfshift.io/v2/convert/',
auth=('user_api_key', ''),
json="source": "https://en.wikipedia.org/wiki/PDF", "landscape": False, "use_print": False
)
response.raise_for_status()
with open('wikipedia.pdf', 'wb') as f:
f.write(response.content)
您的 PDF 将位于 ./wikipedia.pdf
【讨论】:
【参考方案12】:这是一个易于安装的无头 Chrome 版本:
https://www.npmjs.com/package/chrome-headless-render-pdf
与“标准”无头 chrome 不同,它不会显示烦人的自动生成的页眉和页脚!
或者有unoconv
(在后台使用LibreOffice)可以从html制作pdf:
unoconv -f pdf mypage.html
您可以通过包管理器将它安装在大多数 Linux 版本上,例如apt-get install unoconv
这对于简单的文件来说既好又容易。如果您需要支持 css 的 javascript,请使用无头 Chrome。
【讨论】:
【参考方案13】:我已经开始整理tool 来为常见操作提供简化的界面。
您可以像这样将 HTML 转换为 PDF:
$ npm install @lancejpollard/act -g
$ act convert tmp/index.html -o tmp/index.pdf -w 2000px -h 3000px
这将为 HTML 文件创建一个新的 PDF。
如果不出意外,请查看源代码并了解如何编写自己的脚本以在 JavaScript 中执行此操作。
【讨论】:
【参考方案14】:wkhtmltopdf 和 wkhtmltoimage 是开源 (LGPLv3) 命令行工具,用于使用 Qt WebKit 渲染引擎将 HTML 渲染为 PDF 和各种图像格式。它们完全“无头”运行,不需要显示或显示服务。
如何使用?
下载预编译的二进制文件或从源代码构建 https://wkhtmltopdf.org/downloads.html
https://github.com/wkhtmltopdf/wkhtmltopdf
创建要转换为 PDF(或图像)的 HTML 文档
通过该工具运行您的 HTML 文档。
用法:wkhtmltopdf input.html output_name.pdf
【讨论】:
【参考方案15】:在使用Calibre 附带的ebook-convert
命令行工具时,我经常得到非常好的结果。
ebook-convert <input.html> <output.pdf>
检查manual 中的众多调整选项。例如,可以根据 H1
/H2
/... 标题(或基本上使用 XPath 表达式的任何内容)自动生成目录。
请注意:Calibre 专注于数字文档,我不知道 ebook-convert
对非常复杂的 HTML 的效果如何。不过值得一试。 :-)
【讨论】:
【参考方案16】:您可能想查看 Peernet 的“文档转换服务”(http://www.peernet.com/conversion-software/batch-document-converter/)。这在 Windows 桌面或 Windows Server 机器上作为服务运行。它在 Web 浏览器中打开 HTML 文档,然后通过打印驱动程序打印它们以创建 PDF 文档,这样生成的 PDF 文档看起来就像您从浏览器打印的 HTML 文档一样。
【讨论】:
以上是关于如何自动化 HTML 到 PDF 的转换?的主要内容,如果未能解决你的问题,请参考以下文章