使用 PHP 将 HTML 转换为 PDF(不是 PDF 到 HTML)[关闭]

Posted

技术标签:

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

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

我的搜索发现了以下可能的解决方案。其中包括一些 PHP 库和一些命令行应用程序。每个都有自己的优点和缺点。

PHP 库:

    fpdf(需要更多努力转换) tcpdf(需要更多的努力来转换) html2fpdf http://html2fpdf.sourceforge.net html2pdf http://html2pdf.fr/ dompdf http://code.google.com/p/dompdf/(与其他相比,效果很好)

对于每个库,我都有以下问题:

    需要很长时间(转换 30 个 HTML 页面超过五分钟)

    需要太多资源(内存和时间)

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

    max_execution_time = 600memory_limit = 250M

    但还是不行。)

    HTML 页面需要格式正确(例如,没有丢失关闭标签)

当我尝试转换简单的 HTML 文档(只有很少的 CSS 的五个或更少页面)时,所有这些都可以工作

命令行应用程序

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

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

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

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

    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 未激活

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

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

哪个 PHP 库适合我的情况?

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

【问题讨论】:

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

关于wkhtmltopdf

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

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

【讨论】:

多页表失败了 不,它没有。你只需要用 css 处理这种问题:***.com/questions/1763639/…【参考方案2】:

试试这个:

tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_examples fpdf.org http://code.google.com/p/wkhtmltopdf/

【讨论】:

@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】:

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

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

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

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

【讨论】:

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

几个问题和建议:

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

【讨论】:

除了上面提到的那些之外,你知道任何命令行应用吗? 对于 PHP,我只使用过 dompdf,每次调用平均只需打印 3 页。我使用的唯一其他 PDF 生成器是 JasperReports,但我认为它仅适用于 Java。也许您可以从命令行获取错误的整个堆栈跟踪。

以上是关于使用 PHP 将 HTML 转换为 PDF(不是 PDF 到 HTML)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将 HTML 转换为 PDF? [复制]

如何使用php将html转换为pdf?

使用PHP将带有样式(css)的html转换为pdf

如何在php中将页面保存为pdf

使用 JavaScript 将 HTML 转换为 PDF

LibreOffice 将 PDF 转换为 Word 作为文本框而不是普通文档