如何将超文本标记语言和CSS添加到PDF中

我有一个超文本标记语言(不是XHTML)文档,在Firefox 3和IE 7中呈现良好。它使用相当基本的CSS来设置样式,并在超文本标记语言中呈现良好。

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

  • DOMPDF:它在表格方面有很大的问题。我分解了我的大型嵌套表格,它有所帮助(在它消耗128M内存之前-这是我在php.ini中对内存的限制),但它使表格变得一团糟,似乎没有得到图像。表格只是一些基本的东西,有一些边框样式,可以在不同的点添加一些行;
  • HTML2PDF和HTML2PS:实际上我的运气更好一些。它渲染了一些图片(所有的图片都是谷歌图表URL),表格格式也更好,但它似乎有一些我还没有弄清楚的复杂性问题,并且一直死于未知的node_type()错误。不知道从这里到哪里去;和
  • htmldoc:这似乎在基本的超文本标记语言上工作得很好,但几乎不支持CSS,所以你必须用超文本标记语言做所有的事情(我没有意识到它仍然是2001年的Htmldoc-land…)所以对我来说没用。

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

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

948621 次浏览

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

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

也许您可以尝试在将文件交给转换器之前使用Tidy。如果其中一个渲染器因某些超文本标记语言问题(如未关闭的标记)而窒息,它可能会有所帮助。

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

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

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

见下图:

原始超文本标记语言

将超文本标记语言转换为PDF

DOMPDF在表格,边框甚至适度复杂的布局方面做得很糟糕,htmldoc看起来相当健壮,但几乎完全不了解CSS,我不想回到没有CSS的超文本标记语言布局,只是为了那个程序。

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

Abug针对PHP 5.2.1,仍然打开近两年后

可怕的是,当超过限制时,替换只是默默地失败。至少如果错误被引发并记录下来,你会有一些指示发生了什么,为什么以及要更改什么来修复它。但是没有。

所以我有一个70k超文本标记语言文件变成PDF。它需要以下php.ini设置:

  • pcre.backtrack_limit=2000000;#可能比我需要的多,但没关系
  • memory_limit=1024M;#yes,一兆字节;和
  • max_execution_time=600;#是的,10分钟

现在精明的读者可能已经注意到我的超文本标记语言文件比100k小。我能猜到为什么我遇到这个问题的唯一原因是html2pdf在这个过程中转换为xhtml。也许这让我接受了(尽管近50%的膨胀看起来很奇怪)。不管是什么情况,上面的工作。

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

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

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

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


看看princexml

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

哦,是的,我有没有提到这是第一个(也可能是唯一一个)HTML2PDF解决方案,完整的ACID2

PrinceXML示例

只是为了冲击线程,我尝试了DOMPDF,它工作得很好。我使用DIV和其他块级元素来定位所有内容,我严格遵守CSS 2.1,它玩得非常好。

我正在使用fpdf使用PHP生成PDF文件。到目前为止,生成简单的输出对我来说效果很好。

签出TCPDF。它有一些超文本标记语言到PDF功能,可能足以满足您的需求。它也是免费的!

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

当一个新的css规则出来时会发生什么?(很快css 3.0…)

渲染html页面的最佳方式显然是浏览器。Firefox 3.0可以原生以pdf格式“打印”,torisugary开发了一个扩展(命令行打印)来使用它。在这里你会找到它。

无论如何,仍然有许多问题运行Firefox只是作为pdf转换器…

目前,我认为wkhtmltopdf是最好的(这是Safari浏览器使用的),快速,快速,真棒。是的,开源也是…给我看看

看看#0。它是开源的,基于webkit且免费。

我们写了一个小教程这里

编辑(2017):

如果今天要建造什么东西,我不会再走那条路了。
但会使用http://pdfkit.org/代替。
可能会剥离它所有的nodejs依赖项,在浏览器中运行。

你为什么不试试mPDF版本2.0?我用它来创建PDF文档。它运行良好。

同时mPDF是5.7版本,它是积极维护的,与HTML2PS/HTML2PDF相比

但请记住,留档真的很难处理。例如,看看这个页面:https://mpdf.github.io/

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

Darryl Hein在上面提到的TCPDF 可能是个好主意。Nicola Asuni的代码非常方便和强大。唯一的杀手是如果你打算将PDF文件与生成的PDF合并,它没有这些功能。你必须创建PDF,然后使用Sid Steward(www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)的PDFTK之类的东西合并它。

我建议DocRaptor(使用PrinceXML作为“引擎”)

尝试抓取最新的夜间dompdf构建-我使用的是旧版本,这是一个可怕的资源占用,花了很长时间来渲染我的pdf。

生成PDF只花了几秒钟-它的渲染效果与princexml/Docraptor一样好。似乎自从我上次使用它以来,他们已经认真优化了dompdf代码!

好消息!Snappy

