题 用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应用程序,它实际上做得相当不错,但我需要的东西至少在Linux上运行,理想情况下通过Web服务器上的PHP按需运行。

我错过了什么,或者我该如何解决这个问题?


1396


起源


Html2Pdf实际上使用IE的嵌入式实例来呈现页面,然后将其转换为PDF - 可能通过IE的打印机制。 - Joel Mueller
因为这是2008年的一个问题,所以dompdf现在要成熟得多。 ;-) - Hendra Uzia
dompdf现在支持CSS 2.1并且可以处理 @import, @media 和 @screen 规则,并将加载外部样式表。它还捆绑了它工作所需的一切,尽管有些东西可以安装以获得比默认库更好的性能。 code.google.com/p/dompdf - totallyNotLizards
2015更新:在研究了很多选项后,我们决定使用wkhtmltopdf它是一个很好的实用工具我们很难用CSS,因为我们有外部CSS文件,但后来我们应用了把CSS的虚拟链接放在我们想要的HTML元素上的技巧转换并设置它像MAGIC一样工作的正确路径! - Anshul Nigam
我相信很快每个人都会发现Chrome / Chromium无头 chrome --headless --print-to-pdf="path/to/pdf" https://your_url  作为最丰富,最快速,最简单的html到pdf生成工具 crbug.com/603559 因为它支持大多数html功能,开发人员依赖于Web开发,并且不像大多数其他库和工具那样糟糕。 - Ebrahim Byagowi


答案:


重要: 请注意,这个答案是在2009年写的,它可能不是2018年的最具成本效益的解决方案。在线替代品如 PDFShift 今天在这方面比他们当时更好。


看一下 PrinceXML

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

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

PrinceXML样本


443



PrinceXML非常棒。只有它不那么贵:-( - acme
我的公司写了一个围绕Prince建立的网络服务。显着降低前期成本,无需安装任何东西即可使用:docraptor.com - Joel Meador
我也使用过DocRaptor。无需支付昂贵的许可即可获得Prince的好处的绝佳方式。恭喜一个伟大的产品,乔尔。 - Nate365
太贵了。 WKHTMLTOPDF(参见其他答案)是免费的,完成工作并使用非常棒的webkit。 - thomallen
如果您有命令行访问权限并且不想支付3500美元,PhantomJS使用此脚本: github.com/ariya/phantomjs/blob/master/examples/rasterize.js 可能是一个解决方案 - 这是免费且简单的方式! - chjortlund


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

我们写了一个小教程 这里

编辑(2017):

如果今天要建造一些东西,我就不会再去那条路了。
但会使用 http://pdfkit.org/ 代替。
可能会剥夺其所有nodejs依赖项,以便在浏览器中运行。


628



这个运作在最好的前提IMO。 Boostrap转换现有渲染器而不是从头开始编写 - 不是一项简单的任务。此外,Webkit是用C ++编写的,因此比基于PHP的实现更快,更少资源。 - Koobz
我们在尝试使用CentOS服务器正确渲染字体时遇到了很大的问题。经过几周的捣乱,似乎唯一的选择就是不使用CentOS。 - Abhi Beckert
警告!如果您使用wkhtmltopdf(至少在我的系统上,在Windows 7 64位上使用XAMPP),在我尝试的所有情况下,.gif图像都无法显示在PDF文件中。我尝试了在不同的地方建议的一些解决方法,例如包括“width”和“height”,并根据不同的约定编写URI。我尝试过的任何东西都没有引起.gif的出现(特别是,甚至没有“宽度”和“高度”的建议,我尝试使用内联样式并使用古老的“宽度”和“高度”HTML属性)。但是,第一次尝试将图像交换为.jpg。 - Dan Nissenbaum
这个抽象很不错 mikehaertl.github.io/phpwkhtmltopdf - saada
商业服务对我们来说太贵了,所以我们将WKHTMLTOPDF实现为免费的云服务 html2pdfrocket.com 供任何人使用,然后自己用于我们的客户。我们这样做是因为我们的客户不必在他们的服务器上安装exe,而是跨平台工作。如果您正在构建自己的服务,我肯定会评价WKHTMLTOPDF。 - eagle779


经过一些调查和一般的拉毛解决方案似乎是 HTML2PDFDOMPDF 桌子,边框,甚至是中等复杂的布局都做得很糟糕 HTMLDOC 似乎相当健壮,但几乎完全是CSS无知的,我不想回到没有CSS只为该程序做HTML布局。

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

一个 为此,针对PHP 5.2.1提出了bug,仍然是开放的 差不多两年后

令人恐惧的是,当超过限制时,只需更换 默默地失败了。至少如果出现错误并记录错误,您就会知道发生了什么,为什么以及要修改什么来修复它。但不是。

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

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

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

现在,html2pdf是一种资源匮乏。我的70k文件需要大约5分钟和至少500-600M的RAM才能创建35页的PDF文件。不幸的是,实时下载速度不够快(到目前为止)并且内存使用率使内存使用率大约为1000比1(700k文件的RAM为600M),这完全是荒谬的。

不幸的是,这是我提出的最好的。


141



@cletus你可以告诉我关于HTML2PDF的稳定版本。上面的链接示例已弃用 - ripa
有关最新版本,请参阅 github.com/spipu/html2pdf - Luke Wenke
严峻的错字变得更加严峻:内存使用率大约为10,000到1 lol - MickLH


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

与此同时,mPDF版本为5.7,与HTML2PS / HTML2PDF相比,它是主动维护的

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

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


116



确实,mpdf确实有效且速度很快,它可以动态创建pdf文件。 - conualfy
我在这里尝试了一堆建议的。到目前为止,这个上传和开箱即用,没有任何麻烦,与其他人相比,文档确实令人惊叹。使用说明书写得清楚。 - Smith Smithy
当使用图像背景或数据库中的标签发布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.ch
MPDF运作良好,真实!但是代码和文档是不一致的 - 很难完成更复杂的任务,例如创建关于喧嚣规范的信件。 - Qullbrune


1)使用 MPDF !

a)提取物 yourfolder

b)创造 file.php 在 yourfolder 并插入此类代码:

<?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一样多的页面......)


60



我会尝试GrabzIt他们的API支持CSS,JavaScript和大多数其他资源类型。它只需要使用绝对URL引用,或者内联并包含在发送到服务的HTML中。在这里试试: grabz.it/html-to-pdf-image-api.aspx
GrabzIt不是免费的 - chatoxz


查看 TCPDF。它有一些HTML到PDF功能,可能足以满足您的需求。它也是免费的!


51



它的支持是渲染html相当有限,你可能想读这个: tcpdf.org/doc/classTCPDF.html#ac3fdf25fcd36f1dce04f92187c621407 - Hendra Uzia
但css风格不起作用 - KBK


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


29



遗憾的是,如果要生成包含大量图像的大型PDF文件,则无法使用。我认为请求有60秒的时间限制,如果Docraptor需要下载大量文件,这将超出,并且不会制作文件。 - Vilhelm
Vilhelm提到的这个问题已得到修复。 - illbzo1