pdf提取目前的解决方案大致只有pyPDF和PDFMiner。据说PDFMiner更适合文本的解析,首先说明的是解析PDF是非常蛋疼的事,即使是PDFMiner对于格式不工整的PDF解析效果也不怎么样,所以连PDFMiner的开发者都吐槽PDF is evil. 不过这些并不重要。
PDFMiner是一个可以从PDF文档中提取信息的工具。与其他PDF相关的工具不同,它注重的完全是获取和分析文本数据。PDFMiner允许你获取某一页中文本的准确位置和一些诸如字体、行数的信息。它包括一个PDF转换器,可以把PDF文件转换成HTML等格式。它还有一个扩展的PDF解析器,可以用于除文本分析以外的其他用途。
PDFMiner内置两个好用的工具:pdf2txt.py和dumppdf.py
PDFMiner在python2中名为PDFMiner,在python3中名为PDFMiner3k,分别上链接
PDFMiner 官方主页:https://euske.github.io/pdfminer/
PDFMiner github主页:https://github.com/euske/pdfminerpdfminer3k 官方主页:https://pypi.org/project/pdfminer3k/
pdfminer3k github主页:https://github.com/jaepil/pdfminer3k
他们之间的关系图如下:
布局分析返回的PDF文档中的每个页面LTPage对象。这个对象和页内包含的子对象,形成一个树结构,如图所示:
LTCurve:表示一个通用的
Bezier曲线一个简单的示例
# encoding: utf-8
import sys
import importlib
importlib.reload(sys)
from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
path ="C:\\Users\\admin\\Desktop\\t.pdf"
def parse():
fp = open(path, 'rb')
#用文件对象来创建一个pdf文档分析器PDFParser
praser = PDFParser(fp)
# 创建一个PDF文档PDFDocument
doc = PDFDocument()
# 连接分析器 与文档对象
praser.set_document(doc)
doc.set_parser(praser)
# 提供初始化密码,如果没有密码 就创建一个空的字符串
doc.initialize()
# 检测文档是否提供txt转换,不提供就忽略
if not doc.is_extractable:
raise PDFTextExtractionNotAllowed
else:
# 创建PDf 资源管理器 来管理共享资源PDFResourceManager
rsrcmgr = PDFResourceManager()
# 创建一个PDF设备对象LAParams
laparams = LAParams()
# 创建聚合器,用于读取文档的对象PDFPageAggregator
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
# 创建一个PDF解释器对象,对文档编码,解释成Python能够识别的格式:PDFPageInterpreter
interpreter = PDFPageInterpreter(rsrcmgr, device)
# 循环遍历列表,每次处理一个page的内容
for page in doc.get_pages(): # doc.get_pages() 获取page列表
# 利用解释器的process_page()方法解析读取单独页数
interpreter.process_page(page)
# 这里layout是一个LTPage对象,里面存放着这个page解析出的各种对象,一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal等等,想要获取文本就获得对象的text属性,
# 使用聚合器get_result()方法获取页面内容
layout = device.get_result()
for x in layout:
if (isinstance(x, LTTextBoxHorizontal)):
#需要写出编码格式
with open(r'C:\Users\admin\Desktop\1.txt', 'a',encoding='utf-8') as f:
results = x.get_text()
f.write(results + '\n')
if __name__ == '__main__':
parse()
或者使用官方的一个例子,简单写如下
rsrcmgr = PDFResourceManager(caching=caching) # 创建一个PDF资源管理器对象来存储共赏资源
outfp = io.open(outfile, 'wt', encoding=codec, errors='ignore') #指定outfile
device = XMLConverter(rsrcmgr, outfp, laparams=laparams, outdir=outdir)
fp = io.open(file, 'rb') #来创建一个pdf文档分析器
process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True) #调用process_pdf
fp.close()
device.close()
outfp.close()
参考链接: https://blog.csdn.net/liuqingpeng_1/article/details/79560753 https://www.zhangshengrong.com/p/Z9a2AAy1Vk/ https://blog.csdn.net/qq_29750461/article/details/80011255 https://blog.csdn.net/sinat_37967865/article/details/80145487