使用PHP将HTML + CSS转换为PDF?

好的,我现在正在用这个砖头撞墙。

我有一个HTML(而不是XHTML)文档,在Firefox 3和IE 7中呈现良好。它使用相当基本的CSS来设置样式,并在HTML中呈现良好。

我现在把它转换成PDF格式。 我努力了:

  • DOMPDF :它有很大的表格问题。 我分解了我的大嵌套表,它有帮助(之前它只消耗128M的内存然后死亡 – 这是我在php.ini内存的限制),但它使表的一个完整的混乱,似乎并没有得到图片。 这些表格只是基本的东西,有些边框样式可以在不同的点上添加一些线条;
  • HTML2PDF和HTML2PS :我其实有更好的运气。 它呈现了一些图像(所有的图像是谷歌图表url)和表格格式更好,但它似乎有一些复杂性的问题,我还没有想出来,并不断地死于未知的node_type()错误。 不知道该从哪里走 和
  • Htmldoc :这对于基本的HTML似乎工作得很好,但几乎不支持CSS,所以你必须用HTML做所有事情(我还没有意识到它仍然是2001年在Htmldoc-land中),所以对我来说是没用的。

我尝试了一个名为Html2Pdf Pilot的Windows应用程序,实际上做了一个相当不错的工作,但我需要的东西至less在Linux上运行,理想情况下通过Web服务器上的PHP按需运行。

我真的不能相信我这个卡住了。 我错过了什么吗?

看看PrinceXML 。

这绝对是最好的HTML / CSS到PDF转换器,虽然它不是免费的(但是,嘿,你的编程也可能不是免费的,所以如果它节省了你10个小时的工作,你是免费的(因为你也需要考虑到替代解决scheme将要求您使用正确的软件安装专用服务器)

哦,是的,我提到,这是第一个(也可能是唯一的)完全ACID2的 HTML2PDF解决scheme吗?

PrinceXML示例

脚注:请注意,这个答案是在2009年编写的,它可能不是今天在2017年最具成本效益的解决scheme。浏览器和其他开源渲染器在这方面比现在好得多。

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

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

编辑(2017):

如果今天要build造一些东西,我就不会再走这条路了。
但是会使用http://pdfkit.org/代替。
可能将它的所有nodejs依赖关系剥离,在浏览器中运行。

经过一番调查和一般的拉动解决scheme似乎是HTML2PDF 。 DOMPDF在表格,边界和适度复杂的布局方面做得非常糟糕, htmldoc看起来相当健壮,但几乎完全是CSS,我不想回到没有CSS的HTML布局,只是为了这个程序。

HTML2PDF看起来是最有希望的,但是我一直对node_type的空引用参数有这个奇怪的错误。 我终于find了解决办法。 基本上,PHP 5.1.x正常工作正则expression式replace(preg_replace_ *)任何大小的string。 PHP 5.2.1引入了一个名为pcre.backtrack_limit的php.iniconfiguration指令。 这个configuration参数的作用是限制匹配完成的string长度。 为什么这是介绍我不知道。 默认值被选为100,000。 为什么这么低的价值? 再次,不知道。

PHP 5.2.1提出了一个漏洞,这个漏洞 几乎在两年后才开放。

有什么可怕的是,当超过限制,replace只是默默地失败 。 至less如果错误已经被提出并logging下来,你会发现发生了什么事情,为什么以及要修改哪些内容。 但不是。

所以我有一个70K的HTML文件变成PDF。 它需要以下的php.ini设置:

  • pcre.backtrack_limit = 2000000; #可能比我需要的多,但没关系
  • memory_limit = 1024M; #是, 一千兆字节 ; 和
  • max_execution_time = 600; #是的, 10分钟

现在精明的读者可能已经注意到我的HTML文件小于100k。 我可以猜测出为什么我遇到这个问题的唯一原因是,html2pdf将转换为xhtml作为过程的一部分。 也许这就把我带走了(虽然近50%的膨胀似乎很奇怪)。 无论如何,上述工作。

现在,html2pdf是一个资源pipe理器。 我的70K文件需要大约5分钟,至less500-600M的RAM来创build一个35页的PDF文件。 不幸的是,实时下载不够快,内存使用率使内存使用率达到1000比1(一个70K文件的内存为600M),这是非常荒谬的。

不幸的是,这是我所想的最好的。

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

与此同时,mPDF在5.7版本,并且与HTML2PS / HTML2PDF形成鲜明对照

但请记住,文档确实很难处理。 例如,看看这个页面: https : //mpdf.github.io/ 。

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

1)使用MPDF !

