提问



我有一个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按需运行。[13] [14] [15]


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

最佳参考


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





看看PrinceXML。[17]


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


哦,是的,我是否提到这是第一个(也可能是唯一的)完全ACID2的HTML2PDF解决方案?[18]


PrinceXML样本[19]

其它参考1


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


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


编辑(2017):


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

其它参考2


经过一些调查和一般的拉毛解决方案似乎是HTML2PDF。 DOMPDF做了一个糟糕的工作,包括表格,边框,甚至是中等复杂的布局,htmldoc似乎相当健壮,但几乎完全是CSS无知的,我不想回到没有CSS的HTML布局,只为该程序。[23]]] [24] [25]


HTML2PDF看起来最有希望,但我一直有关于node_type的空引用参数的这个奇怪的错误。我终于找到了解决方案。基本上,PHP 5.1.x在任何大小的字符串上使用正则表达式替换(preg_replace_ *)都能正常工作。 PHP 5.2.1引入了一个名为 pcre.backtrack_limit 的php.ini配置指令。此配置参数的作用是限制完成匹配的字符串长度。为什么要引入这个我不知道。默认值被选为100,000。为什么这么低的值?再次,不知道。


针对此问题针对PHP 5.2.1提出了一个错误,该错误几乎在两年之后仍然是。<[[em]]。[26]


令人恐惧的是,当超过限制时,替换只是默默地失败。至少如果错误被提出并记录下来,你就会知道发生了什么,为什么以及什么改变来修复它。但不是。


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



  • pcre.backtrack_limit=2000000; #可能比我需要的还要多,但那没关系

  • memory_limit=1024M; #yes,一千兆字节;和

  • max_execution_time=600; #yes, 10分钟



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


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


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

其它参考3


你为什么不试试mPDF 2.0版?我用它来创建PDF文档。它工作正常。[27]


与此同时,mPDF版本为5.7,与HTML2PS/HTML2PDF相比,它是主动维护的


但请记住,文档真的很难处理。例如,看一下这个页面:https://mpdf.github.io/。 [28]


可以使用此库完成围绕html到pdf的非常基本的任务,但更复杂的任务需要一些时间来阅读和理解文档。

其它参考4


1)使用MPDF!



a)yourfolder [29]中的提取物


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 提取到根文件夹:[30]


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文件的页数很多......)

其它参考5


结帐TCPDF。它有一些HTML到PDF功能,可能足以满足您的需求。它也是免费的![31]

其它参考6


我建议 DocRaptor (使用PrinceXML作为引擎)[32]

其它参考7


只是为了碰撞线程,我已经尝试了DOMPDF并且它工作得很好。我已经使用DIV和其他块级元素来定位所有内容,严格保持CSS 2.1并且它很好地运行。

其它参考8


好消息!活泼的!! [33]


Snappy是一个非常简单的开源PHP5库,允许从url或html页面生成缩略图,快照或PDF。并且...它使用优秀基于webkit的 wkhtmltopdf [34]


请享用! ^ _ ^

其它参考9


好吧,如果你想找到一个完美的XHTML + CSS到PDF转换库,那就别忘了。它远非可能。因为它就像找到一个完美的浏览器(XHTML + CSS渲染引擎)。我们有吗? IE或FF?


我在DOMPDF上取得了一些成功。问题是你必须修改HTML + CSS代码以适应库的工作方式。除此之外,我有很好的结果。


见下文:


原始HTML [35]


将HTML转换为PDF [36]

其它参考10


它已被提及,但我想确认mpdf是最简单,最强大,最免费的html到pdf转换器。天空真的是极限。你甚至可以生成动态的,用户生成的数据的pdf。


例如,客户想要一个CMS系统,这样他就可以更新他在俱乐部演奏的音乐的曲目列表。这没问题,但他也希望用户能够下载播放列表的.pdf,所以这个可下载的pdf也必须由cms更新。感谢mpdf,有一些简单的循环和散布的变量,我可以做到这一点。我认为会花费数周时间的东西花了我几分钟。


