协慌网

登录 贡献 社区

用 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 按需运行。

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

答案

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

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

编辑(2017):

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

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

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


看看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; #yes, 一千兆字节 ; 和
  • max_execution_time = 600; #是, 10 分钟

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

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

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