一枚NLPer小菜鸡

PdfMiner文档解析

PDFMiner是一个可以从PDF文档中提取信息的工具。与其他PDF相关的工具不同,它注重的完全是获取和分析文本数据。PDFMiner允许你获取某一页中文本的准确位置和一些诸如字体、行数的信息。它包括一个PDF转换器,可以把PDF文件转换成HTML等格式。它还有一个扩展的PDF解析器,可以用于除文本分析以外的其他用途。官方主页

其特征有:1、完全使用python编写。(适用于2.4或更新版本)2、解析,分析,并转换成PDF文档。3、PDF-1.7规范的支持。(几乎)4、中日韩语言和垂直书写脚本支持。5、各种字体类型(Type1、TrueType、Type3,和CID)的支持。6、基本加密(RC4)的支持。7、PDF与HTML转换。8、纲要(TOC)的提取。9、标签内容提取。10、通过分组文本块重建原始的布局。
如果你的Python有安装pip模块,就可以通过命令“python pip install pdfminer”,自动安装pdfminer。

解析pdf文件用到的类:

  • PDFParser:从一个文件中获取数据
  • PDFDocument:保存获取的数据,和PDFParser是相互关联的
  • PDFPageInterpreter处理页面内容
  • PDFDevice将其翻译成你需要的格式
  • PDFResourceManager用于存储共享资源,如字体或图像。

pdfminer之间的关系图:


avatar

Layout布局分析返回的PDF文档中的每个页面LTPage对象。这个对象和页内包含的子对象,形成一个树结构。如图所示
avatar

pdf转换成text的核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python
# coding=utf-8
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
import os
from os import path
def convert_pdf_to_txt(path):
rsrcmgr =PDFResourceManager()
retstr = StringIO()
codec ='utf-8'
laparams =LAParams()
device = TextConverter(rsrcmgr, retstr,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

保存成文本文件

1
2
3
4
def saveTxt(txt, filename):
with open(filename[:-3]+'txt', "w") as f:
print('openTxt:' + filename[:-3]+'txt')
f.write(txt)

转换一个文件夹中的所有pdf文件

1
2
3
4
5
6
7
8
9
10
def traversal(rootdir):
for parent, dirnames, filenames in os.walk(rootdir):
for filename in filenames:
filenameFull = os.path.join(parent, filename)
if (filenameFull.endswith('pdf') or filenameFull.endswith('PDF')):
txt = readPDF(filenameFull)
saveTxt(txt.replace(u'\xa9', u'').replace(u'\xa0',u'').replace(u'\xad',u'').replace(u'\u037e',u''), filenameFull)
if __name__ == '__main__':
rootdir = './'
traversal(rootdir)

我们拿其中的一篇pdf文件做解析[PDF] WHO R&D Blueprint novel Coronavirus prospects for evaluating cross-reactivity of nCoV with SARS-CoV January 24, 2020, Geneva, Switzerland.pdf

解析部分页面如下:
avatar

我们通过解析:可以将此pdf转换为纯文本形式:
avatar

通过对比发现,可以将PDF文件合理的解析成纯文本文件。

O(∩_∩)O哈哈~