将HTML + CSS转换为PDF [关闭]


1628

我有一个HTML(不是XHTML)文档,可以在Firefox 3和IE 7中很好地呈现。它使用相当基本的CSS对其进行样式设置,并在HTML中很好地呈现。

我现在正在寻找一种将其转换为PDF的方法。我努力了:

  • DOMPDF:表格有很大的问题。我考虑了我的大型嵌套表并对其进行了帮助(在此之前,它只消耗了128M的内存然后就死了-这就是我对php.ini中的内存的限制),但它使表完全混乱,并且似乎没有得到图片。表格只是基本的东西,带有一些边框样式,以便在各个点添加一些线条。
  • HTML2PDF和HTML2PS对此我确实比较幸运。它呈现了一些图像(所有图像都是Google Chart URL),并且表格格式要好得多,但是似乎存在一些复杂性问题,我还没有弄清楚,并且一直死于未知的node_type()错误。不知道从这里去哪里;和
  • Htmldoc:这似乎在基本HTML上可以正常工作,但是几乎不支持CSS,因此您必须使用HTML进行所有操作(我没有意识到在Htmldoc-land仍然是2001年……),所以对我来说毫无用处。

我尝试了一个名为Html2Pdf Pilot的Windows应用程序,该应用程序实际上做得相当不错,但是我需要的东西至少要在Linux上运行,并且最好在Web服务器上通过PHP按需运行。

我缺少什么,或者如何解决此问题?


9
Html2Pdf实际上使用IE的嵌入式实例来呈现页面,然后将其转换为PDF(可能是通过IE的打印机制)。
乔尔·穆勒

55
由于这是2008年的问题,因此dompdf现在更加成熟。;-)
Hendra Uzia 2011年

5
dompdf现在支持CSS 2.1,可以处理@import@media@screen规则,并将加载外部样式表。它也捆绑了它正常工作所需的一切,尽管您可以安装某些东西来获得比默认库更好的性能。code.google.com/p/dompdf
totallyNotLizards,2012年

6
2015年更新:经过大量研究,我们决定使用wkhtmltopdf这个不错的实用程序,因为我们拥有外部CSS文件,因此我们在CSS方面遇到了麻烦,但是我们应用了将CSS的虚链接放在我们想要的HTML元素上的技巧转换并设置正确的路径,就像MAGIC一样!
Anshul Nigam 2015年

10
我相信不久以后,每个人都会发现Chrome / Chromium无头之chrome --headless --print-to-pdf="path/to/pdf" https://your_url 作是功能最丰富,最快,最简单的html到pdf生成工具crbug.com/603559,因为它支持开发人员依赖于Web开发的大多数html功能,并且不会像其他大多数工具一样吸收复杂的脚本库和工具。
伊布

Answers:


551

重要提示: 请注意,此答案写于2009年,可能不是今天的2019年最具成本效益的解决方案。如今,在线替代方案要比那时更好。

您可以使用以下一些在线服务:


看看PrinceXML

