有没有办法让 FPDF/FPDI 或 Zend_Pdf 支持解析大于 1.4 的 PDF?

Posted

技术标签:

【中文标题】有没有办法让 FPDF/FPDI 或 Zend_Pdf 支持解析大于 1.4 的 PDF?【英文标题】:Is there a way to make FPDF/FPDI or Zend_Pdf support the parsing of PDFs greater than 1.4? 【发布时间】:2010-10-14 05:02:55 【问题描述】:

我正在尝试将现有 PDF(以其他方式创建)添加到使用 FPDI 使用 FPDF 创建的 PDF。它似乎适用于大多数 PDF,但我收到以下错误:

FPDF error: Unable to find xref table.

经过一些测试,我发现如果我使用 1.4 或更低版本的 PDF 版本(Acrobat v5 或更低版本),它似乎可以工作。查看文件似乎是因为 PDF 格式不同。

是否有解决方法或解决方案?我可能有 10 000 多个用户上传的 PDF,其中一些是新的,有些不是。 FPDI 只是死掉而不是导致某种错误甚至返回 false 也很烦人

我现在能想到的唯一解决方案是解析 PDF 文件的第一行以确定版本,然后只添加那些可以工作的版本。

编辑:

我也在 Zend_Pdf 中尝试过,使用 Zend 框架附带的演示文件得到以下结果:

Fatal error: Uncaught exception 'Zend_Pdf_Exception' with message 'Cross-reference streams are not supported yet.' in /Volumes/Documents/temp/ZendFramework-1.7.7/library/Zend/Pdf/Parser.php:331
Stack trace:
#0 /Volumes/Documents/temp/ZendFramework-1.7.7/library/Zend/Pdf/Parser.php(455): Zend_Pdf_Parser->_loadXRefTable('116')
#1 /Volumes/Documents/temp/ZendFramework-1.7.7/library/Zend/Pdf.php(297): Zend_Pdf_Parser->__construct('/Volumes/Docume...', Object(Zend_Pdf_ElementFactory_Proxy), true)
#2 /Volumes/Documents/temp/ZendFramework-1.7.7/library/Zend/Pdf.php(250): Zend_Pdf->__construct('/Volumes/Docume...', NULL, true)
#3 /Volumes/Documents/temp/ZendFramework-1.7.7/demos/Zend/Pdf/demo.php(37): Zend_Pdf::load('/Volumes/Docume...')
#4 main
  thrown in /Volumes/Documents/temp/ZendFramework-1.7.7/library/Zend/Pdf/Parser.php on line 331

是否无法解析大于 1.4 的 PDF?

【问题讨论】:

【参考方案1】:

您可以将 FPDI 与 TCPDF 一起使用,它将生成和读取(使用 FPDI)1.7 版 PDF。

见TCPDF - PHP class for PDF。


编辑

我最近遇到了在 FPDI 和 TCPDF 中使用各种版本和格式的 PDF 的问题,我可以确认 1.4 以上的 PDF 版本时好时坏,有趣的是我有很多工作 1.7 PDF,在 1.5 和 1.6 上的工作效率约为 50/50。

我通过使用 GhostScript 将所有不可用的 PDF 文件转换为 v1.4 解决了这个问题,您可以从命令行exec。使用 GhostScript lib 文件夹中的 ps2pdf14

【讨论】:

我没想到命令 ps2pdf14 可以使用 PDF 作为输入,但它的作用就像一个魅力。【参考方案2】:

我刚刚发布了一对项目(TCPDI / tcpdi_parser,分别基于 FPDI 和 tcpdf_parser),它们与 TCPDF 6(和 FPDF_TPL)一起使用,以导入高于 v1.4 的 PDF(测试最高 1.6到目前为止,但是一旦我找到一个 1.7 PFD 来测试它,我会确保它与 1.7 一起工作!)不需要任何商业插件。基本安装使用说明见TCPDI README;请随时尝试并通过 Github 跟踪器报告任何问题。

【讨论】:

我刚试了一下,尝试将文本添加到 PDF v.1.5,但它不起作用。 @greg,如果您的 PDF 没有密码保护,请在相关项目(TCPDI 或 tcpdi_parser)上提交问题,并详细说明您正在尝试做什么以及发生了什么(即你得到的错误)。我会尝试调查,但无法按时做出任何承诺。【参考方案3】:

Setasign 将 PDF 解析器作为commercial addon 提供给 FPDI。到目前为止,我们使用新的解析器解析最高版本 1.7 的 PDF 文件没有任何问题。

【讨论】:

您能否与我们分享您是如何使用此插件的?因为我不知道如何使用它。我已经安装了文件,不知道如何使用它。我正在使用以下 PDFmerger github.com/myokyawhtun/PDFMerger/blob/master/PDFMerger.php#L‌​78【参考方案4】:

我发现使用FPDI PDF-Parser 的商业版本解决了我的问题。我已经使用它一年了,没有任何它无法解析的 PDF(除非 PDF 已损坏或发生其他奇怪的事情)。

【讨论】:

您能否与我们分享您是如何使用此插件的?因为我不知道如何使用它。我已经安装了文件,不知道如何使用它。我正在使用以下 PDFmerger github.com/myokyawhtun/PDFMerger/blob/master/PDFMerger.php#L78【参考方案5】:

对于 symfony,我使用这个库来转换 >1.4 https://packagist.org/packages/xthiago/pdf-version-converter

【讨论】:

你知道...我想我实际上曾经实施过类似的事情来处理其他问题。在我的情况下,我只是直接调用 ghostscript,但这可能会让生活更轻松。 我是xthiago/pdf-version-converter 的作者。该库可以在任何 PHP 项目中使用 - 它不需要使用 Symfony 框架(全栈)。该库在内部使用 Symfony 的两个组件(进程和文件系统),但 composer 负责它。我建议您使用该库,因为它具有单元测试 (PHPUnit) 并且是开源的 - 您可以受益于社区提供的错误修复和增强功能。【参考方案6】:

如果您有 Acrobat PDF writer,您可以操作作业设置以使您正在打印/保存的 PDF 与 PDF 1.4 兼容。由于我需要这个产品的微小原因,花 100 欧元来获得与 1.4 以上版本兼容的商业版本似乎不值得。

【讨论】:

【参考方案7】:

我的团队删除了部分代码。我们阻止了代码向 pdf 添加水印。这为我们解决了问题。 PDF >= 1.5

【讨论】:

以上是关于有没有办法让 FPDF/FPDI 或 Zend_Pdf 支持解析大于 1.4 的 PDF?的主要内容,如果未能解决你的问题,请参考以下文章

FPDF / FPDI addPage() 方向

保留 PDF 表单域

使用 PHP 从模板创建新的 PDF

有没有办法让 Seaborn 或 Vincent 互动?

有没有办法让 zip 或其他压缩文件更快地提取?

有没有办法让当前的 Twitter 登录用户已经关注或取消关注我? [关闭]