1701

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

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

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

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

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

4

30 回答 30

671

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

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

编辑(2017):

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

于 2009-08-31T13:36:14.910 回答
562

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

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


看看PrinceXML

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

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

PrinceXML 示例

于 2009-01-12T08:47:28.523 回答
153

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

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; # 是的,1 GB ; 和
  • max_execution_time = 600;# 是的,10 分钟

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

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

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

于 2009-01-12T03:51:12.257 回答
128

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

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

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

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

于 2010-03-26T11:11:18.030 回答
73
  1. 使用MPDF!==

a) 提取yourfolder

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

<?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):

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

于 2013-11-28T14:52:06.673 回答
58

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

于 2009-02-21T20:50:48.933 回答
33

只是为了解决问题,我尝试了 DOMPDF 并且效果很好。我已经使用DIV和其他块级元素来定位所有内容,我严格遵守 CSS 2.1 并且它播放得非常好。

于 2009-01-21T23:32:29.830 回答
32

我建议使用DocRaptorPrinceXML用作“引擎”)

于 2010-11-13T00:48:16.677 回答
30

好消息!活泼!!

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

享受!^_^

于 2011-11-21T20:23:29.790 回答
30

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

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

帮助我入门的好文章。

于 2013-02-18T20:50:34.343 回答
27

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

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

见下文:

原始 HTML

将 HTML 转换为 PDF

于 2008-12-27T06:17:59.147 回答
26

最初在开篇文章中提到的HTML2PDF 和 HTML2PS正在谈论带有此链接的 2009 软件包

但是有更好的HTML2PDF

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

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

于 2015-05-07T10:43:28.097 回答
23

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

于 2009-02-21T20:21:17.053 回答
22

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

于 2008-12-24T09:46:11.727 回答
17

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

于 2010-08-24T19:01:54.013 回答
16

尝试获取最新的夜间dompdf版本 - 我使用的是旧版本,这是一个可怕的资源消耗,并且需要很长时间才能渲染我的 pdf。从这里抓了一个晚上之后。

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

于 2011-08-10T13:16:42.940 回答
13

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

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

  1. pdflayer.com - 成本:$ - 质量:☆☆☆☆
  2. doraptor.com - 成本:$$ - 质量:☆☆☆☆☆</li>
  3. pdfcrowd.com - 成本:$$ - 质量:☆☆☆</li>

质量:

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

成本:

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 美元。

我已经使用了所有这三个,并且这篇文章应该可以帮助任何人做出决定,而不必为所有这些付费。本文并非为支持任何一种产品而编写,我与任何产品均无从属关系。

于 2016-02-11T17:51:41.927 回答
12

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

它工作得非常好,并且是一个免费的解决方案。

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

于 2014-10-08T14:14:59.863 回答
11

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

CutyCapt

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

于 2012-02-20T15:19:17.723 回答
11

我推荐 TCPPDF 或 DOMPDF,按这个顺序。

于 2013-05-17T12:38:12.163 回答
9

我不认为 php 类最适合用 css 呈现 xHtml 页面。

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

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

无论如何,仍然有很多问题运行 firefox只是作为一个 pdf 转换器......

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

于 2009-05-12T21:02:00.500 回答
9

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

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

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

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

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

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

https://rotativahq.com

于 2016-06-22T14:22:52.100 回答
8

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

于 2008-12-24T09:16:29.960 回答
7

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

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

于 2008-12-24T09:09:27.183 回答
7

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

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

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

免责声明:我在经营这两个网站的公司 Kaiomi 工作。

于 2014-06-02T17:59:32.290 回答
5

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

我刚刚遇到jsPDF,一个使用 HTML5/JavaScript 的客户端解决方案。MIT 许可的代码也在 GitHub 上

于 2013-08-29T15:06:44.533 回答
5

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

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

于 2013-12-08T11:09:22.980 回答
4

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

于 2013-05-22T06:47:40.477 回答
3

网络 API

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

在这里检查

于 2014-04-23T14:40:16.993 回答
2

不是PHP,而是一个Java library,它做的事情:

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

它可以从PHP viasystem()或类似的调用中使用。尽管它需要XML格式良好的input.

于 2012-10-03T17:33:49.420 回答