尽管它不是免费的,但它绝对是最好的HTML / CSS到PDF转换器(但是,您的编程也可能不是免费的,所以如果它为您节省了10个小时的工作,则您可以在家中免费使用(因为您还需要考虑到替代解决方案将需要您使用正确的软件来设置专用服务器)

哦,是的,我是否提到这是第一个(可能也是唯一)具有完整ACID2的 HTML2PDF解决方案?

PrinceXML示例


16
我的公司写了一个围绕Prince建立的Web服务。前期费用便宜得多,而且无需安装任何东西即可使用:docraptor.com
Joel Meador

6
我也使用了DocRaptor。无需支付昂贵的许可证即可获得Prince好处的绝佳方法。恭喜乔尔,他的产品很棒。
Nate365

22
方式太贵了。WKHTMLTOPDF(请参阅其他答案)是免费的,可完成的工作并使用了很棒的webkit。
thomallen

1
只需花费一小部分价格就能获得质量相同或更好的Saas服务-请参阅htm2pdf.co.uk
user1914292 2013年

5
如果您具有命令行访问权限并且不想支付$ 3500,请使用以下脚本编写PhantomJS:github.com/ariya/phantomjs/blob/master/examples/rasterize.js可能是一个解决方案-这是一种免费,简便的方法!
chjortlund 2014年

666

看一看wkhtmltopdf。它是开源的,基于webkit且免费。

我们在这里写了一个小教程。

编辑(2017):

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


10
这是在IMO的最佳前提下运行的。从现有渲染器进行Boostrap转换,而不是从头开始编写-不是一件容易的事。此外,Webkit是用C ++编写的,因此比基于PHP的实现要快得多,而且所占用的资源也少得多。
Koobz 2010年

3
尝试使此字体正确渲染CentOS服务器时,我们遇到了很大的问题。经过数周的混乱之后,似乎唯一的选择就是不使用CentOS。
Abhi Beckert

1
警告!如果您使用wkhtmltopdf(至少在我的系统上,在Windows 7 64位系统上为XAMPP),在所有尝试的情况下,.gif图像都不会出现在PDF文件中。我尝试了在不同地方建议的多种解决方法,例如“ width”和“ height”,并根据不同的约定编写URI。我从未尝试过使.gif出现(特别是甚至没有“ width”和“ height”建议,我尝试使用内联样式以及陈旧的原始“ width”和“ height” HTML属性)。但是,将图像交换为.jpg的方法是第一次尝试。
Dan Nissenbaum 2011年


1
商业服务对我们来说太昂贵了,因此我们将WKHTMLTOPDF实施为免费的云服务html2pdfrocket.com,供任何人使用,然后将其自己用于我们的客户。我们这样做是为了让我们的客户不必在服务器等上安装exe即可跨平台工作。如果您要构建自己的服务,我绝对会对WKHTMLTOPDF进行评分。
eagle779 2014年

150

经过一番调查和一般的梳理,该解决方案似乎是HTML2PDFDOMPDF在表格,边框,甚至是相当复杂的布局方面做得很糟糕,而htmldoc似乎相当健壮,但几乎完全不了解CSS,并且我不想只为该程序返回没有CSS的HTML布局。

HTML2PDF看起来是最有前途的,但是我仍然遇到关于node_type的空引用参数的奇怪错误。我终于找到了解决方案。基本上,PHP 5.1.x可以在任何大小的字符串上使用正则表达式替换(preg_replace_ *)正常工作。PHP 5.2.1引入了一个名为pcre.backtrack_limit的php.ini配置指令。此配置参数的作用是限制匹配的字符串长度。为什么不介绍这个原因。默认值选择为100,000。为什么价值这么低?再次,不知道。

为此针对PHP 5.2.1提出了一个错误,错误仍在将近两年后开放。

令人震惊的是,当超出限制时,替换只是默默地失败了。至少如果引发并记录了错误,您将对发生的情况,原因以及为解决此问题而需要进行的更改有所说明。但不是。

因此,我有一个70k的HTML文件可以转换为PDF。它需要以下php.ini设置:

  • pcre.backtrack_limit = 2000000; #可能超出了我的需求,但是可以
  • memory_limit = 1024M; 是的,一千兆字节;和
  • max_execution_time = 600; #是,10分钟

现在,精明的读者可能已经注意到我的HTML文件小于100k。我能猜出为什么会遇到这个问题的唯一原因是html2pdf在此过程中进行了向xhtml的转换。也许这使我接任(尽管近50%的膨胀似乎很奇怪)。无论如何,以上都是可行的。

现在,html2pdf是一个资源消耗。我的70k文件大约需要5分钟,并且至少需要500-600M的RAM才能创建35页的PDF文件。不幸的是,到目前为止,下载速度不够快(到目前为止),并且内存使用率使内存使用率处于1000到1的顺序(70k文件的RAM为600M),这是非常荒谬的。

不幸的是,这是我想出的最好的方法。


1
@cletus您能告诉我有关HTML2PDF的稳定版本的信息。上面的链接示例已弃用
Ripa Saha 2013年

有关最新版本,请参见github.com/spipu/html2pdf
Luke Wenke

1
严峻的错字变得更加严峻:内存使用率大约是10,000比1大声笑
MickLH

作品一样糟糕的MPDF ...快,但不能精确...和转换TTF字体是令人难以置信的痛苦......他们甚至有独立的图书馆“TC-LIB-PDF的字体”刚刚生成的字体
马丁Zvarík

125

为什么不尝试使用mPDF 2.0版?我用它来创建PDF文档。工作正常。

同时,与HTML2PS / HTML2PDF相比,mPDF的版本为5.7,并且正在积极维护

但是请记住,该文档确实很难处理。例如,查看以下页面:https : //mpdf.github.io/

这个库可以完成从html到pdf的非常基本的任务,但是更复杂的任务将需要一些时间来阅读和“理解”文档。


1
我在这里尝试了一堆建议的方法。到目前为止,这个文档已经上传并可以立即使用,没有任何麻烦,与其他文档相比,这些文档确实很棒。使用说明写得清楚。
Smith Smithy 2013年

当发布带有图像背景或数据库标签的html标签时,mPDF给我带来了一些严重的麻烦:mPDF error: IMAGE Error (http://www.example.com/folder/image.jpg): Error parsing image file - image type not recognised, and not supported by GD imagecreate
Stefan

版本6.0可以按预期工作:实例化它(或在框架中加载),实例化,填充内容,以某种方式输出...就这样!
toesslab 2015年

好吧,MPDF正常工作!但是代码和文档并不一致-很难完成更复杂的任务,例如创建有关din-norm的字母。
Qullbrune 2015年

声称它比html2fpdf慢很多。但是对于基本内容,我认为速度非常快(发票,报告等)。mPDF的巨大优点是几乎没有任何PHP扩展要求(在共享主机上开箱即用)
Joao

70

1)使用MPDF

a)提取 yourfolder

