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

357

我正在尝试使用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文档中原样的文本?


8
请使用一个好的PDF查看器——如果可能的话,使用Adobe的标准Acrobat Reader复制文本。你得到了相同的结果吗?不同之处不在于文本,而是在于字体——字符代码映射到其他值。并非所有PDF都包含正确的数据来恢复这种情况。 - Jongware
我尝试了另一个文档,它可以工作。是的,看起来问题出在PDF本身。 - Simplicity
7
该PDF包含一个字符CMap表,因此在本线程中讨论的限制和解决方法是相关的 - https://dev59.com/VVHTa4cB1Zd3GeqPV_Tm. - dwarring
3
PDF文件中确实包含正确的CMAP,因此将临时字符映射转换为纯文本非常简单。但是,需要进行额外的处理才能检索到正确的文本顺序。Mac OS X的Quartz PDF渲染器是一个非常棘手的工具!在它最初的呈现顺序中,我收到了"m T’h iuss iisn ga tosam fopllloew DalFo dnogc wumithe ntht eI tutorial"。只有通过x坐标排序后,我才得到了一个更有可能正确的结果:"This is a sample PDF document I’m using to follow along with the tutorial"。 - Jongware
1
PyPDF2在单词之间/内添加随机空格,非常难以处理。 - YuMei
显示剩余4条评论
34个回答

-1

PyPDF2可以使用,但结果可能会有所不同。我发现从它的结果提取中得到的结果相当不一致。

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)

1
PyPDF2 / PyPDF3 / PyPDF4 都已经停止维护。请使用 pymupdf。pymupdf - Martin Thoma

-1

请查看官方文档,其中已经给出了说明。

from PyPDF2 import PdfReader

reader = PdfReader("example.pdf")
page = reader.pages[0]
print(page.extract_text())

-1

我将介绍另一个尚未提到的库,为您提供额外的选项。使用IronPdf也可以从PDF中提取文本。

可以通过pip添加IronPDF库。使用以下命令使用pip安装IronPDF:

pip install ironpdf

IronPDF Python依赖于.NET 6.0作为其底层技术。因此,为了使用IronPDF Python,必须在您的计算机上安装.NET 6.0 SDK。

from ironpdf import *
 
# Load existing PDF document
pdf = PdfDocument.FromFile("content.pdf")
 
# Extract text from PDF document
all_text = pdf.ExtractAllText()
 
# Extract text from specific page in the document
page_2_text = pdf.ExtractTextFromPage(1)

在提供的代码片段中,导入了PDF文档,并使用一种方法从导入的PDF文档中提取文本。这种方法可以高效地从PDF文件中提取文本。 | 代码示例链接

-8
如何从PDF文件中提取文本?
首先要了解PDF格式。它有一个用英语编写的公共规范,参见ISO 32000-2:2017并阅读PDF 1.7规范的700多页内容。您肯定至少需要阅读维基百科关于PDF的页面。
一旦您了解了PDF格式的详细信息,提取文本就比较容易(但是图形或图像中出现的文本怎么办?这是第1个问题)。不要指望在几周内独自编写完美的软件文本提取器...

在Linux上,您还可以使用pdf2text,并从Python代码中使用popen

总的来说,从PDF文件中提取文本是一个不明确的问题。对于人类读者而言,一些文本可能由不同的点或照片等组成。

Google搜索引擎能够从PDF中提取文本,但据传需要超过五亿行源代码。您是否有必要的资源(人力、预算)开发竞争对手?

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

我建议您着手处理生成该PDF文件的数据表示方式,例如原始LaTeX代码(或Lout代码)或OOXML代码。
无论如何,您都需要预算至少数年的软件开发时间。

3
这不是一个答案。它让你阅读这份700页的文件,却没有提供实际回答问题的方法。 - v2v1

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