Convert HTML + CSS to PDF with PHP?
我有一个HTML(而不是XHTML)文档,在Firefox3和IE7中呈现良好效果。它使用相当基本的CSS来设置样式,并在HTML中呈现良好的效果。
我现在正在寻找一种将其转换为PDF的方法。我已经尝试过:
- DOMDPDF:它在表格上有很大的问题。我计算出了我的大型嵌套表,它很有帮助(在它消耗掉高达128m的内存之后就消失了——这是我在php.ini中对内存的限制),但它使表变得一团糟,似乎无法获取图像。这些表格只是一些基本的东西,带有一些边框样式,可以在不同的点添加一些线条;
- HTML2PDF和HTML2PS:我真的很幸运。它呈现了一些图像(所有的图像都是谷歌图表的URL),表格格式要好得多,但它似乎有一些复杂的问题,我还没有弄清楚,并且一直在死于未知的node_type()错误。不确定从这里到哪里;以及
- HTMLDoc:这在基本的HTML上看起来很好,但是几乎不支持CSS,所以你必须用HTML做所有的事情(我没有意识到它在HTMLDoc Land中仍然是2001年…)所以它对我没用。
我尝试了一个名为html2pdf pilot的Windows应用程序,它实际上做了一个相当不错的工作,但我需要的是在Linux上运行最少的程序,最好是在Web服务器上通过php按需运行。
我遗漏了什么,或者如何解决这个问题?
看看
我们在这里写了一个小教程。
编辑(2017):
如果今天要做点什么,我就不会再走那条路了。
但会使用http://pdfkit.org/代替。
可能会剥离它所有的nodejs依赖项,以便在浏览器中运行。
重要:请注意,该答案写于2009年,可能不是目前2019年最具成本效益的解决方案。如今,在线替代方案比以前更好。
以下是一些您可以使用的在线服务:
- PDFSHIFT
- 里斯塔克
- PDF层
- 驯兽师
- HTMLPDFAPI
- HTML到PDF火箭
看看Princexml。
它绝对是最好的HTML/CSS-to-PDF转换器,尽管它不是免费的(但是,你的编程也可能不是免费的,所以如果它能节省你10小时的工作时间,你就可以免费回家了(因为你还需要考虑到其他解决方案需要你用合适的软件设置一个专用的服务器)。
哦,是的,我有没有提到这是第一个(可能也是唯一一个)执行完整ACID2的HTML2PDF解决方案?
Princexml样品
经过一些调查和一般拔毛的解决方案似乎是HTML2PDF。dompdf在处理表格、边框,甚至是中等复杂的布局方面做得很糟糕,htmldoc看起来相当健壮,但几乎完全不了解css,我不想仅仅为了这个程序而回到没有css的HTML布局上。
HTML2PDF看起来是最有前途的,但我一直有一个关于节点类型的空引用参数的奇怪错误。我终于找到了解决办法。基本上,php5.1.x在任何大小的字符串上都可以很好地使用regex replaces(preg_replace_*)。php5.2.1引入了一个名为pcre.backtrack_limit的php.ini配置指令。这个配置参数所做的是限制匹配所针对的字符串长度。我不知道为什么要介绍这个。默认值选择为100000。为什么这么低的价值?再说一遍,不知道。
针对这一点,针对php5.2.1提出了一个bug,该bug在近两年后仍然开放。
令人恐惧的是,当超过限制时,替换程序会无声地失败。至少,如果一个错误被引发并记录下来,你会有一些关于发生了什么,为什么以及为了修复它而改变什么的指示。但是没有。
所以我有一个70k的HTML文件转换成PDF。它需要以下php.ini设置:
- pcre.backtrack_limit=2000000;可能比我需要的多,但没关系
- 内存限制=1024m;是,1 GB;以及
- 最大执行时间=600;是,10分钟。
现在精明的读者可能已经注意到我的HTML文件小于100K。我能猜出为什么我遇到这个问题的唯一原因是HTML2PDF将转换成XHTML作为过程的一部分。也许这让我接管了(尽管近50%的膨胀看起来很奇怪)。不管是什么情况,上述方法都有效。
现在,html2pdf是一个资源猪。我的70K文件大约需要5分钟和至少500-600毫米的内存来创建一个35页的PDF文件。不幸的是,对于实时下载来说,速度不够快(到目前为止),内存使用率将内存使用率设置为1000:1(70k文件的内存使用率为600万),这是非常荒谬的。
不幸的是,这是我想出的最好办法。
为什么不试试MPDF 2.0版?我用它来创建PDF文档。它很好用。
同时,MPDF的版本是5.7,并且与HTML2PS/HTML2PDF相比,它是主动维护的。
但请记住,文档确实很难处理。例如,看看这个页面:https://mpdf.github.io/。
关于HTML到PDF的非常基本的任务,可以用这个库来完成,但是更复杂的任务需要一些时间来阅读和"理解"文档。
1)使用MPDF!
a)
b)在
1 2 3 4 5 6 7 | <?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):
1 2 3 4 5 6 7 8 | <?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的功能,可能足以满足您的需要。它也是免费的!
我建议使用docraptor(它使用
我试过使用dompdf,它运行得很好。我使用了
好消息!快点!!
Snappy是一个非常简单的开源php5库,允许从URL或HTML页面生成缩略图、快照或PDF。还有…它使用基于wkhtmltopdf的优秀webkit
享受!^ ^ ^
已经提到过,但我想确认MPDF是目前最简单、最强大、最免费的HTML-to-PDF转换器。天空才是真正的极限。甚至可以生成用户生成的动态数据的PDF。
例如,一个客户想要一个CMS系统,这样他就可以更新他在俱乐部播放的音乐的跟踪列表。这没问题,但他也希望用户能够下载一个.pdf格式的播放列表,所以这个可下载的pdf也必须由CMS更新。多亏了mpdf,通过一些简单的循环和分散的变量,我可以做到这一点。我以为要花上几个星期的时间,实际上花了我几分钟。
帮助我开始的好文章。
如果你想找到一个完美的xhtml+css-to-pdf转换器库,那就把它忘了。这是不可能的。因为这就像找到一个完美的浏览器(XHTML+CSS呈现引擎)。我们有吗?IE还是FF?
我在dompdf上取得了一些成功。问题是,你必须修改你的HTML+CSS代码以符合库的工作方式。除此之外,我还有很好的结果。
见下文:
原始HTML
将HTML转换为PDF
最初在开篇文章中提到的HTML2PDF和HTML2PS讨论的是一个带有这个链接的2009包。
但是有一个更好的HTML2PDF
它是基于tcpdf的,尽管部分是法语。
您可以让表头或表尾在页面上重复,并具有页码和总页数。看看它的例子。我已经用了三年多了,并推荐它。
我使用fpdf使用php生成PDF文件。到目前为止,它对我来说工作得很好,可以产生简单的输出。
这里有一个关于Zend的devzone的教程,介绍如何在没有任何外部库的情况下从PHP(第1部分,第2部分)生成PDF。我从来没有实现过这种解决方案,但是因为它都是PHP,所以您可能会发现实现和调试更为灵活。
尝试获取最新的每晚dompdf构建-我使用的是一个旧版本,这是一个可怕的资源消耗和花了我的PDF永远呈现。从这里抓了一个晚上。
生成PDF只需要几秒钟,而且它的渲染效果和PrinceXML/Docraptor一样好。似乎自从我上次使用DOMDPDF代码以来,他们已经认真地优化了它!
在成本方面,在许多情况下,使用Web服务(API)可能是更明智的方法。此外,通过外包此流程,您可以解除自己的基础设施/后端的负担,并确保与调整Web标准、正常运行时间、短处理时间和快速内容交付的兼容性(前提是您使用的是信誉良好的服务)。
我已经对目前市场上的大多数Web服务做了一些研究,请在下面找到我觉得在这个线程上值得一提的API,以基于价格/价值比率的顺序排列。它们都提供了预组合的PHP类和包。
质量:
Docraptor以高质量的引擎
成本:
pdflayer.com-如上所述,这里最具成本效益的选项是pdflayer.com,它为100个月的pdf和9.99-119.99美元的优质订阅提供完全免费的订阅计划。每月10000份PDF文件的价格是39.99美元。
docraptor.com-提供7天免费试用期。高级认购计划的价格从15美元到2250美元不等。每月10000份PDF文档的价格约为300美元。
pdfcrowd.com-免费提供100个pdf。高级认购计划的价格从9美元到89美元不等。每月10000份PDF文档的价格约为49美元。
我已经使用了这三种方法,这篇文章应该可以帮助任何人做出决定,而不必为所有这些方法付费。这篇文章没有被写来支持任何一个产品,我与任何一个产品没有任何关联。
DarrylHein在上面提到tcpdf可能是个好主意。NicolaAsuni的代码非常方便和强大。唯一的杀手是,如果你计划将PDF文件与生成的PDF文件合并,它就没有这些功能。您必须创建PDF,然后使用类似于pdftk by sid steward的工具(www.pdflabs.com/tools/pdftk the pdf toolkit/)合并它。
如果您可以访问命令行,则可以使用phantomjs从EDOCX1(远程或本地)创建
它工作得很好,是一个免费的解决方案。
请看一下为这个确切问题编写的示例脚本。
这个问题已经很老了,但还没有人提到过卡蒂卡普,所以我会的:)
铁皮帽
CutyCapt is a small cross-platform command-line utility to
capture WebKit's rendering of a web page into a variety of vector and
bitmap formats, including SVG, PDF, PS, PNG, JPEG, TIFF, GIF, and BMP
我认为PHP类不适合用CSS呈现XHTML页面。
当新的CSS规则出现时会发生什么?(很快CSS 3.0…)
呈现HTML页面的最佳方式显然是浏览器。Firefox3.0可以以PDF格式本地"打印",Torissugy开发了一个扩展(命令行打印)来使用它。在这里你会找到它的。
不管怎样,仍然有很多问题运行在火狐上,就像一个PDF转换器一样…
目前,我认为wkhtmltopdf是最好的(这是Safari浏览器使用的),速度快,速度快,很棒。是的,OpenSource也是…看一看
我开发了一个公共API来从网页构建PDF文件。它有一个很好的PHP客户机类,使用起来非常容易。它使用wkhtmltopdf在云中呈现PDF。
在HTML中不需要任何特殊的东西。在images/css/js链接中不需要绝对URL。也可以在本地主机(dev machine)上工作。
目前,该服务在美国东部、美国西部、欧盟北部、东南亚4个Azure地区都有端点。
它的速度很快,因为它使用一个专有的协议将网页内容发送到API以转换为PDF。
它是可靠的,因为所有端点都是负载平衡的。
可供测试或低使用的免费帐户。网站上的详细信息:
网址:https://rotativahq.com
也许在将文件交给转换器之前,您可以尝试使用tidy。如果其中一个渲染器因某些HTML问题(如未关闭的标记)而阻塞,可能会有所帮助。
我建议按这个顺序使用tcpdf或domdpdf。
虽然已经提供了许多解决方案,但我建议使用以下两种方案:
这两个API与前面提到的所有解决方案不同的是,除了用CSS和JavaScript将HTML转换为PDF之外,它还提供了PDF权限管理、水印和加密。因此,这是一个综合性的解决方案,为那些想落地跑的人。
免责声明:我为Kaiomi工作,这是一家同时经营这两个网站的公司。
精细渲染并不意味着什么。是否有效?
所有的浏览器都尽最大努力在屏幕上显示一些东西,不管输入有多糟糕。当然,他们不会做同样的事情。如果你想要和火狐一样的渲染,你可以使用它的渲染引擎。它有PDF生成器。不过,这是一项非常艰巨的工作。
TCPDF工作良好,没有依赖性,是免费的,不断修正错误。如果所提供的HTML/CSS内容格式良好,则具有合理的速度。我通常从50-300kb的HTML输入(包括CSS)中生成,并在1-3秒内获得PDF输出,其中有10-15PDF页面。
我强烈建议在发送任何内容到tcpdf之前使用整洁的库作为HTML漂亮的格式化程序。
HTML到PDF转换真的需要使用PHP在服务器端进行吗?
我刚刚遇到了JSPDF,一个使用HTML5/javascript的客户端解决方案。麻省理工学院的授权代码也在Github上。
我尝试过很多不同的PHP库。我尝试过的所有列表。在我看来,tcpdf库是性能/可用性的最佳折衷方案。它的安装和使用非常简单,在中小型应用中也有很好的性能。如果您需要高性能和非常大的PDF文档,请使用Zend_PDF模块,但准备好硬编码!
Web API
如果有人总是搜索这类内容,那么就有一个免费的网站,允许您将HTML代码和页面转换为PDF。还有一个(非常小的)API允许您从URL获取PDF文件。
这里检查一下
不是PHP,而是Java库,它是这样做的:
Flying Saucer takes XML or XHTML and applies CSS 2.1-compliant
stylesheets to it, in order to render to PDF
它可以通过