b)中创建file.phpyourfolder和插入这样的代码:

<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p style="color:red;">Hallo World<br/>Fisrt sentencee</p>');
$mpdf->Output();   exit;
 ?>

c)从浏览器打开file.php




2)使用pdfToHtml

1)解压缩pdftohtml.exe到您的根文件夹中:

2)在该文件夹内的anyfile.php文件中,放置以下代码(假设也有一个源example.pdf):

<?php
$source="example.pdf";
$output_fold="FinalFolder";

    if (!file_exists($output_fold)) { mkdir($output_fold, 0777, true);}
$result= passthru("pdftohtml $source $output_fold/new_filename",$log);
//var_dump($result); var_dump($log);
?>

3)输入FinalFolder,然后将有转换后的文件(与源PDF一样多的页面。)


我会尝试GrabzIt,他们的API支持CSS,JavaScript和大多数其他资源类型。只需使用绝对URL进行引用,或将其内联并包含在发送给服务的HTML中。在此处尝试:grabz.it/html-to-pdf-image-api.aspx

GrabzIt不是免费的
Chatoxz


32

只是为了打破话题,我尝试了DOMPDF,它运行得非常好。我使用过DIV其他块级元素来放置所有内容,我严格将其保留为CSS 2.1,并且播放效果非常好。


31

我建议使用DocRaptorPrinceXML用作“引擎”)


不幸的是,如果要生成包含大量图像的大型PDF文件,则无法使用。我认为请求有60秒的时限,如果Docraptor需要下载很多文件,则将超出此限制,并且将不创建任何文件。
Vilhelm

1
Vilhelm提到的此问题已修复。
illbzo1 2011年

30

已经提到过了,但是我想确认一下mpdf是那里最简单,最强大和最免费的HTML到pdf转换器。天空真的是极限。您甚至可以生成动态的,用户生成的数据pdf。

例如,一个客户想要一个CMS系统,以便他可以更新他在俱乐部播放的音乐的曲目列表。那没问题,但他还希望用户能够下载播放列表的.pdf,因此必须由cms更新此可下载的pdf。多亏了mpdf,有了一些简单的循环和散布的变量,我才能做到这一点。我原本以为要花上几周的时间花了我几分钟。

很棒的文章帮助我入门。


7
播放列表的PDF。神救救我。
Henrik Erlandsson '18


26

好吧,如果您想找到一个完美的XHTML + CSS到PDF转换器库,那就算了。这是不可能的。因为就像找到一个完美的浏览器(XHTML + CSS渲染引擎)一样。我们有一个吗?IE或FF?

我在DOMPDF方面取得了一些成功。事实是,您必须修改HTML + CSS代码以配合该库的工作方式。除此之外,我还有不错的成绩。

见下文:

原始HTML

将HTML转换为PDF


25

HTML2PDF和html2ps的最初在开幕帖子中提到的在谈论2009年的包装这个环节

