如何将 HTML 和 CSS 添加到 PDF [关闭]

Posted

技术标签:

【中文标题】如何将 HTML 和 CSS 添加到 PDF [关闭]【英文标题】:How Can I add HTML And CSS Into PDF [closed] 【发布时间】:2010-09-28 07:22:13 【问题描述】:

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

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

DOMPDF: 桌子有很大的问题。我分解了我的大型嵌套表并且它有所帮助(在它消耗高达 128M 的内存然后死亡之前——这是我在 php.ini 中的内存限制)但它使表完全混乱并且似乎没有得到图片。表格只是一些基本的东西,带有一些边框样式,可以在各个点添加一些线条; HTML2PDF and HTML2PS:实际上我的运气更好。它渲染了一些图像(所有图像都是谷歌图表 URL),表格格式要好得多,但它似乎有一些我还没有弄清楚的复杂性问题,并且一直死于未知的 node_type() 错误。不知道从这里去哪里;和 Htmldoc:这似乎在基本 HTML 上运行良好,但几乎不支持 CSS,所以你必须在 HTML 中做所有事情(我没有意识到在 Htmldoc-land 中它仍然是 2001 年......)所以它没用我。

我尝试了一个名为 Html2Pdf Pilot 的 Windows 应用程序,它实际上做得相当不错,但我需要至少在 Linux 上运行并且最好通过 Web 服务器上的 PHP 按需运行的东西。

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

【问题讨论】:

Html2Pdf 实际上使用 IE 的嵌入式实例来呈现页面,然后将其转换为 PDF - 可能通过 IE 的打印机制。 因为这是 2008 年的问题,所以 dompdf 现在更加成熟。 ;-) dompdf 现在支持 CSS 2.1,可以处理 @import@media@screen 规则,并且会加载外部样式表。它还捆绑了它工作所需的一切,尽管您可以安装一些东西以获得比默认库更好的性能。 code.google.com/p/dompdf 2015 更新:在研究了很多选项后,我们决定使用 wkhtmltopdf 它是一个很好的实用程序,我们在 CSS 方面遇到了困难,因为我们有外部 CSS 文件,但后来我们应用了放置 CSS 虚拟链接的技巧在我们要转换的 HTML 元素上并设置正确的路径,它的工作原理就像 MAGIC !!! 我相信很快每个人都会发现 Chrome/Chromium headless chrome --headless --print-to-pdf="path/to/pdf" https://your_url 是最丰富、最快和最简单的 html 到 pdf 生成工具 crbug.com/603559,因为它支持大多数 html 功能,开发人员依赖于 web 开发并且不像大多数其他库和工具一样吸收复杂的脚本。 【参考方案1】:

看看wkhtmltopdf 。它是开源的,基于 webkit 并且是免费的。

我们写了一个小教程here。

编辑(2017 年):

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

【讨论】:

【参考方案2】:

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

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

PDFShift Restpack PDF Layer DocRaptor HTMLPDFAPI HTML to PDF Rocket

看看PrinceXML。

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

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

PrinceXML Samples

【讨论】:

【参考方案3】:

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

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

bug was raised against PHP 5.2.1 for this,将近两年后仍然开放

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

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

pcre.backtrack_limit = 2000000; # 可能比我需要的多,但没关系 memory_limit = 1024M; # 是的,1 GB;和 max_execution_time = 600; # 是的,10 分钟

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

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

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

【讨论】:

【参考方案4】:

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

与此同时,mPDF 版本为 5.7,并且与 HTML2PS/HTML2PDF 相比,它得到积极维护

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

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

【讨论】:

【参考方案5】:
    使用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!

    解压pdftohtml.exe到你的根目录:

    在该文件夹中,在 anyfile.php 文件中,放置这段代码(假设也有源 example.pdf):

    输入FinalFolder,就会有转换后的文件(与源PDF一样多页..)

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

只是为了解决问题,我尝试了 DOMPDF,它运行良好。我使用DIV 和其他块级元素来定位所有内容,我严格按照 CSS 2.1 保留它,而且效果非常好。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

好消息! Snappy!!

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

享受吧! ^_^

【讨论】:

【参考方案10】:

已经提到过,但我想确认 mpdf 是目前最简单、最强大和最免费的 HTML 到 pdf 转换器。天空真的是极限。您甚至可以生成用户生成的动态数据的 pdf。

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

很棒的 article 帮助我入门。

【讨论】:

