48

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

4

16 回答 16

73

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

于 2010-05-07T09:29:01.700 回答
23

WeasyPrint 可生成带有可选文本和超链接的精美 PDF。

weasyprint input.html output.pdf

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

wkhtmltopdf --margin-bottom 20mm --margin-top 20mm --minimum-font-size 16 ...
于 2016-04-28T20:24:30.133 回答
17

2019-05 更新

谢天谢地,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 OS 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 )。

最好的办法是使用基于节点的方法,使用https://developers.google.com/web/updates/2017/04/headless-chrome#node下记录的 puppeteer 模块,并通过 Page.printToPDF 打印页面命令,它也启用了一些额外的配置。

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

于 2017-08-14T09:20:51.893 回答
8

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

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

然而,它相当昂贵

于 2008-10-07T01:54:16.393 回答
7

我为你做了一些谷歌搜索,并提出了两个选择。可能还有更多,我的google策略是尝试“webkit command-line pdf”和“gecko command-line pdf”,基本上是在寻找在命令行渲染器中嵌入两个流行的开源渲染引擎的命令行程序。这是我发现的:

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

wkpdf - 虽然这适用于 mac,但它可能非常便携。

于 2008-10-07T01:38:58.063 回答
3

我不会声称这是“最好的”解决方案,但它是我使用过的“一个”解决方案。

HTML 输入 --> HTML 2 PS --> PS 2 PDF --> PDF 输出

于 2008-10-06T22:40:36.630 回答
1

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

于 2008-10-06T22:45:45.590 回答
1

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

转换可以通过一个小脚本rasterize.js然后发出

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
于 2015-03-29T21:58:30.500 回答
1

我发现Electroshot支持现代 CSS 功能,尤其是布局。这是在 wkhtmltopdf 在不支持 CSS3 之类的东西方面显示其年龄的挣扎之后。

来自 Electroshot 的功能描述:

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

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

于 2018-09-18T22:02:10.150 回答
1

您可以安装免费的 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
于 2019-03-31T00:49:54.383 回答
1

此处尚未回答的另一种解决方案是使用 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

于 2019-04-09T11:54:13.680 回答
0

这是一个很好的易于安装的无头 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。

于 2020-04-07T22:31:04.367 回答
0

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

您可以像这样将 HTML 转换为 PDF:

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

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

如果不出意外,请查看源代码并了解如何编写自己的脚本以在 JavaScript 中执行此操作。

于 2020-07-23T02:41:30.730 回答
0

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

如何使用它?

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

    https://github.com/wkhtmltopdf/wkhtmltopdf

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

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

用法:wkhtmltopdf input.html output_name.pdf

于 2020-12-27T07:31:58.043 回答
0

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

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

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

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

于 2021-04-10T13:25:20.173 回答
-1

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

于 2014-03-04T17:30:48.317 回答