我有一个HTML(而不是XHTML)文档,可以在Firefox3和IE7中显示良好。它使用相当基本的CSS来设置样式,并在HTML中呈现良好的效果。

我现在正在寻找一种将其转换为PDF的方法。我尝试过:

DOMPDF:它在表格方面存在巨大问题。我分解了我的大型嵌套表,这有助于(之前它只消耗了128M的内存,然后就死了——这是我在php.ini中的内存限制),但它把表弄得一团糟,而且似乎没有图像。这些表格只是一些基本的东西,带有一些边框样式,可以在各个点添加一些线条;HTML2PDF和HTML2PS:实际上我在这方面运气更好。它呈现了一些图像(所有图像都是Google Chart URL),表格格式要好得多,但它似乎有一些复杂性问题,我还没有弄清楚,并且一直因未知的node_type()错误而死亡。不知道从这里去哪里;和Htmldoc:这在基本的HTML上似乎很好,但几乎不支持CSS,所以你必须用HTML做所有的事情(我没有意识到在Htmldoc领域还是2001年…),所以这对我来说是无用的。

我尝试了一个名为Html2Pdf Pilot的Windows应用程序,它确实做得很好,但我需要至少在Linux上运行,最好通过Web服务器上的PHP按需运行的应用程序。

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


当前回答

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

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

见下文:

原始HTML

将HTML转换为PDF

其他回答

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

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

使用MPDF!==

a) 在文件夹中提取

b) 在您的文件夹中创建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!

将pdftohtml.exe解压缩到根文件夹:在该文件夹的anyfile.php文件中,输入以下代码(假设也有一个源example.pdf):输入FinalFolder,将有转换后的文件(与源PDF一样多的页面)

经过一些调查和一般的头发拉扯,解决方案似乎是HTML2PDF。DOMDF在表格、边框甚至是中等复杂的布局方面做得很糟糕,htmldoc看起来相当健壮,但几乎完全不了解CSS,我不想只为该程序而回到没有CSS的HTML布局。

HTML2PDF看起来是最有前途的,但我一直有一个关于node_type的空引用参数的奇怪错误。我终于找到了解决办法。基本上,PHP5.1.x在任何大小的字符串上都可以使用正则表达式替换(preg_replace_*)。PHP 5.2.1引入了一个名为pcre.backtrack_limit的PHP.ini配置指令。此配置参数的作用是限制匹配所需的字符串长度。我不知道为什么要这样做。默认值选择为100000。为什么值这么低?同样,不知道。

针对PHP 5.2.1提出了一个bug,该bug在近两年后仍然开放。

最可怕的是,当超过限制时,替换就会默默地失败。至少,如果一个错误被引发并记录下来,你会知道发生了什么,为什么,以及要修改什么来修复它。

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

pcre.backtrack_limit=2000000;#可能比我需要的更多,但没关系内存限制=1024M;#是的,1千兆字节;和最大执行时间=600;#是的,10分钟。

现在精明的读者可能已经注意到我的HTML文件小于100k。我可以猜测为什么会遇到这个问题的唯一原因是,作为过程的一部分,html2pdf将转换为xhtml。也许这让我着迷了(尽管近50%的膨胀似乎很奇怪)。不管是什么情况,上述方法都奏效了。

现在,html2pdf是一个资源占用者。我的70k文件需要大约5分钟和至少500-600M的RAM才能创建一个35页的PDF文件。不幸的是,对于实时下载来说(到目前为止)还不够快,内存使用率使内存使用率达到1000比1(70k文件需要600M RAM)的量级,这是非常荒谬的。

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

Zend的devzone上有一个关于在没有任何外部库的情况下从php生成pdf的教程(第1部分,第2部分)。我从未实现过这种解决方案,但由于它都是php,所以您可能会发现它更灵活地实现和调试。

虽然已经提供了许多解决方案,但我建议使用以下两种:

HTM2PDF-提供了一个将HTML转换为PDF的API,还具有一个PHP SDK,这使得它非常容易在PHP中实现;它提供了欧洲、亚洲和美国的服务器位置选择PDFmyURL-提供了一个API,可以将URL和HTML转换为PDF,功能与HTM2PDF大致相同,但在负载平衡的环境下工作,并且使用时间稍长

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

免责声明:我在Kaiomi工作,这家公司同时运营这两个网站。