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

我有一个 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 按需运行。

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

答案

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

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

编辑(2017):

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

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

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


看看PrinceXML

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

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

PrinceXML 示例

经过一番调查和一般的梳理,该解决方案似乎是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),这是非常荒谬的。

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

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

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

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

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

1)使用MPDF

a)在文件yourfolder提取

b)在yourfolder创建file.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文件中,放置以下代码(假设也有一个源 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 一样多的页面。)

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

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

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

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

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

很棒的文章帮助我入门。

好消息! 快活

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

请享用! ^ _ ^