如何自动执行 HTML 到 PDF 的转换



我已经使用 htmldoc 一段时间了,但我遇到了一些相当严重的限制。我需要最终解决方案来在 Linux 机器上工作。我将从Perl应用程序调用这个库/实用程序/应用程序,所以任何Perl接口都将是一个奖励。

很抱歉发现这篇旧帖子,但它在我寻找最佳 HTML/PDF 转换工具时首先出现。在Linux wkhtmltopdf上非常好(考虑了CSS等)和GPL。

WeasyPrint 可以生成带有可选文本和超链接的漂亮 PDF。

weasyprint input.html output.pdf

如果您改用wkhtmltopdf,请尝试以下选项:

wkhtmltopdf --margin-bottom 20mm --margin-top 20mm --minimum-font-size 16 ...

更新 2019-05

值得庆幸的是,整个过程已被TheCodingMachine打包到docker映像中:https://github.com/thecodingmachine/gotenberg

这使得在生产环境中维护和使用基于 chrome 的 pdf 生成非常顺畅和轻松。


自 Chrome 59 以来,有一种新的无头模式。由于所有其他解决方案确实难以使用较新的(或不再那么新的)CSS功能,例如flexbox,因此就我而言,这是生成正确PDF输出的唯一解决方案。

要从本地 html 文件创建 pdf,只需使用以下命令: chrome --headless --disable-gpu --print-to-pdf file:///path/to/myfile.html .

对于 Mac OS,chrome替换为 /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

到目前为止,我注意到的唯一缺点是(目前)您无法通过 stdin(ddin)传递 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)。

最好的办法是使用木偶师使用基于节点的方法 模块,如 https://developers.google.com/web/updates/2017/04/headless-chrome#node 中所述,并通过 Page.printToPDF 命令打印页面,该命令也启用一些额外的配置。

当然,您也可以从节点(即脚本)以外的任何其他环境连接到调试控制台 websocket.PHP。

注意:这个答案来自2008年,现在可能不正确;请检查其他答案

PrinceXML是我见过的最好的(它解析常规HTML和XML/XHTML)。怎么最好?好吧,它通过了 acid2 测试,我认为这非常令人印象深刻

然而,它相当昂贵

我为你做了一些谷歌搜索,想出了两个选项。 可能还有更多,我的谷歌策略是尝试"webkit 命令行pdf"和"壁虎命令行pdf",基本上是寻找在命令行渲染器中嵌入两种流行的开源渲染引擎的命令行程序。 这是我发现的:

火狐命令行打印机 - 输出为 pdf 和 png

WKPDF - 虽然这是针对Mac的,但它可能非常便携。

我不会声称这是"最佳"解决方案,但它是我使用的"一个"解决方案。

HTML 输入 --> HTML 2 PS -->

PS 2 PDF --> PDF 输出

您可以安装免费的 Calibre,并使用它拥有的 ebook-convert 命令行实用程序将许多 html 文档转换为单个 epub 或 pdf。

https://manual.calibre-ebook.com/generated/en/ebook-convert.html

想法来自这里

我没有使用它,但是这个npm模块像我下面的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

这完全是矫枉过正,但你可以下载并安装 mirth。 它是一个消息路由引擎,但它能够将 html 转换为 pdf,因此您可以将其设置为在文件夹中选取 html 文件,转换为 pdf,然后将 pdf 放在相同或其他文件夹中。 就像我说的,矫枉过正,有点学习曲线,但它是免费的,还有Java,所以如果你愿意,你可以在Linux上运行它。而你的perl应用程序所要做的就是将html放到一个文件中。

你应该看看 http://phantomjs.org/

转换可以通过一个小脚本栅格化来完成.js然后发出

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf

我发现Electroshot支持现代CSS功能,特别是布局。 这是在与wkhtmltopdf斗争之后,显示了它不支持CSS3之类的东西的年龄。

来自Electroshot的功能描述:

Electroshot使用Electron,它提供了Chrome的最新稳定版本(而不是几年前的版本);这意味着页面的呈现方式与在浏览器中一样。

我已经能够使用Bootstrap 4来设计一个页面,然后使用Electroshot来渲染一个非常类似于HTML/CSS的PDF。

这里没有回答的替代解决方案是使用 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

这是一个易于安装的无头Chrome版本:

https://www.npmjs.com/package/chrome-headless-render-pdf

与"标准"无头铬不同,这不会显示烦人的自动生成的页眉和页脚!

或者有unoconv(在幕后使用LibreOffice)可以从html制作pdf:

unoconv -f pdf mypage.html

您可以通过包管理器将其安装在大多数Linux版本上,例如 apt-get install unoconv

对于简单的文件来说,这很好,很容易。如果您需要 css 的 javascript,请使用无头 Chrome。

我已经开始整理一个工具,为常见操作提供简化的界面。

您可以将 HTML 转换为 PDF,如下所示:

$ npm install @lancejpollard/act -g
$ act convert tmp/index.html -o tmp/index.pdf -w 2000px -h 3000px

这将为 HTML 文件创建一个新的 PDF。

如果没有别的,请查看源代码,看看如何编写自己的脚本来在 JavaScript 中执行此操作。

wkhtmltopdf和wkhtmltoimage是开源(LGPLv3)命令行工具,使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。这些完全"无头"运行,不需要显示或显示服务。

如何使用?

  1. 下载预编译的二进制文件或从源代码构建https://wkhtmltopdf.org/downloads.html

    https://github.com/wkhtmltopdf/wkhtmltopdf

  2. 创建要转换为 PDF(或图像)的 HTML 文档

  3. 通过该工具运行您的 HTML 文档。

用法:wkhtmltopdf输入.html output_name.pdf

使用 Calibre 附带的 ebook-convert 命令行工具时,我经常得到非常好的结果。

ebook-convert <input.html> <output.pdf>

检查手册中的众多调整选项。例如,可以根据H1/H2/...标题(或任何使用 XPath 表达式的东西,基本上)。

请注意:Calibre 专注于数字文档,我不知道ebook-convert在非常复杂的 HTML 中效果如何。不过值得一试。:-)

您可能想查看 Peernet 的"文档转换服务"(http://www.peernet.com/conversion-software/batch-document-converter/)。 这在 Windows 桌面或 Windows Server 计算机上作为服务运行。 它在 Web 浏览器中打开 HTML 文档,然后通过打印驱动程序打印它们以创建 PDF 文档,以便生成的 PDF 文档看起来与您从浏览器打印 HTML 文档完全相同。

最新更新