使用 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 = 600
memory_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”是因为应用使用了窗口系统。我猜这个错误是因为应用程序在生成 PDF 后尝试打开它? 不,生成后无法打开pdf。但是在控制台中使用它时会打开一个小窗口。 因为有很多问题与这个问题相似但又不完全相同,所以我决定尝试将 HTML 到 PDF 转换器的完整列表收集到一个社区 wiki 问题***.com/questions/3178448/… 离题了,但是softwarerecs.stackexchange.com/q/45903/1834 【参考方案1】:但是,如果您将使用任何在线服务并通过 HTTP 发送您的 HTML 内容呢? 当然大部分都不是免费的。
【讨论】:
您能推荐任何在线服务及其网址/链接 freepdfconvert.com 是免费的,顾名思义。另一方面,自动使用它可能不是最简单的事情,但它可以使用上传的文件或 URL。 这可能需要一段时间才能创建大量 PDF。 freepdfconvert.com 不支持 Flash 文件和 javascript。生成的 pdf 与网站看起来不完全一样。例如,我尝试了 pazintys.com【参考方案2】:一种可能性:自动生成脚本:
-
获取网页
在网络浏览器中打开该页面
截取该页面的屏幕截图
将其转换为 PDF
第 4 步很简单 - 有很多 PHP/cmdline 库可让您将图像放入 pdf 或转换它们(例如,fpdf。)
对于第 1-3 步...您可以尝试查看此处的代码:http://browsershots.org/。不确定它是否相关 - 似乎需要大量设置。也许他们的架构可以工作?
【讨论】:
但是,html页面中的链接或锚标记呢? 这是一个糟糕的解决方案。它将所有文本转换为位图图形。它将使用屏幕 css 而不是打印 css。它只会显示尽可能多的页面,以适应屏幕截图。有很多方法可以做得更好。请不要这样做!【参考方案3】:几个问题和建议:
您真的需要将其转换为 PDF 吗?为什么?在某些情况下,最好坚持使用 HTML。 是否可以选择升级生成 PDF 的服务器的硬件?我问这个是因为如果您尝试创建的所有库都需要很长时间才能创建,那么您唯一的选择可能是升级服务器。 您可能希望通过命令行错误来解决问题。如果它给出了最快的结果,然后找到解决它的方法。【讨论】:
除了上面提到的那些之外,你知道任何命令行应用吗? 对于 PHP,我只使用过 dompdf,每次调用平均只需打印 3 页。我使用的唯一其他 PDF 生成器是 JasperReports,但我认为它仅适用于 Java。也许您可以从命令行获取错误的整个堆栈跟踪。【参考方案4】:关于wkhtmltopdf:
这东西运行速度极快,它还可以处理你扔给它的各种 HTML/CSS,所以当你需要速度时,你应该认真考虑它。我们公司最近切换到它,我们的 PDF 服务得到了极大的速度提升。
至少在 Linux 下它需要安装 XOrg 库 - 服务器通常没有它们,所以这可能是你的问题。
【讨论】:
多页表失败了 不,它没有。你只需要用 css 处理这种问题:***.com/questions/1763639/…【参考方案5】:试试这个:
tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_examples fpdf.org http://code.google.com/p/wkhtmltopdf/【讨论】:
@FDisk ,我已经尝试过了,我在我的问题中也提到了同样的问题【参考方案6】:你试过Prince吗?
【讨论】:
嗯嗯嗯?但它很贵,要 495 美元! DocRaptor.com 使用 Prince 作为引擎(因此您可以获得同样出色的结果),但价格便宜得多(对于小型计划免费)。 嗯。您的回答历史表明您对这项服务有某种兴趣 Julie - 全面披露一下怎么样? 王子摇滚,但太贵了:(【参考方案7】:试试 HTMLDOC 命令行工具项目https://www.msweet.org/htmldoc/index.html
【讨论】:
格式不好,还不支持CSS2.1【参考方案8】:将 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。
【讨论】:
以上是关于使用 PHP 将 HTML 转换为 PDF(不是 PDF 到 HTML)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章