Snappy是一个非常容易开源PHP5库,允许从url或html页面生成缩略图、快照或PDF。而且…它使用优秀基于webkit的wkhtmltopdf

享受!^_^

这个问题已经很老了,但是还没有看到有人提到CutyCapt图片编辑,所以我会:)

CutyCapt图片编辑

CutyCapt图片编辑是一个小型跨平台命令行实用程序,用于捕获WebKit将网页渲染成各种矢量和位图格式,包括SVG、PDF、PS、PNG、JPEG、TIFF、GIF和BMP

不是php,而是Java库,它的作用是:

飞碟采用XML或XHTML并应用符合CSS 2.1的样式表,以便呈现为PDF

它可以从php通过system()或类似的调用使用。尽管它需要inputxml格式良好。

前面已经提到了,但我只想确认mpdf是最简单,最强大,最自由的超文本标记语言到pdf转换器。天空真的是极限。您甚至可以生成动态的pdf,用户生成的数据。

例如,一个客户想要一个CMS系统,这样他就可以更新他在俱乐部播放的音乐的曲目列表。这没问题,但他也希望用户能够下载播放列表的. pdf,所以这个可下载的pdf也必须由cms更新。多亏了mpdf,有了一些简单的循环和穿插变量,我就可以做到这一点。我认为需要几周时间的事情实际上花了我几分钟。

很棒的文章帮助我开始。

我推荐TCPDF或DOMPDF,按此顺序。

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

超文本标记语言PDF转换真的需要发生在服务器端使用PHP?

我刚刚遇到jsPDF,一个使用HTML5/JavaScript的客户端解决方案。麻省理工学院许可的代码在github上也是。

  1. 使用MPDF!==

a)在yourfolder中提取

b)在yourfolder中创建file.php并插入这样的代码:

<?phpinclude('../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):

  3. 输入最终文件夹,将有转换后的文件(与源PDF具有的页面一样多…)

TCPDF工作正常,没有依赖关系,是免费的,经常修复错误。如果提供的超文本标记语言/CSS内容格式良好,它具有合理的速度。我通常从50-300 kB的超文本标记语言输入(包括CSS)生成,并在10-15 PDF页面的1-3秒内获得PDF输出。

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

网页应用程序接口

如果有人总是搜索这种东西,有一个免费网站允许您将html代码和页面转换为pdf。还有一个(非常小的)API允许您从url获取pdf文件。

点击这里

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

  1. HTM2PDF-提供了将超文本标记语言转换为PDF的API,并且还具有PHP SDK,这使得在PHP中实现非常容易;它提供了欧洲,亚洲和美国的服务器位置选择
  2. 创建个人主页-提供了一个API,可以将URL和超文本标记语言转换为PDF,其功能与HTM2PDF大致相同,但适用于负载平衡的环境,并且已经存在了一段时间

这两个API与前面提到的所有解决方案的不同之处在于-除了使用CSS和JavaScript将超文本标记语言转换为PDF之外-它还提供PDF权限管理,水印和加密。因此,对于那些想要开始运行的人来说,这是一个一体化的解决方案。

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

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

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

看看这个为这个确切问题制作的示例脚本。

最初在开篇文章中提到的HTML2PDF和HTML2PS是关于这个链接的2009年包

还有更好的HTML2PDF

它以TCPDF为基础,但部分是法语。

您可以有在页面上重复的页眉或页脚,并有页码和总页数。参见其例子。我已经使用它三年多了,推荐它。

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

我已经对目前市场上的大多数Web服务做了一些研究,请在下面找到我认为值得一提的API,按照价格/价值比的顺序。他们都提供预先组成的PHP类和包。

  1. pdflayer.com-成本:$-质量:☆☆☆☆☆
  2. docraptor.com-成本: $$$ - 质量: ☆☆☆☆☆
  3. pdfcrowd.com-成本: $$ - 质量:☆☆☆☆

质量:

以高质量的引擎PrinceXML为骨干,DocRaptor显然提供了最好的PDF质量,返回高度抛光和转换良好的PDF文档。然而,PDflayerapi服务在这里非常接近。PDFCROW不一定以质量得分,而是以处理速度得分。

费用:

pdflayer.com-如上所述,这里最具成本效益的选择是pdflayer.com,为100个月的PDF和9.99美元至119.99美元之间的高级订阅提供完全免费的订阅计划。

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

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

这三个我都用过了,这篇文章是为了帮助任何人做出决定,而不必为所有这些产品付费。这篇文章不是为了支持任何一种产品而写的,我与任何一种产品都没有关系。

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

不需要超文本标记语言中的任何特殊内容。图像/css/js链接中不需要绝对URL。也适用于localhost(开发机器)。

目前,该服务在4个Azure区域拥有终结点:美国东部、美国西部、欧盟北部和东南亚。

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

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

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

https://rotativahq.com