但是有更好的HTML2PDF

它基于TCPDF,尽管部分使用法语。

您可以使表的页眉或页脚在页面上重复,并具有页码和总页数。查看其示例。我已经使用了三年多,并推荐它。


1
为什么这不是最重要的?它的工作原理没有任何额外的依赖性,并且对于大多数人的应用程序来说已经足够好了,而无需花费3800美元!
退化

22

我正在使用fpdf使用PHP生成PDF文件。到目前为止,对我来说,生成简单的输出效果很好。



16

尝试获取最新的每晚 dompdf版本-我使用的是旧版本,这是非常糟糕的资源消耗,并且花了我很多时间才能呈现pdf。从这里抢了一个晚上

生成PDF只花了几秒钟的时间,并且与PrinceXML / Docraptor一样好呈现。自从我上次使用它以来,似乎他们已经认真优化了dompdf代码!


dompdf确实是一个不错的选择。我已经用过两次了,这很容易。我建议尝试dompdf。这是官方github存储库的链接:github.com/dompdf/dompdf
Rituparna sonowal

16

达里尔·海因(Darryl Hein)在上面提到的TCPDF可能是一个好主意。Nicola Asuni的代码非常方便且强大。唯一的杀手是,如果您计划将PDF文件与生成的PDF合并,则不具备这些功能。您将必须创建PDF,然后使用Sid Steward(www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)的PDFTK将其合并。


13

就成本而言,在许多情况下使用Web服务(API)可能是更明智的方法。另外,通过外包此过程,您可以减轻自己的基础架构/后端负担,并且-如果您使用的是信誉良好的服务-确保与调整Web标准,正常运行时间,较短的处理时间和快速的内容交付兼容。

我已经对当前市场上的大多数Web服务进行了一些研究,请在下面找到我觉得值得在此线程上提及的API,这些API以价格/价值比为基础进行排序。它们都提供了预先编写的PHP类和软件包。

  1. pdflayer.com-费用:$-质量:☆☆☆☆
  2. docraptor.com-成本:$$ -质量:☆☆☆☆☆
  3. pdfcrowd.com-费用:$$-质量:☆☆☆

质量:

以高质量的引擎PrinceXML为骨干,DocRaptor显然可以提供最佳的PDF质量,返回高度抛光和经过良好转换的PDF文档。但是,pdflayer API服务在这里非常接近。Pdfcrowd不一定以质量得分,而是以处理速度得分。

成本:

pdflayer.com-如上所述,此处最具成本效益的选择是pdflayer.com,它为100个每月的PDF提供完全免费的订阅计划,高级订阅的价格在9.99美元至119.99美元之间。每月10,000个PDF文档的价格为$ 39.99。

docraptor.com-提供7天的免费试用期。高级订阅计划的价格从15美元到2250美元不等。每月10,000个PDF文档的价格约为$ 300.00。

pdfcrowd.com-免费提供一次 100个PDF 。高级订阅计划的价格从$ 9- $ 89不等。每月10,000个PDF文档的价格约为$ 49.00。

我已经用完了所有这三个功能,而本文旨在帮助任何人做出决定,而不必为所有这些功能付费。撰写本文并非认可任何一种产品,我与任何一种产品均无从属关系。


感谢您的分享。我整天都在调查所有选项,并且更多地关注免费库或购买库。您的回答再次帮助我。对于小型企业,这是使用Web服务的经济有效的方法,也是最简单的方法。对于pdflayer.com; 不到100美元/年,收支平衡需要20或30年,但我不认为20年后我们会离开同一个世界:)
自由意志

12

如果你有机会到命令行有可能使用PhantomJS创建PDFURL(远程或本地)。

它确实运行良好,并且是免费的解决方案。

看一下为这个确切问题制作的示例脚本。


但您可能会遇到一些字体(webfonts)问题
Mihai Crăiță 18'Apr

11

这个问题已经很老了,但是还没有人提到CutyCapt,所以我会:)

卡蒂·卡普特

CutyCapt是一个小型跨平台命令行实用程序,用于将WebKit的网页呈现捕获为各种矢量和位图格式,包括SVG,PDF,PS,PNG,JPEG,TIFF,GIF和BMP



9

我不认为php类是用CSS渲染xHtml页面的最佳选择。

