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
(尝试使用 pdf2ps
和 pdftops
以了解潜在差异)然后再转换回 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 中的某些页面中提取文本的主要内容,如果未能解决你的问题,请参考以下文章