【参考方案11】:

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

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

见下文:

Original HTML

Converting HTML to PDF

【讨论】:

【参考方案12】:

最初在开篇文章中提到的 HTML2PDF 和 HTML2PS 是在谈论带有 link 的 2009 年包

但是有更好的HTML2PDF

它基于 TCPDF,尽管它部分是法语。

您可以设置在页面上重复的表格页眉或页脚,并设置页码和总页数。见its examples。我已经用了三年多了,推荐它。

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

在 Zend 的 devzone 上有一个关于从 php(part 1,part 2)生成 pdf 的教程,无需任何外部库。我从来没有实现过这种解决方案,但由于都是 php,你可能会发现它的实现和调试更灵活。

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

尝试获取最新的夜间 dompdf 版本 - 我使用的是旧版本,该版本非常消耗资源,并且需要很长时间才能渲染我的 pdf。从here 获取一晚后。

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

【讨论】:

【参考方案17】:

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

我已经对目前市场上的大多数网络服务进行了一些研究,请在下面找到我认为在这个线程中值得一提的 API,按照价格/价值比排序。它们都提供预先组合的 PHP 类和包。

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

质量:

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

费用:

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

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

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

我已经使用了所有这三个,本文旨在帮助任何人做出决定,而无需为所有这些付费。撰写本文并非为任何一种产品背书,我与任何产品均无从属关系。

【讨论】:

【参考方案18】:

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

效果很好,而且是免费的解决方案。

看看这个针对这个确切问题的example 脚本。

【讨论】:

【参考方案19】:

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

CutyCapt

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

【讨论】:

【参考方案20】:

我推荐 TCPPDF 或 DOMPDF,按顺序。

【讨论】:

【参考方案21】:

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

当新的 CSS 规则出现时会发生什么? (很快 css 3.0...)

呈现 html 页面的最佳方式显然是浏览器。 Firefox 3.0 可以原生地以 pdf 格式“打印”,torisugary 开发了一个扩展(命令行打印)来使用它。 Here you'll find it.

不管怎样,运行firefox还是有很多问题只是作为pdf转换器...

目前,我认为 wkhtmltopdf 是最好的(即 safari 浏览器使用的那个),速度快,速度快,很棒。 是的,开源也是... Give it a look

【讨论】:

如果您想输出某种类型的官方文档(例如用户收据),PHP 非常有用,您可以使用 CSS 使其看起来更漂亮。【参考方案22】:

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

HTML 中不需要任何特殊的东西。在 images/css/js 链接中不需要绝对 URL。也适用于本地主机(开发机器)。

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

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

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

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

https://rotativahq.com

【讨论】:

【参考方案23】:

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

【讨论】:

是的,这是一个有效的观点,但我已经想到了这一点。我的 HTML 中没有不匹配或不标准的标签。【参考方案24】:

精细渲染并不意味着什么。它验证吗?

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

【讨论】:

【参考方案25】:

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

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

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

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

【讨论】:

it's up for sale 时我不想依赖服务。鉴于它在那次拍卖中没有售出,我只能假设它会在不久的将来售出? 其实我公司是在拍卖之后的一段时间里买的...... 这样的话,我想没什么好担心的。【参考方案26】:

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

我刚刚遇到jsPDF,这是一个使用 HTML5/JavaScript 的客户端解决方案。 MIT 许可的 code is on GitHub 也是。

【讨论】:

对我来说,图书馆非常有限【参考方案27】:

TCPD 工作正常,无依赖,免费且不断修正错误。如果提供的 HTML/CSS 内容格式正确,它具有合理的速度。我通常生成 50 - 300 kB 的 HTML 输入(包括 CSS),并在 1-3 秒内获得 10 - 15 个 PDF 页面的 PDF 输出。

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

【讨论】:

【参考方案28】:

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

【讨论】:

Zend PDF 无法从 HTML 转换【参考方案29】:

网络 API

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

Check it here

【讨论】:

【参考方案30】:

不是PHP,而是Java library,它可以做到这一点:

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

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

【讨论】:

以上是关于如何将 HTML 和 CSS 添加到 PDF [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将 html+css 内容添加到 mPDF

完全支持 CSS3 和 HTML5 的 Python HTML 到 PDF

使用飞碟将图像渲染为内存中的 PDF

如何将 HTML5 / CSS3 文档转换为 PDF?

如何将 HTML 页面转换为 PDF 然后下载?

如何将HTML格式转化为word