Duc*_*her 71 python text-extraction pdfminer
Python版本2.7
我正在寻找有关如何使用PDFMiner和Python从PDF文件中提取文本的文档或示例.
看起来PDFMiner更新了他们的API,我发现的所有相关示例都包含过时的代码(类和方法已经改变).我发现的库使得从PDF文件中提取文本的任务更容易使用旧的PDFMiner语法,所以我不知道如何做到这一点.
事实上,我只是看源代码,看看能否解决它.
Duc*_*her 159
以下是使用当前版本的PDFMiner从PDF文件中提取文本的工作示例(2016年9月)
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
Run Code Online (Sandbox Code Playgroud)
PDFMiner的结构最近发生了变化,因此这应该适用于从PDF文件中提取文本.
编辑:截至2018年6月7日仍在工作.在Python版本3.x中验证
jua*_*aza 26
来自DuckPuncher的极好答案,对于Python3,请确保安装pdfminer2并执行:
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = io.StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos = set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,
password=password,
caching=caching,
check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
Run Code Online (Sandbox Code Playgroud)
Cor*_*mer 24
这在 2020 年 5 月使用 Python3 中的 PDFminer 6 起作用。
$ pip install pdfminer.six
Run Code Online (Sandbox Code Playgroud)
from pdfminer.high_level import extract_text
Run Code Online (Sandbox Code Playgroud)
text = extract_text('report.pdf')
Run Code Online (Sandbox Code Playgroud)
或者:
with open('report.pdf','rb') as f:
text = extract_text(f)
Run Code Online (Sandbox Code Playgroud)
如果 PDF 已经在内存中,例如,如果使用 requests 库从 Web 检索,则可以使用该io库将其转换为流:
import io
response = requests.get(url)
text = extract_text(io.BytesIO(response.content))
Run Code Online (Sandbox Code Playgroud)
PDFminer.six 比 PyPDF2(在某些类型的 PDF 中失败)更可靠,尤其是 PDF 版本 1.7
但是,使用 PDFminer.six 提取文本的速度明显比 PyPDF2 慢 6 倍。
我timeit使用 15" MBP (2018)定时文本提取,仅使用 10 页 PDF 定时提取功能(无文件打开等)并得到以下结果:
PDFminer.six: 2.88 sec
PyPDF2: 0.45 sec
Run Code Online (Sandbox Code Playgroud)
pdfminer.six 也有巨大的占用空间,需要安装 GCC 和其他东西的 pycryptodome,将 Alpine Linux 上的最小安装 docker 映像从 80 MB 推到 350 MB。PyPDF2 没有明显的存储影响。
Pie*_*ter 18
完全公开,我是pdfminer.six的维护者之一。
如今,有多种 api 可以根据您的需要从 PDF 中提取文本。在幕后,所有这些 api 都使用相同的逻辑来解析和分析布局。
(所有示例都假设您的 PDF 文件名为example.pdf)
命令行
如果您只想提取一次文本,可以使用命令行工具 pdf2txt.py:
$ pdf2txt.py example.pdf
Run Code Online (Sandbox Code Playgroud)
高级api
如果要使用 Python 提取文本,可以使用高级 api。如果您想以编程方式从许多 PDF 中提取文本,则此方法是首选解决方案。
from pdfminer.high_level import extract_text
text = extract_text('example.pdf')
Run Code Online (Sandbox Code Playgroud)
可组合的 api
还有一个可组合的 api,它在处理结果对象方面提供了很大的灵活性。例如,您可以使用它来实现自己的布局算法。其他答案中建议使用此方法,但我仅在您需要自定义 pdfminer.six 的行为方式时才推荐此方法。
from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
output_string = StringIO()
with open('example.pdf', 'rb') as in_file:
parser = PDFParser(in_file)
doc = PDFDocument(parser)
rsrcmgr = PDFResourceManager()
device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
interpreter = PDFPageInterpreter(rsrcmgr, device)
for page in PDFPage.create_pages(doc):
interpreter.process_page(page)
print(output_string.getvalue())
Run Code Online (Sandbox Code Playgroud)