a)在您的文件yourfolder提取

b)在你的文件yourfolder创buildfile.php并插入这样的代码:

 <?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文件中,把这个代码(假设,也有一个source 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)inputFinalFolder ,将会有转换后的文件(与原始PDF文件一样多的页面)

结帐TCPDF 。 它具有一些HTML到PDF的function,可能足以满足您的需求。 这也是免费的!

我build议DocRaptor (使用PrinceXML作为“引擎”)

只是碰到线程,我试过DOMPDF,它的工作完美。 我已经使用DIV和其他块级元素来定位所有的东西,严格保持CSS 2.1,并且很好地起作用。

好消息! 快活 !

Snappy是一个非常简单的开源PHP5库,允许从url或html页面生成缩略图,快照或PDF。 而且…它使用了优秀的基于webkit的wkhtmltopdf

请享用! ^ _ ^

那么如果你想find一个完美的XHTML + CSS到PDF转换器库,忘记它。 这是远远不可能的。 因为它就像find一个完美的浏览器(XHTML + CSS渲染引擎)。 我们有吗? IE还是FF?

我在DOMPDF方面取得了一些成功。 问题是,你必须修改你的HTML + CSS代码,以图书馆的方式工作。 除此之外,我有相当好的结果。

见下文:

原始的HTML

将HTML转换为PDF

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

没有任何外部库,Zend的devzone有一个关于从php生成pdf的教程( 第1 部分 , 第2部分 )。 我从来没有实现这种解决scheme,但因为它都是PHP,你可能会发现它更灵活的实现和debugging。

它已经被提到,但我只想确认,mpdf是最简单,最强大,最免费的HTML到PDF转换器那里。 天空真的是极限。 你甚至可以生成dynamic的,用户生成的数据的PDF。

例如,一个客户想要一个CMS系统,所以他可以更新他在他的俱乐部玩的音乐的曲目列表。 这是没有问题的,但他也希望用户能够下载播放列表的.pdf,所以这个可下载的pdf也必须由cms更新。 由于mpdf,一些简单的循环和散布的variables,我可以做到这一点。 一些我认为会花费我几周的字面上花了我几分钟。

下载页面 。

伟大的文章 ,帮助我开始。

最初在开篇中提到的HTML2PDF和HTML2PS正在谈论2009年的一个包裹,这个包裹现在已经断了

但是有一个更好的HTML2PDF

它是基于TCPDF,虽然它部分是法文的。

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

在成本方面,使用networking服务(API)在许多情况下可能是更明智的做法。 另外,通过外包这一stream程,您可以减轻自己的基础设施/后端负担,并且 – 只要您使用的是有信誉的服务,就能确保与调整networking标准,正常运行时间,缩短处理时间和快速交付内容的兼容性。

我已经对目前市场上的大多数Web服务进行了一些研究,请根据价格/价格比率的顺序,在这个主题上find我觉得值得一提的API。 他们都提供预先编写的PHP类和包。

  1. pdflayer.com – 成本:$ – 质量:☆☆☆☆
  2. docraptor.com – 成本:$ – 质量:☆☆☆☆☆
  3. pdfcrowd.com – 成本:$$ – 质量:☆☆☆

质量:

拥有高质量的引擎PrinceXML作为主干, DocRaptor清晰地提供了最好的PDF质量,返回了高度精练和良好转换的PDF文档。 但是,这里的pdflayer API服务非常接近。 Pdfcrowd不一定以质量得分,但处理速度。

成本:

pdflayer.com – 如上所述,这里最具成本效益的select是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。

我已经使用了他们所有三个,这个文本应该是帮助任何人决定,而不必支付所有这些。 本文没有被写入认可任何一种产品,我也没有任何产品的从属关系。

