pyPdf 无法从我的 PDF 中的某些页面中提取文本

Posted

技术标签:

【中文标题】pyPdf 无法从我的 PDF 中的某些页面中提取文本【英文标题】:pyPdf unable to extract text from some pages in my PDF 【发布时间】:2011-05-11 08:16:59 【问题描述】:

我正在尝试使用 pyPdf 从多页 PDF 中提取和打印页面。问题是,没有从某些页面中提取文本。我在这里放了一个示例文件:

http://www.4shared.com/document/kmJF67E4/forms.html

如果您运行以下命令,前 81 个页面不会返回任何文本,而最后 11 个页面会正确提取。有人可以帮忙吗?

from pyPdf import PdfFileReader  
input = PdfFileReader(file("forms.pdf", "rb"))  
for page in input1.pages:  
    print page.extractText()  

【问题讨论】:

【参考方案1】:

请注意,extractText() 仍然无法正确提取文本。来自extractText() 的文档:

这适用于某些 PDF 文件, 但对其他人来说很糟糕,取决于 使用的发电机。这将成为;这将是 日后细化。不要依赖 由此产生的文本顺序 功能,因为它会改变,如果这 功能更加复杂。

既然是你想要的文字,你可以使用Linux命令pdftotext

要使用 Python 调用它,您可以这样做:

>>> import subprocess
>>> subprocess.call(['pdftotext', 'forms.pdf', 'output'])

文本从forms.pdf 中提取并保存到output

这适用于您的 PDF 文件并提取您想要的文本。

【讨论】:

感谢您的帮助。我尝试过 pdftotext 并将其传递过去,因为它只能部分解决问题。我需要根据每页上的 UID 将 pdf 拆分为单独的文件。然而,pyPdf 可以提取的最后 10 个左右的页面没有文本页面标签,因此使用 pdftotext,虽然它给了我所有的文本,但并没有给我一种为给定的 UID 生成页面列表的方法. 这在输出 PDF 文本方面做得不错,但不会保留表格格式。【参考方案2】:

您也可以尝试pdfminer 库(也在python 中),看看它是否更擅长提取文本。但是,对于拆分,您必须坚持使用 pyPdf,因为 pdfminer 不支持。

【讨论】:

我试过 pdfminer...后面的页面由于某种原因没有被正确提取。【参考方案3】:

我发现有时将其转换为 ps(尝试使用 pdf2pspdftops 以了解潜在差异)然后再转换回 pdf (ps2pdf) 很有用。然后再次尝试您的原始脚本。

【讨论】:

我很有希望,但它似乎所做的只是使原始文件更大并减慢空文本的提取速度!【参考方案4】:

这不是一个真正的答案,但 pyPdf 的问题在于:它还不支持 CMaps。 PDF 允许字体使用 CMap 将字符 ID(PDF 中的字节)映射到 Unicode 字符代码。当您的 PDF 包含非 ASCII 字符时,可能正在使用 CMap,有时甚至在没有非 ASCII 字符的情况下。当 pyPdf 遇到不是标准 Unicode 编码的字符串时,它只会看到一堆字节码;它无法将这些字节转换为 Unicode,因此它只会为您提供空字符串。我实际上遇到了同样的问题,目前我正在处理源代码。这很耗时,但我希望在 2011 年年中左右的某个时间向维护者发送补丁。

【讨论】:

【参考方案5】:

我在某些 pdf 文件和 Windows 上遇到了类似的问题,这对我来说非常有用:

1.- 下载windows的Xpdf工具

2.- 将 pdftotext.exe 从 xpdf-tools-win-4.00\bin32 复制到 C:\Windows\System32 和 C:\Windows\SysWOW64

3.- 使用子进程从控制台运行命令:

import subprocess

try:
    extInfo = subprocess.check_output('pdftotext.exe '+filePath + ' -',shell=True,stderr=subprocess.STDOUT).strip()
except Exception as e:
    print (e) 

【讨论】:

改进:shell= False 并且不要将 stderr 强制转换为 stdout...您可能会混淆它们。【参考方案6】:

我开始认为我应该采用混乱的两部分解决方案。 PDF 有两个部分,pp 1-82 有文本页面标签(pdftotext 可以提取),pp 83-end 没有页面标签但 pyPDF 可以提取并且它明确知道页面。

我想我需要将两者结合起来。笨重,但我看不出有什么办法。遗憾的是,我不得不在 Windows 机器上执行此操作。

【讨论】:

以上是关于pyPdf 无法从我的 PDF 中的某些页面中提取文本的主要内容,如果未能解决你的问题,请参考以下文章

从 pdf 中提取文本 - PyPDF2

使用 pyPdf 在 Python 中裁剪页面

PyPdf2无法添加多个裁剪页面

在 Python 中从 PDF 中提取页面大小

pdf及word文档的读取 pyPDF2,docx

PyPDF2如何实现按照PDF页码提取后并另存为PDF格式文件?