我试图使用Python提取包含在这个PDF文件中的文本。

我正在使用PyPDF2包(版本1.27.2),并有以下脚本:

import PyPDF2

with open("sample.pdf", "rb") as pdf_file:
    read_pdf = PyPDF2.PdfFileReader(pdf_file)
    number_of_pages = read_pdf.getNumPages()
    page = read_pdf.pages[0]
    page_content = page.extractText()
print(page_content)

当我运行代码时,我得到以下输出,这与PDF文档中包含的输出不同:

 ! " # $ % # $ % &% $ &' ( ) * % + , - % . / 0 1 ' * 2 3% 4
5
 ' % 1 $ # 2 6 % 3/ % 7 / ) ) / 8 % &) / 2 6 % 8 # 3" % 3" * % 31 3/ 9 # &)
%

如何提取PDF文档中的文本?


当前回答

如何从PDF文件中提取文本?

首先要了解的是PDF格式。它有一个用英文编写的公共规范,请参阅ISO 32000-2:2017,并阅读超过700页的PDF 1.7规范。当然,你至少需要阅读维基百科关于PDF的页面

一旦你理解了PDF格式的细节,提取文本或多或少是容易的(但是出现在图形或图像中的文本呢?它的数字1)?不要指望在几周内单独编写一个完美的软件文本提取器....

在Linux上,你也可以使用pdf2text,你可以从你的Python代码中弹出。

一般来说,从PDF文件中提取文本是一个定义不清的问题。对于人类读者来说,一些文本可以由不同的点制成(图形),或者一张照片等等。

谷歌搜索引擎能够从PDF中提取文本,但据传需要超过5亿行的源代码。你有必要的资源(人力和预算)来发展一个竞争对手吗?

一种可能是将PDF打印到一些虚拟打印机(例如使用GhostScript或Firefox),然后使用OCR技术提取文本。

相反,我建议处理生成PDF文件的数据表示,例如原始的LaTeX代码(或Lout代码)或OOXML代码。

在所有情况下,您都需要为至少几个人年的软件开发预算。

其他回答

我在寻找一个简单的解决方案来使用python 3。X和窗口。textract似乎不支持,这是不幸的,但如果你正在寻找一个简单的解决方案的windows/python 3签出tika包,真的直接阅读pdf。

Tika-Python是绑定到Apache Tika™REST服务的Python,允许在Python社区中本地调用Tika。

from tika import parser # pip install tika

raw = parser.from_file('sample.pdf')
print(raw['content'])

注意,Tika是用Java编写的,因此需要安装Java运行时

您可能希望使用经过时间验证的xPDF和派生工具来提取文本,因为pyPDF2在文本提取方面似乎仍然存在各种问题。

长的答案是,文本如何在PDF中编码有很多变化,它可能需要解码PDF字符串本身,然后可能需要与CMAP映射,然后可能需要分析单词和字母之间的距离等。

如果PDF被损坏(即显示正确的文本,但复制时产生垃圾),并且您确实需要提取文本,那么您可能需要考虑将PDF转换为图像(使用ImageMagik),然后使用Tesseract使用OCR从图像中获取文本。

你可以使用PDFtoText https://github.com/jalan/pdftotext

PDF到文本保持文本格式缩进,不管你是否有表格。

在某些情况下,PyPDF2忽略空白,使结果文本混乱,但我使用PyMuPDF,我真的很满意 你可以使用这个链接获取更多信息

我在这里找到了一个解决方案PDFLayoutTextStripper

这很好,因为它可以保持原始PDF的布局。

它是用Java编写的,但我已经添加了一个网关来支持Python。

示例代码:

from py4j.java_gateway import JavaGateway

gw = JavaGateway()
result = gw.entry_point.strip('samples/bus.pdf')

# result is a dict of {
#   'success': 'true' or 'false',
#   'payload': pdf file content if 'success' is 'true'
#   'error': error message if 'success' is 'false'
# }

print result['payload']

示例输出PDFLayoutTextStripper:

你可以在这里看到更多细节Stripper with Python