很棒的文章帮助我开始。[37]

其它参考11


我正在使用fpdf使用php生成pdf文件。到目前为止,它对我来说很有效,可以产生简单的输出。

其它参考12


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

其它参考13


开场白帖中最初提到的 HTML2PDF和HTML2PS 是在谈论2009年的一揽子计划[40]


但有一个更好的HTML2PDF [41]


它基于TCPDF,但部分是法语。


您可以在页面上重复使用表格页眉或页脚,并具有页码和总页数。查看其示例。我已经使用它超过三年并推荐它。[42]

其它参考14


就成本而言,在许多情况下使用Web服务(API)可能是更明智的方法。此外,通过外包此流程,您可以减轻自己的基础架构/后端负担 - 并且 - 如果您使用的是信誉良好的服务 - 请确保兼容调整Web标准,正常运行时间,缩短处理时间和快速交付内容。


我已经对目前市场上的大多数网络服务做了一些研究,请在下面找到我认为值得一提的API,基于价格/价值比的订单。所有这些都是预先提供的PHP类和包。



  1. pdflayer.com - 费用:$ - 质量:☆☆☆☆

  2. docraptor.com - 费用:$$$ - 质量:☆☆☆☆☆

  3. pdfcrowd.com - 费用:$$ - 质量:☆☆☆



质量: [43] [44] [45]


DocRaptor拥有高质量的引擎PrinceXML作为主干,显然提供最佳的PDF质量,返回高度抛光和转换良好的PDF文档。但是,pdflayer API服务在这里非常接近。 Pdfcrowd不一定按质量得分,而是加工速度。 [46] [47] [48]


费用:


pdflayer.com - 如上所述,这里最具成本效益的选择是pdflayer.com,提供100个月度PDF和高级订阅的完全免费订阅计划,范围在9.99美元到119.99美元之间。 每月10,000份PDF文档的价格为39.99美元。


docraptor.com - 提供7天免费试用期。高级订阅计划的价格从15美元到2250美元不等。 每月10,000份PDF文档的价格约为300.00美元。


pdfcrowd.com - 免费提供100个PDF 一次。高级订阅计划的价格从9美元到89美元不等。 每月10,000份PDF文档的价格约为49.00美元。


我已经使用了它们中的所有三个,这个文本应该帮助任何人决定而不必为所有这些付费。这个文本没有被认可支持任何一个产品,我与任何产品没有任何关系。

其它参考15


Darryl Hein提到的TCPDF可能是一个好主意.Nicola Asuni的代码非常方便和强大。唯一的杀手是,如果您计划将PDF文件与生成的PDF合并,则它不具备这些功能。您必须创建PDF,然后使用像Sid Steward的PDFTK(www.pdflabs.com/tools)合并它。/pdftk-the-pdf-toolkit/).[49]

其它参考16


如果您可以访问命令行,则可以使用 PhantomJS URL(远程或本地)创建PDF


它工作得很好,是一个免费的解决方案。


看看这个针对这个问题的示例脚本。[50]

其它参考17


这个问题已经很老了,但没有人看到有人提到CutyCapt所以我会:)[51]


CutyCapt



  CutyCapt是一个小型的跨平台命令行实用工具
  捕获WebKit将网页渲染成各种矢量和
  位图格式,包括SVG,PDF,PS,PNG,JPEG,TIFF,GIF和BMP [52]


其它参考18


尝试抓住最新的每晚 dompdf 构建 - 我使用的是旧版本,这是一个非常糟糕的资源,并且永远用于渲染我的pdf。从这里抓到一夜之后。[53]


生成PDF只需要几秒钟 - 而且它与 PrinceXML / Docraptor 一样精彩呈现。似乎他们自从我上次使用它以来已经认真优化了 dompdf 代码!

其它参考19


也许您可以在将文件传递给转换器之前尝试使用Tidy。如果其中一个渲染器在某些HTML问题上窒息(如未关闭的标记),则可能有所帮助。

