【问题标题】:Converting HTML to PDF (not PDF to HTML) using PHP [closed]使用 PHP 将 HTML 转换为 PDF(不是 PDF 到 HTML)[关闭]
【发布时间】:2010-11-27 02:11:30
【问题描述】:

我是一名 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: Painter 未激活
    QPainter::scale:Painter 未激活
    QPainter::setRenderHint:Painter 必须处于活动状态才能设置渲染提示
    QPainter::setBrush: Painter 未激活
    QPainter::pen: Painter 未激活
    QPainter::setPen: Painter 未激活

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

所以现在我正在寻求帮助。谁能回答:

哪个 PHP 库适合我的情况?

为什么命令行应用程序会出现这些错误?

【问题讨论】:

  • 报错“Gtk-WARNING **: cannot open display::0.0”是因为应用使用了windowing系统。我猜这个错误是因为应用程序在生成 PDF 后尝试打开它?
  • 不,生成后无法打开pdf。但是在控制台中使用它时会打开一个小窗口。
  • 因为有很多问题与这个问题相似但又不完全相同,所以我决定尝试将 HTML 到 PDF 转换器的完整列表收集到一个社区 wiki 问题stackoverflow.com/questions/3178448/…

标签: php html pdf pdf-generation


【解决方案1】:

关于wkhtmltopdf

  • 这东西运行速度极快,它还可以处理你扔给它的各种 HTML/CSS,所以当你需要速度时,你应该认真考虑它。我们公司最近切换到它,我们的 PDF 服务得到了极大的速度提升。

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

【讨论】:

【解决方案2】:

试试这个:

【讨论】:

  • @FDisk ,我已经尝试过了,我在我的问题中也提到了同样的问题
【解决方案3】:

你试过Prince吗?

【讨论】:

  • 嗯嗯嗯?但它很贵,要 495 美元!
  • DocRaptor.com 使用 Prince 作为引擎(因此您可以获得同样出色的结果),但价格便宜得多(对于小型计划免费)。
  • 嗯。您的回答历史表明您对这项服务有某种兴趣 Julie - 全面披露一下怎么样?
  • 王子摇滚,但太贵了:(
【解决方案4】:

将 HTML 转换为 PDF 的解决方案有很多,我可以通过https://grabz.it 向您推荐一个。

有一个灵活的 PHP API,可供 cronjobs 或直接从 PHP 网页使用。

如果你想尝试,首先你应该得到一个app key + secret 用于授权和development free 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);    

可以获得其他类型的截图,例如image screenshot and etc

【讨论】:

    【解决方案5】:

    试试 HTMLDOC 命令行工具项目https://www.msweet.org/htmldoc/index.html

    【讨论】:

    • 格式不好,还不支持CSS2.1
    【解决方案6】:

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

    【讨论】:

    • 您能推荐任何在线服务及其网址/链接
    • freepdfconvert.com 是免费的,顾名思义。另一方面,自动使用它可能不是最简单的事情,但它可以使用上传的文件或 URL。
    • 这可能需要一段时间才能创建大量 PDF。
    • freepdfconvert.com 不支持 Flash 文件和 javascript。生成的 pdf 与网站看起来不完全一样。例如,我尝试了 pazintys.com
    【解决方案7】:

    一种可能性:自动生成脚本:

    1. 获取网页
    2. 在网络浏览器中打开该页面
    3. 截取该页面的屏幕截图
    4. 将其转换为 PDF

    第 4 步很简单 - 有很多 PHP/cmdline 库可以让您将图像放入 pdf 或转换它们(例如,fpdf。)

    对于第 1-3 步...您可以尝试查看此处的代码:http://browsershots.org/。不确定它是否相关 - 似乎需要大量设置。也许他们的架构可以工作?

    【讨论】:

    • 但是,html页面中的链接或锚标记呢?
    • 这是一个糟糕的解决方案。它将所有文本转换为位图图形。它将使用屏幕 css 而不是打印 css。它只会显示尽可能多的页面,以适应屏幕截图。有很多方法可以做得更好。请不要这样做!
    【解决方案8】:

    几个问题和建议:

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

    【讨论】:

    • 除了上面提到的那些之外,你知道任何命令行应用吗?
    • 对于 PHP,我只使用过 dompdf,每次调用平均只需打印 3 页。我使用的唯一其他 PDF 生成器是 JasperReports,但我认为它仅适用于 Java。也许您可以从命令行获取错误的整个堆栈跟踪。
    猜你喜欢
    • 2010-10-31
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多