新的CSS规则出台后会发生什么?(很快的CSS 3.0 ...)

显然,呈现html页面的最佳方法是浏览器。Firefox 3.0可以原生以pdf格式进行“打印”,因此开发了扩展(命令行打印)来使用它。在这里您会找到它。

无论如何,仍然有很多问题runninr firefox 只是作为一个PDF转换...

此刻,我认为wkhtmltopdf是最好的(safari浏览器使用的),速度快,快,棒。是的,还有开源... 看看


如果您要输出某种类型的官方文档(例如,给用户的收据),并且可以使用CSS使其美观,则PHP很有用。
路加·温克

9

我开发了一个公共API,用于从网页构建PDF文件。它有一个很好的PHP客户端类,使其非常易于使用。它使用wkhtmltopdf将PDF呈现在云中。

HTML不需要任何特殊的东西。在images / css / js链接中不需要绝对URL。也可以在本地主机(开发计算机)上工作。

目前,该服务在4个Azure区域具有终结点:美国东部,美国西部,欧盟北部,东南亚。

由于它使用专有协议将网页内容发送到API以转换为PDF,因此速度很快。

这是可靠的,因为所有端点都是负载平衡的。

免费帐户可用于测试或低使用率。网站上的详细信息:

https://rotativahq.com


8

也许您可以在将文件交给转换器之前尝试使用Tidy。如果某个渲染器在某些HTML问题(例如未关闭的标签)上感到窒息,则可能会有所帮助。


是的,这是一个有效的观点,但我已经想到了这一点。我的HTML中没有匹配或非标准的标记。
cletus

7

精细渲染没有任何意义。可以验证吗?

无论输入有多糟糕,所有浏览器都将尽其所能在屏幕上显示某些内容。当然,他们不会做同样的事情。如果您想要与FireFox相同的渲染,则可以使用其渲染引擎。有PDF生成器。但是,这是一项艰巨的工作。


7

尽管已经提供了许多解决方案,但我还是建议以下两种:

  1. HTM2PDF-提供了将HTML转换为PDF的API,还提供了PHP SDK,这使得在PHP中实现起来非常容易。它提供了在欧洲,亚洲和美国的服务器位置选择
  2. PDFmyURL-提供了一个API,该API也可以将URL和HTML转换为PDF,其功能与HTM2PDF大致相同,但是可以在负载平衡的环境下工作,并且已经使用了更长的时间

这两个API与前面提到的所有解决方案的不同之处在于-除了使用CSS和JavaScript将HTML转换为PDF外,它还提供PDF权限管理,水印和加密。因此,对于那些想要踏踏实实地工作的人来说,这是一个一体化的解决方案。

免责声明:我为Kaiomi(一家同时经营这两个网站的公司)工作。


我不想依靠一项待售的服务。考虑到它在那场拍卖中没有出售,我只能假设它会在不久的将来出售?
罗宾·范·巴伦

其实我的公司收购了它在拍卖后一段时间....
user1914292

在这种情况下,我想没有什么可担心的。
罗宾·范·巴伦


5

TCPDF可以正常工作,没有依赖关系,是免费的,并且经常被修正。如果提供的HTML / CSS内容格式正确,则速度合理。我通常会生成50-300 kB的HTML输入(包括CSS),并在1-3秒内获得10-15 PDF页面的PDF输出。

我强烈建议在将任何内容发送到TCPDF之前,将整洁的库用作HTML漂亮的格式化程序。


4

我已经尝试了许多不同的PHP库。我尝试过的所有清单。在我看来,TCPDF库是最佳的性能/可用性折衷方案。安装和使用非常简单,在中小型应用程序中也具有良好的性能。如果您需要高性能和非常大的PDF文档,请使用Zend_PDF模块,但准备好进行编码!


Zend PDF无法从HTML转换
MartinZvarík'18

3

网络API

如果有人总是在搜索此类内容,则有一个免费的网站,可让您将html代码和页面转换为pdf。还有一个(很小)的api,可让您从网址获取pdf文件。

在这里检查


2

PHP,而是Java,它可以完成以下任务:

飞碟采用XML或XHTML并对其应用CSS 2.1兼容的样式表,以便呈现为PDF

它可以通过PHPsystem()或类似的调用在PHP中使用。尽管它要求XML的格式正确input

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.