使用PHP将HTML转换为PDF(而不是将PDF转换为HTML)

26

我是一名PHP开发人员,在我的一个项目中,我需要将一些HTML文档(大约30到50页)转换为PDF文档。

我的搜索结果显示可能有以下几种解决方案。它们中包括一些PHP库和一些命令行应用程序。每个库都有其自身的优缺点。

PHP库:

  1. fpdf(需要更多努力进行转换)
  2. tcpdf(需要更多努力进行转换)
  3. html2fpdf http://html2fpdf.sourceforge.net
  4. html2pdf http://html2pdf.fr/
  5. dompdf http://code.google.com/p/dompdf/(与其他相比效果较好)

对于每个库,我都有一些问题,例如:

  1. 花费时间太长(将30个HTML页面转换需要超过五分钟)
  2. 需要太多资源(内存和时间)

    (我在php.ini中设置了以下参数:

    max_execution_time = 600
    memory_limit = 250M

    但事情仍然无法解决。)

  3. 需要HTML页面格式正确(例如没有缺失的关闭标签)

所有这些都可以在我尝试转换简单的HTML文档(五页或更少,带有少量CSS)时工作。

命令行应用程序

所有命令行应用程序都可以完美地快速运行,与上述库相比较,但只有当我直接在控制台上运行它们时才有效。当我尝试使用exec()system()在PHP中运行它们时,它们会给我报错。

以下是命令行应用程序及其在PHP中运行时的错误:

  1. html2pdf (http://www.tufat.com/s_html2ps_html2pdf.htm)

    html2pdf:11380): Gtk-WARNING **: 无法打开显示::0.0
    未指定任何协议

  2. wkhtmltopdf

    正在加载页面:10%
    正在加载页面:33%
    正在加载页面:100%
    等待重定向
    输出页面
    QPainter::begin(): 返回 false
    QPainter::begin(): 返回 false
    QPainter::save: 画家未处于活动状态
    QPainter::scale: 画家未处于活动状态
    QPainter::setRenderHint: 必须使画家处于活动状态才能设置呈现提示
    QPainter::setBrush: 画家未处于活动状态
    QPainter::pen: 画家未处于活动状态
    QPainter::setPen: 画家未处于活动状态

  3. htmltopdf (http://www.ultrashareware.com/html-to-pdf.htm)

  4. 所以我现在正在寻求帮助。有人可以回答:

    哪个PHP库在我的情况下工作得很好?

    为什么这些错误会在命令行应用程序中发生?


错误“Gtk-WARNING **:无法打开显示::0.0”是因为应用程序使用了窗口系统。我猜测这个错误发生的原因是应用程序在生成PDF后尝试打开它? - rogeriopvl
不,生成后它不会打开PDF。但在控制台中使用时,它会打开一个小窗口。 - Santosh S
因为有很多类似但不完全相同的问题,所以我决定尝试收集一个完整的HTML到PDF转换器列表,并将其放入社区维基问题中http://stackoverflow.com/questions/3178448/list-of-html-to-pdf-converters - rjmunro
在SO上离题了,但是https://softwarerecs.stackexchange.com/q/45903/1834 - Martin Thoma
8个回答

8
关于 wkhtmltopdf
  • 这个工具非常快速,能够处理各种你投入其中的 HTML/CSS。因此,当你需要速度时,应该认真考虑使用它。我们公司最近切换到它,PDF 服务的速度得到了巨大提升。

  • 至少在 Linux 下,它需要安装 XOrg 库 - 服务器通常没有这些库,所以这可能是你的问题。


它在多页表格方面表现非常糟糕。 - andho
不,它并不会。你只需要使用CSS来处理这种问题:https://dev59.com/ZnI-5IYBdhLWcg3wn5y5 - Carlos2W

3

1
@FDisk,我已经尝试过了,并且在我的问题中也提到了同样的内容。 - Santosh S

2

2
哼?但它很贵,需要495美元! - Santosh S
2
DocRaptor.com使用Prince作为引擎(因此您可以获得相同的出色结果),但价格更便宜(小型计划免费)。 - Julie
2
嗯,你的回答历史记录表明你对这项服务有一定的兴趣 Julie——如何透露全部信息? - user159895
Prince很棒,但太贵了 :( - andho

1

有许多解决方案可以将HTML转换为PDF,我可以向您推荐https://grabz.it提供的解决方案。

他们拥有灵活的PHP API,可由cronjobs或直接从PHP网页使用。

如果您想尝试它,首先应该获取应用程序密钥+密钥以进行授权和开发免费SDK

这是一个基本实现的示例。

//First init
include("GrabzItClient.class.php");

// Create the GrabzItClient class
// Replace "APPLICATION KEY", "APPLICATION SECRET" values for your account!
$grabzIt = new GrabzItClient("Application Key", "Application Secret");

// To take a PDF screenshot
$grabzIt->URLToPDF("http://www.google.com");

// To save in case public callback handler is available
$grabzIt->Save("http://www.example.com/handler.php");   
// OR To save in case public callback handler is not available,
// it's a synchonous method can be usedthe will force your application to wait 
// while the screenshot is created
$filepath = "images/result.jpg";
$grabzIt->SaveTo($filepath);    

你可以获取其他类型的截屏,例如图像截屏等


1

格式很差,尚不支持CSS2.1。 - andho

0

但是,如果您使用任何在线服务并通过HTTP发送您的HTML内容呢?当然,其中大多数都不是免费的。


你能推荐一些在线服务以及它们的URL/链接吗? - Santosh S
http://www.freepdfconvert.com 是免费的,正如其名称所示。另一方面,自动化使用它可能不是最容易的事情,但它可以接受上传的文件或URL。 - Julian
这可能需要一段时间来创建大量的PDF集合。 - user170442
freepdfconvert.com不支持Flash文件和JavaScript。生成的PDF文件与网站外观并不完全相同。例如,我尝试了pazintys.com。 - FDisk

0
一种可能性是使脚本自动执行以下操作:
  1. 获取网页
  2. 在Web浏览器中打开该页面
  3. 截取该页面的屏幕截图
  4. 将其转换为PDF格式
第4步很容易 - 有很多PHP/cmdline库可以让您将图像放入PDF中或将它们转换为PDF(例如,fpdf)。
对于步骤1-3...您可以尝试查看此处的代码:http://browsershots.org/。不确定它是否相关 - 它似乎需要大量设置。也许他们的架构可以工作?

但是,在HTML页面中的链接或锚标签呢? - Santosh S
3
这是一个糟糕的解决方案。它将把所有文本转换成位图图形。它将使用屏幕 CSS 而不是打印 CSS。它只会显示适合屏幕截图的页面部分。有很多更好的方法可以实现。请不要这样做! - rjmunro

0

几个问题和建议:

  • 您真的需要将其转换为PDF吗?为什么?在某些情况下,坚持使用HTML可能更好。
  • 升级生成PDF的服务器硬件是否可行?我之所以问这个问题是因为如果您尝试的所有库都需要很长时间才能创建,那么您唯一的选择可能是升级服务器。
  • 您可能希望解决命令行错误的问题。如果它可以提供最快的结果,请找到一个解决方法。

除了问题中提到的那些,你知道有没有其他的命令行应用程序? - Santosh S
对于PHP,我只使用过dompdf,并且每次调用只需要打印平均3页。我使用过的唯一其他PDF生成器是JasperReports,但我认为它仅适用于Java。也许你可以在命令行中发布错误的完整堆栈跟踪。 - Randell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接