将HTML文件转换为PDF


128

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

由于我习惯于使用Java,因此最好使用可以轻松地在Java项目中使用的解决方案。不过,它仅需要在Windows系统上工作。

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

我还快速浏览了使用Gecko渲染引擎的Java API Jrex。

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

你有好主意吗?


3
我最近创建了一个Java库docbag,可以将xhtml转换为pdf文档。当前版本没有任何高级功能,但是如果您的xhtml模板很简单,则该库可能会派上用场。
雅各布·托比奇

我认为要走的路是使用浏览器功能进行翻译。参见stackoverflow.com/q/25574082/39998
David Hofmann 2014年

我坚持从包含西里尔字母的html生成pdf。一切都很好,除了西里尔字母被省略。有人遇到这种问题吗?
Kristijan Iliev 2015年

@krisiliev:我有类似的问题,据我所记得,所使用的字体非常重要。大多数字体不支持完整的UTF8字符,但以下字符应:'font-family:Arial Unicode MS;' (CSS)。还要确保使用正确的编码(我建议始终使用UTF-8)
panschk 2015年

Answers:


73

飞碟 XHTML渲染项目具有输出XHTML到PDF的支持。在这里看看一个例子。


20
飞行sauser的真正问题在于它使用itext来呈现PDF,这是AGPL v3许可的库
David Hofmann

11
飞碟使用的itext版本是2.0.8,可在LGPL下获得。限制性更强的许可证上仅包含版本号5或更高版本。 stackoverflow.com/questions/2692000/…–
加里

8
我想说的是飞碟的真正问题在于它需要一个格式正确且有效的XML文档。通过在HTML中包含“&”符号或某些使您渲染的HTML并非严格的XHTML的JavaScript代码,很容易在不知不觉中破坏PDF渲染。尽管可以通过自动测试或某些涉及XML验证的过程来缓解这种情况。
史蒂夫·

3
@LateralFractal据我所知,Flying Saucer 9.0.8(我认为是最新版本)使用iText 2.1.7,这是具有许可许可的最新iText版本-LGPL。mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/...
乔纳森Crosmer

2
@JonathanCrosmer是的。有两个用于PDF的FlyingSaucer软件包,一个用于iText v2,一个用于iText v5。假设两者具有相同的功能;AGPL风险可以回避。
LateralFractal 2013年

49

您尝试过WKHTMLTOPDF吗?

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

我们在这里设置了一个小教程

编辑(2017):

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


16
对于直接的html页面到pdf的转换,这比我见过的其他任何免费或商业版本都好。
MGOwen

它可以在非Mac OS上运行吗?
伊兰·麦丹

1
@Eran,我们在Linux上使用它。我觉得有一个Windows版本太多
麦克

1
@Mic是的,也有Windows版本。
维卡里(Viccari)2012年

在Windows XP(0.9.9版)上进行了测试,效果很好。另外,不需要在计算机上具有管理员权限即可安装。
Christopher Mahan

44

查看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();

9
它是AGPL,似乎比GPL更糟,即使您只提供PDF并且iText是服务器端,您也必须是开源的。
伊兰·麦丹

10
@Eran,只需使用最后一个非AGPL版本(Maven中的com.lowagie:itext:2.1.7)。
Nowaker 2011年

1
较新版本的IText中不推荐使用HTMLWorker,而推荐使用XMLWorker。但是,在这两种情况下,CSS支持都很差(请参阅demo.itextsupport.com/xmlworker/itextdoc/…),并且不足以满足我的需求。相反,飞碟是完美的。
皮诺

您可以使用LGPL版本,该版本可在github.com/albfernandez/itext2
Vladimir Rozhkov


3

有没有办法从Internet Explorer渲染引擎中获取渲染的页面并将其自动发送到PDF打印机工具?

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

这也是我发现的(实际上是几年前)为数不多的实际上支持各种分页符CSS命令的软件包之一。


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

Beta中目前有一个新版本,应该会更好,但是我实际上没有机会试用它,所以不知道它有多少改进。


感谢您的帮助。由于价格原因,我认为ActivePDF并不真正合适,但是很高兴知道存在类似的东西。
panschk,2009年

GrabzIt的HTML to PDF API:grabz.it/html-to-pdf-image-api.aspx的工作方式与在浏览器中呈现HTML,然后创建PDF的方式相同,从而确保了更多准确的PDF转换。
user1474090

2

您可以使用带有扩展名的无头Firefox。开始运行很烦人,但确实产生了很好的效果。

查看此答案以获取更多信息。


如果需要将运行中的页面并行转换为pdf,这听起来不是一个非常可扩展的解决方案。如果通过几个请求而导致使用FF进行转换,则您的服务器将失去一些GIG内存,仅用于服务几个转换后的页面。这会将您的服务器打开到DOS。
mP。

更好但类似:github.com/ariya/phantomjs/wiki/Screen-Capture(根据we-love-php.blogspot.com/2012/12/…pdf具有真实文本,未栅格化)
nafg

0

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

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


这是Java解决方案吗?这是Windows打印驱动程序。
灰色

OP明确提到Windows。我想其他系统也有类似的驱动程序。OP仅提到Java作为可能的解决方案...
PhiLho

0

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

如果不需要立即使用输出文件,则为获得更好的可伸缩性,最好有一个队列和一些后台进程从中取出项目,然后将它们转换并存储在数据库或文件系统上。

通常免责声明适用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.