尝试抓住最新的每晚dompdf构build – 我使用的是一个可怕的资源猪老版本,并采取永远提交我的PDF。 从这里抓住一晚。

它只需要花费几秒钟来生成PDF文件,并且与PrinceXML / Docraptor文件一样精美。 似乎他们已经认真优化了dompdf代码,因为我上次使用它!

如果您有权访问命令行,则可以使用PhantomJSURL (远程或本地)创buildPDF

它工作得很好,是一个免费的解决scheme。

看看这个例子脚本为这个确切的问题。

Darryl Hein提到的TCPDF可能是一个好主意。 Nicola Asuni的代码非常方便和强大。 唯一的杀手锏就是如果你打算用生成的PDF合并PDF文件,它不具备这些function。 您将不得不创buildPDF,然后使用类似Sid Steward的PDFTK(www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)将其合并。

在将文件交给转换器之前,也许可以尝试使用Tidy。 如果其中一个渲染器在某些HTML问题(比如未封闭的标记)上窒息,可能会有所帮助。

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

CutyCapt

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

我不认为一个PHP类将是最好的呈现与CSS的xHtml页面。

当新的css规则出来时会发生什么? (很快css 3.0 …)

渲染一个html页面的最好方式,显然是一个浏览器。 Firefox 3.0可以本地“打印”为PDF格式,torisugary开发了一个扩展(命令行打印)来使用它。 在这里你会find它。

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

目前,我认为wkhtmltopdf是最好的(这是Safari浏览器使用的),快速,快速,真棒。 是的,开源,以及… 看看

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

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

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

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

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

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

https://rotativahq.com

精细的渲染并不意味着什么。 它是否validation?

所有浏览器都尽可能地在屏幕上显示某些内容,而不pipeinput有多糟糕。 当然,他们不这样做。 如果你想和FireFox一样的渲染,你可以使用它的渲染引擎。 有它的pdf生成器。 不过,这是一项非常可怕的工作。

虽然已经有很多解决scheme,但我推荐以下两个:

  1. HTM2PDF – 提供了一个将HTML转换为PDF的API,并且还有一个PHP SDK,这使得它非常容易在PHP中实现; 它提供了在欧洲,亚洲和美国的服务器地点的select
  2. PDFmyURL – 提供了一个可以将URL和HTML转换为PDF的API,其function与HTM2PDF大致相同,但在负载均衡的环境下工作,并且已经有一段时间了

从前面提到的所有解决scheme中,这两个API的不同之处在于,除了使用CSS和JavaScript将HTML转换为PDF之外,它还提供PDF版权pipe理,水印和encryption。 因此,对于那些想要开始运行的人来说,这是一个全方位的解决scheme。

免责声明:我为一个运营这两个网站的公司工作。

TCPDF工作正常,没有依赖关系,是免费的,并不断bugfixed。 如果提供的HTML / CSS内容格式合理,它的速度合理。 我通常生成50 – 300 kB的HTMLinput(包括CSS),并在1-3秒内以10 – 15个PDF页面获得PDF输出。

我强烈build议在将任何东西发送到TCPDF之前,使用整洁的库作为HTML格式化程序。

我推荐TCPDF或DOMPDF,是这样的顺序

我已经尝试了很多不同的PHP库。 所有列出的我都试过了。 在我看来, TCPDF库是最好的折中性能/可用性。 安装使用非常简单,在中小型应用中也有很好的性能。 如果你需要高性能和很大的PDF文件,使用Zend_PDF模块,但是要准备好编码!

HTML到PDF的转换是否真的需要使用PHP在服务器端进行?

我刚刚遇到了jsPDF ,一个使用HTML5 / JavaScript的客户端解决scheme。 MIT许可的代码也在GitHub上 。

Web API

如果有人总是search这种东西,有一个免费的网站,可以让您将HTML代码和网页转换为PDF格式。 还有一个(非常小的)api允许你从url获得pdf文件。

在这里检查

不是PHP ,而是一个Java库 ,它做的事情是:

Flying Saucer采用XML或XHTML,并将CSS 2.1兼容的样式表应用于其中,以呈现为PDF

它可以从PHP通过system()或类似的调用使用。 虽然它需要input XML格式良好。