php html转pdf
使用PHP将HTML+CSS转换为PDF? (20)
好的,我现在正在用这个砖头撞墙。
我有一个在Firefox 3和IE 7中呈现良好的HTML(不是XHTML)文档。它使用相当基本的CSS来设置它的样式,并且在HTML中呈现良好。
我现在正在将它转换为PDF。 我努力了:
- DOMPDF :它有很多表格问题。 我分解了我的大型嵌套表,并且它有所帮助(在它耗尽高达128M的内存然后死去之前 - 这是我在php.ini中对内存的限制),但它使得表格变得非常混乱,似乎并没有得到图片。 这些表只是基本的东西,有些边框样式可以在不同的点添加一些线条;
- HTML2PDF和HTML2PS :我其实有更好的运气。 它呈现了一些图像(所有图像都是谷歌图表网址),表格格式更好,但它似乎有一些复杂性问题,我还没有弄清楚,并且一直伴随着未知的node_type()错误。 不知道该从哪里出发; 和
- Htmldoc :这对于基本的HTML似乎工作得很好,但几乎不支持CSS,所以你必须用HTML做所有事情(我没有意识到它仍然是2001年在Htmldoc-land中),所以对我来说是没用的。
我尝试了一个名为Html2Pdf Pilot的Windows应用程序,它实际上做了一个相当不错的工作,但我需要的东西至少在Linux上运行,理想情况下通过Web服务器上的PHP按需运行。
我真的不敢相信我会陷入困境。 我错过了什么吗?
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文件中,放置这个代码(假设,也有一个source 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一样)
HTML to PDF转换是否真的需要使用PHP在服务器端进行?
我刚刚遇到了jsPDF ,这是一个使用HTML5 / JavaScript的客户端解决方案。 麻省理工学院许可的代码也在GitHub上 。
TCPDF工作正常,没有依赖关系,是免费的并且不断修复。 如果提供的HTML / CSS内容格式合理,它的速度合理。 我通常生成50 - 300 kB的HTML输入(包括CSS),并在1-3秒内以10 - 15个PDF页面获得PDF输出。
我强烈建议在将任何内容发送到TCPDF之前,使用整洁的库作为HTML格式化程序。
不是PHP ,而是一个Java库 ,它执行以下任务:
Flying Saucer采用XML或XHTML并将CSS 2.1兼容的样式表应用于其中,以渲染为PDF
它可以从PHP通过system()
或类似的调用使用。 尽管它需要input
XML格式良好。
你为什么不尝试mPDF 2.0版 ? 我用它来创建PDF文档。 它工作正常。
与此同时,mPDF版本为5.7,与HTML2PS / HTML2PDF相比,它得到了积极维护
但请记住,文档确实很难处理。 例如,看看这个页面: https://mpdf.github.io/ : https://mpdf.github.io/ 。
基于html到pdf的非常基本的任务可以通过这个库来完成,但是更复杂的任务需要一些时间来阅读和理解文档。
只是碰到线程,我试过DOMPDF,它的工作完美。 我已经使用DIV
和其他块级元素来定位所有东西,严格保持CSS 2.1,并且它发挥出色。
尝试抓住最新的每晚dompdf构建 - 我使用的是一个较老的版本,这是一个可怕的资源猪,并永远采取我的PDF格式。 从here抓住一晚之后。
它只需要几秒钟就可以生成PDF,而且它与PrinceXML / Docraptor一样可以很好地渲染。 似乎他们自从我上次使用它以来已经认真优化了dompdf代码!
我不认为一个PHP类将是用CSS呈现xHtml页面的最佳选择。
当新的css规则出来时会发生什么? (很快css 3.0 ...)
显而易见,呈现html页面的最佳方式是浏览器。 Firefox 3.0可以本地“打印”为pdf格式,torisugary开发了一个扩展(命令行打印)来使用它。 在这里你会找到它。
无论如何,仍然有许多问题runninr firefox 只是作为一个PDF转换器...
目前,我认为wkhtmltopdf是最好的(这是Safari浏览器使用的),快速,快速,真棒。 是的,开源,以及... wkhtmltopdf
我开发了一个公共API来从网页构建PDF文件。 它有一个不错的PHP客户端类,使它非常易于使用。 它使用wkhtmltopdf在云中呈现PDF。
在HTML中不需要特别的东西。 在images / css / js链接中不需要绝对的URL。 也在localhost(开发机器)上工作。
目前该服务在4个Azure地区提供终端服务:美国东部,美国西部,欧盟北部,东南亚。
它的速度很快,因为它使用专有协议将网页内容发送到API以转换为PDF。
这是可靠的,因为所有端点都是负载平衡的。
免费帐户可用于测试或低使用率。 网站上的详细信息:
我推荐TCPDF或DOMPDF,是这样的顺序
精细的渲染并不意味着什么。 它是否验证?
无论输入有多糟糕,所有浏览器都尽可能在屏幕上显示某些内容。 当然,他们不会做同样的事情。 如果你想和FireFox一样的渲染,你可以使用它的渲染引擎。 有它的pdf生成器。 虽然这是一项非常多的工作。
经过一些调查和一般的拉动解决方案似乎是HTML2PDF 。 DOMPDF在表格,边界和适度复杂的布局方面做htmldoc , htmldoc看起来相当健壮,但几乎完全是CSS,并且我不想回到没有CSS的情况下为HTML htmldoc程序。
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文件,内存使用量为600M),这是非常荒谬的。
不幸的是,这是我所想到的最好的。
虽然已经提供了很多解决方案,但我推荐以下两种:
- HTM2PDF - 提供了一个将HTML转换为PDF的API,并且还提供了PHP SDK,这使得在PHP中实现起来非常简单; 它提供了欧洲,亚洲和美国的服务器选择
- PDFmyURL - 提供了一个API,可以将URL和HTML格式转换为PDF格式,其功能与HTM2PDF大致相同,但在负载均衡的环境中工作并且时间稍长
这两个API与前面提到的所有解决方案都有所不同,除了使用CSS和JavaScript将HTML转换为PDF之外,它还提供PDF版权管理,水印和加密。 因此,对于那些想要在地面运行的人来说,这是一种全面的解决方案。
免责声明:我为运营这两个网站的公司工作。