【问题标题】:Converting HTML files to PDF [closed]将 HTML 文件转换为 PDF [关闭]
【发布时间】:2010-10-12 15:18:06
【问题描述】:

我需要从现有的 (X)HTML 文档中自动生成 PDF 文件。输入文件(报告)使用相当简单的基于表格的布局,因此可能不需要支持真正花哨的 JavaScript/CSS 内容。

由于我习惯于使用 Java,因此可以在 java 项目中轻松使用的解决方案更可取。不过,它只需要在 Windows 系统上运行即可。

一种可行的方法是使用CSS2XSLFO 和Apache FOP 来创建PDF 文件,但不会产生高质量的输出(至少开箱即用)。我遇到的问题是,虽然 CSS 属性转换得很好,但表格布局非常混乱,文本从表格单元格中流出。

我还快速浏览了 Jrex,这是一个用于使用 Gecko 渲染引擎的 Java-API。

有没有办法从 Internet Explorer 渲染引擎中获取渲染页面并将其自动发送到 PDF-Printer 工具?我没有在 Windows 中进行 OLE 编程的经验,所以我不知道什么是可能的,什么是不可能的。

你有什么想法吗?

【问题讨论】:

  • 我最近创建了一个 Java 库docbag,可以将 xhtml 转换为 pdf 文档。当前版本并不先进,但如果您的 xhtml 模板很简单,这个库可能会派上用场。
  • 我认为要走的路是使用浏览器功能进行翻译。见stackoverflow.com/q/25574082/39998
  • 我一直坚持从包含西里尔字母的 html 生成 pdf。一切都很好,除了省略的西里尔字母。有人遇到过这种问题吗?
  • @krisiliev:我也有类似的问题,据我所知,使用的字体非常重要。大多数字体不支持完整的 UTF8 字符,但以下应该:' font-family: Arial Unicode MS;' (CSS)。还要确保使用正确的编码(我建议始终使用 UTF-8)

标签: java html pdf pdf-generation


【解决方案1】:

Flying Saucer XHTML 渲染器项目支持将 XHTML 输出为 PDF。看一个例子here

【讨论】:

  • flying sauser的真正问题在于它使用itext渲染PDF,这是一个AGPL v3许可的lib
  • 飞碟使用的 itext 版本是 2.0.8,在 LGPL 下可用。只有版本号 5 或更高版本在更严格的许可证上。 stackoverflow.com/questions/2692000/…
  • 我想说飞碟的真正问题在于它需要格式良好且有效的 XML 文档。通过在您的 HTML 中包含类似“&”号之类的东西,或者一些使您呈现的 HTML 不是严格的 XHTML 的 javascript 代码,很容易在不知不觉中破坏 PDF 呈现。虽然这可以通过自动化测试或一些涉及 XML 验证的过程来缓解。
【解决方案2】:

你试过WKHTMLTOPDF吗?

它是一个简单的 shell 实用程序,是 WebKit 的开源实现。两者都是免费的。

我们设置了一个小教程here

编辑(2017 年):

如果要在今天建造一些东西,我不会再走那条路了。
但会改用http://pdfkit.org/
可能会剥离它所有的 nodejs 依赖项,以便在浏览器中运行。

【讨论】:

  • 对于直接的 html-page-to-pdf 转换,这比我见过的任何其他东西都要好,无论是免费的还是商业的。
  • 它可以在非 Mac OS 上运行吗?
  • @Eran,我们在 linux 上使用它。我想也有windows版本
  • @Mic 是的,也有 Windows 版本。
  • 在 windows XP(0.9.9 版)上测试并且运行良好。此外,安装不需要机器上的管理员权限。
【解决方案3】:

查看iText;它是一个纯 Java PDF 工具包,支持从 HTML 读取数据。我最近在一个项目中使用它,当我需要从我们的 CMS 中提取内容并导出为 PDF 文件时,这一切都相当简单。对 CSS 和样式标签的支持非常有限,但它确实可以毫无问题地呈现表格(尽管我从未设法设置列宽)。

从 HTML 创建 PDF 是这样的:

