有没有适用于PHP的PDF解析器?

43

嗨,我知道有几个适用于php的PDF生成器(如fpdf、dompdf等)。

我想了解的是关于解析器的问题。

由于某些原因,我需要提取位于pdf表格中的某些信息并将其转换为数组。

有什么建议吗?


2
我将向任何能够提供一个有效示例来提取PDF文本的人提供赏金。解决方案必须使用免费库(不得使用xPDF或PDF2Text),并且是平台无关的(必须在win和unix上工作,因此不能使用PDF2Text)。它可以使用PHP的exec()或shell()函数。 - 2ndkauboy
谢谢Kau-Boy。或许悬赏会有助于激励更详细的回答。 - elviejo79
参考一下,这里有一个更好的PDF解析器:https://github.com/smalot/pdfparser - Adrian P.
7个回答

31

我曾经为类似的需求写过一个程序,可以说这是一个相当复杂的任务。 PDF规范非常庞大且难以操作。它有多种存储文本的方法。更关键的是,每个PDF生成器的工作方式都不同。因此,虽然像TFPDF或DOMPDF之类的工具可以轻松地生成PDF(从机器角度来看),但Acrobat却会生成一些非常麻烦的文档。

原因在于其写入文本的方式。大多数基于DOM的渲染器(我使用过的)将整行文本作为一个字符串写入并进行定位(这非常容易阅读)。Acrobat则试图更高效(实际上确实如此),只写入一个或几个字符,并对其进行独立定位。虽然这样做真的简化了渲染,但阅读起来却更加困难。

好消息是,PDF格式本身非常简单。您有“对象”遵循常规语法。然后您可以将它们链接在一起以生成内容。规范对文件格式的描述做得很好。但是现实世界中的阅读需要一点脑力...

如果您要自己编写代码,这里有一些我曾经吃过苦头得出的有用建议:

  1. Adobe喜欢重新映射字体。因此,字符65可能不是A...您需要找到一个映射对象,并根据其中包含的字符来推断其作用。尽管这样做非常高效,因为如果一个字符在该字体的文档中未出现,则不会包含它(如果您试图以编程方式编辑PDF,这将使生活变得更加困难)...
  2. 尽量把代码设计成最抽象的形式。为每个对象类型和本地类型(字符串、数字等)编写类。让这些类为您解析。虽然其中会有很多重复性的工作,但当您意识到需要为仅一个特定类型调整某些东西时,这样做可以在最终节省您的时间。
  • 针对特定的PDF规范版本进行编写并严格执行。检查版本号,如果比预期高,则退出...不要试图“让它正常工作”。如果您想支持更新的版本,请拆分规范并从那里升级解析器。不要试图试错(这样做并不有趣)...
  • 处理压缩流时请小心。我发现通常不能依靠长度参数来验证您正在解压缩的内容。有时(对于某些生成器),它可以很好地工作...而其他时候则会多一个或多个字节。如果过滤器匹配,我只尝试进行压缩,然后强制指定长度...
  • 在测试长度时,请勿使用strlen。使用mb_strlen($string, '8bit'),因为它将补偿不同字符集(并允许其他字符集中的潜在无效字符)。
  • 否则,祝你好运...


    2
    +1 我甚至可能称之为噩梦般的。规格说明书非常庞大,一个PDF文件几乎类似于一个带有许多不同选项和选择的文件系统...你肯定可以看到他们如何在其中隐藏越狱能力。 - Rudu
    2
    你会期待Adobe做得更差吗? - bpeterson76
    @bpeterson76,是的...我不希望我的PDF文件可以被下载 :( - Ravi Dhoriya ツ

    17

    1
    非常感谢,这正是我正在寻找的! - 2ndkauboy

    3

    你是否已经查看了xPDF?里面有一个叫做pdftotext的程序可以进行转换。你可以从PHP中调用它,然后读取PDF的文本版本。你需要有能力从php运行exec()或system(),所以这可能不适用于所有托管解决方案。

    此外,在PHP网站上有一些将PDF转换为文本的示例,虽然它们相当粗糙。你也可以尝试一些这些示例。在PHP页面上搜索luc at phpt dot org。


    我根据您的建议尝试了基于xpdf的工具,并惊讶地发现它的表现非常出色 - 谢谢! - Tomba
    截至2022年7月2日,PHP网站的链接404(http://us3.php.net/manual/en/ref.pdf.php),我找不到相应的页面。 - Rick Hellewell

    2
    < p > Zend_Pdf是Zend Framework的一部分。他们的手册说明:

    Zend_Pdf组件是一个PDF(可移植文档格式)操作处理引擎。它可以加载、创建、修改和保存文件,因此可以帮助任何PHP应用程序通过修改现有文档或从头开始生成新文档来动态创建PDF文档。


    +1 - Zend Framework 组件可靠地实现它们所说的功能。 - karim79
    5
    我不相信您可以使用Zend_Pdf阅读PDF文件中的文本。 - Niklas Berglund
    除了Zend_Pdf不支持PDF格式大于1.4之外,没有其他的说明。 - fkoessler
    @Marronsuisse,是的,Zend_Pdf已经荒废了,自2011年以来几乎没有更新。在ZF2中,它已从核心发行版中删除。 - Bill Karwin

    1

    是PHP PDF解析器,有两种版本:

    1. 免费版本可以解析PDF格式为PDF 1.5的文件
    2. 商业附加版可以解析任何PDF格式(最高支持1.9版本)

    那个链接已经失效了,但我认为这是它的一个分支:https://github.com/mark9000/FPDI - nullability

    1

    可以看一下GhostScript或者ITextSharp,这两个工具都有多个跨平台版本。


    0

    实际上,PDF 中可能并没有表格,因为 PDF 会丢失这种信息...


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