其它参考20


我不认为php类最适合用css渲染xHtml页面。


当新的css规则问世时会发生什么? (很快css 3.0 ...)


渲染html页面的最佳方法是obvisiuly,一个浏览器。
Firefox 3.0本身可以打印pdf格式,torisugary开发了一个扩展(命令行打印)来使用它。在这里你会找到它。[54]


无论如何,还有很多问题在于firefox 只是作为pdf转换器......


目前,我认为wkhtmltopdf是最好的(这是safari浏览器使用的那个),快速,快速,真棒。
是的,开源也是......
看看[55]

其它参考21


我开发了一个公共API来从网页构建PDF文件。它有一个很好的PHP客户端类,使它非常易于使用。它使用wkhtmltopdf在云中呈现PDF。


不需要HTML中的任何特殊内容。在images/css/js链接中不需要绝对URL。也适用于localhost(开发机器)。


目前,该服务在4个Azure区域设有终端:美国东​​部,美国西部,欧盟北部,东南亚。


它很快,因为它使用专有协议将网页内容发送到API以转换为PDF。


它很可靠,因为所有端点都是负载平衡的。


免费帐户可用于测试或低使用率。网站上的详细信息:


https://rotativahq.com [56]

其它参考22


虽然已经提供了很多解决方案,但我推荐以下两个:



  1. HTM2PDF - 提供了一个将HTML转换为PDF的API,还有一个PHP SDK,这使得在PHP中实现它非常容易;它提供欧洲,亚洲和美国的服务器位置选择

  2. PDFmyURL - 提供了一个将URL和HTML格式化为PDF的API,其功能与HTM2PDF大致相同,但是在负载均衡的环境中运行并且已经存在了一段时间



与前面提到的所有解决方案中的这两个API不同的是,除了使用CSS和JavaScript将HTML转换为PDF之外,它还提供PDF权限管理,水印和加密。因此它是一个全能的 - 一个解决方案,适合那些想要开始运行的人。[57] [58]


免责声明:我为Kaiomi工作,这是一家经营这两个网站的公司。

其它参考23


精细渲染并不意味着什么。它是否有效?


无论输入多么糟糕,所有浏览器都会尽最大努力在屏幕上显示内容。当然,他们不会做同样的事情。如果你想要与FireFox相同的渲染,你可以使用它的渲染引擎。有pdf生成器。不过,这是一项非常多的工作。

其它参考24


我推荐TCPDF或DOMPDF,就是这个命令

其它参考25


我已经为PHP尝试了很多不同的库。所有列出的我都试过了。
在我看来,TCPDF库是最佳的折衷性能/可用性。
安装和使用非常简单,在小型介质应用中也具有良好的性能。
如果您需要高性能和非常大的PDF文档,请使用Zend_PDF模块,但要准备好编码![59] [60]

其它参考26


使用PHP,HTML到PDF转换真的需要在服务器端发生吗?


我刚刚遇到了jsPDF,一个使用HTML5/JavaScript的客户端解决方案。麻省理工学院授权的代码也在GitHub上。[61] [62]

其它参考27


TCPDF工作正常,没有依赖关系,是免费的,并且经常被修复。如果提供的HTML/CSS内容格式良好,则速度合理。我通常生成50 - 300 kB的HTML输入(包括CSS),并在1-3秒内获得PDF输出,包含10 - 15个PDF页面。


我强烈建议在向TCPDF发送任何内容之前使用整洁库作为HTML漂亮的格式化程序。

其它参考28


不是 PHP ,而是 Java 库,它完成了这件事:[63]



  Flying Saucer采用XML或XHTML并且符合CSS 2.1标准
  样式表,以呈现为PDF



它可以通过system()或类似的调用从 PHP 中使用。虽然它需要 XML input的良好格式。

其它参考29


Web API



如果有人总是在搜索这类内容,那么有一个免费网站,可让您转换html代码&页面到pdf。还有一个(非常小的)api,允许你从url获取pdf文件。


在此处查看 [64]