Document doc = new Document(PageSize.A4);
PdfWriter.getInstance(doc, out);
doc.open();
HTMLWorker hw = new HTMLWorker(doc);
hw.parse(new StringReader(html));
doc.close();

【讨论】:

  • 它是 AGPL,看起来比 GPL 还要糟糕,即使你只提供 PDF 并且 iText 是服务器端,你也需要开源。
  • @Eran,请使用最后一个非 AGPL 版本(Maven 中的 com.lowagie:itext:2.1.7)。
  • HTMLWorker 在较新版本的 IText 中被弃用,取而代之的是 XMLWorker;然而,这两种情况下的 CSS 支持都很差(请参阅demo.itextsupport.com/xmlworker/itextdoc/…),并且不足以满足我的需求。相反,飞碟是完美的。
  • 你可以使用 LGPL 版本,可以在github.com/albfernandez/itext2找到
  • HTMLWorker 支持非常简单的 HTML 文档,只有基本元素,没有 CSS。它太有限而没有用处。但是最近的 iText html2pdf 真的很棒kb.itextpdf.com/home/it7kb/ebooks/…
【解决方案4】:

如果你有资金,没有什么比 Prince XMLthis video shows 更好的了

【讨论】:

  • 如果您正在为 Prince 寻找更便宜的替代品,请尝试 DocRaptor.com。它使用 Prince 作为引擎。
  • 如果你想更便宜,但有更多选择,试试htm2pdf.co.uk - 它使用webkit和用户真正的所见即所得
【解决方案5】:

有没有办法抓住 来自互联网的渲染页面 资源管理器渲染引擎并发送它 自动到 PDF-Printer 工具?

这就是 ActivePDF 的工作原理,这意味着您知道自己会得到什么,而且它实际上具有合理的样式支持。

它也是我发现的少数几个真正支持各种分页 CSS 命令的软件包之一(几年前)。


不幸的是,ActivePDF 软件非常令人沮丧 - 因为它必须在后台启动 IE 浏览器才能进行转换,它可能非常慢,而且也不是特别稳定。

目前有一个新版本处于测试阶段,应该会更好,但我实际上没有机会尝试,所以不知道它有多大改进。

【讨论】:

  • 感谢您的帮助。我不认为 ActivePDF 真的很合适,因为它的价格,但很高兴知道有这样的东西存在。
  • GrabzIt's HTML to PDF API: grabz.it/html-to-pdf-image-api.aspx 工作方式与在浏览器中呈现 HTML 然后创建 PDF 相同,这确保了更准确的 PDF 转换。
【解决方案6】:

您可以使用带扩展程序的无头 Firefox。跑步很烦人,但确实会产生很好的效果。

查看this answer 了解更多信息。

【讨论】:

  • 如果需要并行地将页面动态转换为 pdf,这听起来不像是一个非常可扩展的解决方案。如果通过一些请求导致使用 FF 进行转换,那么您的服务器将丢失一些 GIG 内存来提供一些转换后的页面。这会将您的服务器打开到 DOS。
  • 更好但相似:github.com/ariya/phantomjs/wiki/Screen-Capture(根据we-love-php.blogspot.com/2012/12/… pdf 具有真实文本,未光栅化)
【解决方案7】:

如果您查看问题的侧边栏,您会看到许多相关问题...

在您的上下文中,更简单的方法可能是安装 PDF 打印驱动程序,如 PDFCreator,然后将页面打印到此输出。

【讨论】:

  • 这是一个 Java 解决方案吗?这是一个 Windows 打印驱动程序。
  • OP 明确提到了 Windows。我想其他系统也有类似的驱动程序。 OP 只提到 Java 作为一种可能的解决方案......
【解决方案8】:

Amyuni WebkitPDF 可以与 JNI 一起用于仅限 Windows 的解决方案。这是一个 HTML 到 PDF/XAML 的转换库,可免费用于商业和非商业用途。

如果不立即需要输出文件,为了获得更好的可扩展性,最好有一个队列和一些后台进程从那里获取项目、转换它们并存储在数据库或文件系统上。

通常的免责声明适用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-05
    • 2010-10-31
    • 2016-12-19
    • 2011-10-29
    • 2010-09-26
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多