Python使用pdfminer库玩转PDF文本提取!
Python使用pdfminer库玩转PDF文本提取!
一、背景
在日常工作中,我们常常需要处理PDF文件,比如提取文本内容、分析文档结构等。然而,PDF文件的格式复杂,直接提取信息并非易事。pdfminer库应运而生,它能够高效地解析PDF文件,提取文本、元数据、表格等信息,帮助我们轻松应对各种PDF处理需求。接下来,让我们深入了解这个强大的工具。
二、什么是pdfminer
pdfminer是一个开源的Python第三方库,专门用于解析PDF文件。它提供了丰富的API,可以精确提取文本、分析页面布局、提取元数据等。它的核心功能是将PDF文件的内容转换为可操作的文本数据,方便进一步处理和分析。
三、如何安装pdfminer
pdfminer是一个第三方库,可以通过以下命令行安装:
1
|
pip install pdfminer.six |
安装完成后,可以通过以下命令确认安装是否成功:
1
|
python -c "import pdfminer; print(pdfminer.__version__)" |
如果能够正常输出版本号,说明安装成功。
四、简单库函数使用方法
以下是pdfminer中常用的五个函数及其使用方法:
1. 提取文本
1
2
3
4
|
from pdfminer.high_level import extract_text text = extract_text( "example.pdf" ) print (text) |
extract_text函数用于从PDF文件中提取全部文本。
2. 获取页面布局信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from pdfminer.layout import LAParams, LTTextBox, LTTextLine from pdfminer.pdfpage import PDFPage from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator resource_manager = PDFResourceManager() fake_file_handle = io.StringIO() converter = PDFPageAggregator(resource_manager, laparams = LAParams()) page_interpreter = PDFPageInterpreter(resource_manager, converter) with open ( "example.pdf" , "rb" ) as pdf_file: for page in PDFPage.get_pages(pdf_file): page_interpreter.process_page(page) layout = converter.get_result() for lt_obj in layout: if isinstance (lt_obj, (LTTextBox, LTTextLine)): text = lt_obj.get_text() x, y, width, height = lt_obj.bbox font = lt_obj._objs[ 0 ].fontname font_size = lt_obj._objs[ 0 ].size print (f "Text: {text.strip()}, Position: ({x:.2f}, {y:.2f}), Font: {font}, Size: {font_size:.2f}" ) |
这段代码获取文本块的位置、字体和字号等信息。
3. 提取表格数据
1
2
3
4
5
6
7
8
9
|
from pdfminer.high_level import extract_text import tabula table_text = extract_text( "table_example.pdf" ) print (table_text) tables = tabula.read_pdf( "table_example.pdf" , pages = "all" ) for df in tables: print (df) |
使用pdfminer提取PDF文档中的表格,并使用tabula提取表格数据。
4. 提取图像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument from pdfminer.pdftypes import PDFStream import io from PIL import Image with open ( 'example.pdf' , 'rb' ) as file : parser = PDFParser( file ) document = PDFDocument(parser) if document.is_extractable: for xref in document.xrefs: if xref.get_subtype() = = '/Image' : stream_obj = xref.get_object() if isinstance (stream_obj, PDFStream): data = stream_obj.get_rawdata() image = Image. open (io.BytesIO(data)) image.show() |
提取PDF文档中的图像。
5. 提取元数据
1
2
3
4
5
6
7
8
9
10
11
12
|
from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument def extract_metadata(pdf_path): with open (pdf_path, 'rb' ) as fh: parser = PDFParser(fh) doc = PDFDocument(parser) metadata = doc.info[ 0 ] for key, value in metadata.items(): print (f "{key}: {value}" ) extract_metadata( 'example.pdf' ) |
提取PDF文件的元数据。
五、实际应用场景
以下是pdfminer在不同场景中的应用示例:
1. 法律文档处理
1
2
3
4
5
6
7
8
|
from pdfminer.high_level import extract_text def extract_legal_document_text(pdf_path): text = extract_text(pdf_path) return text text = extract_legal_document_text( 'legal_document.pdf' ) print (text) |
在法律行业,通过pdfminer提取和分析法律文档中的文本和元数据,自动生成报告。
2. 财务报表分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from pdfminer.layout import LAParams, LTTextBoxHorizontal from pdfminer.pdfpage import PDFPage from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator def extract_financial_tables(pdf_path): with open (pdf_path, 'rb' ) as fh: rsrcmgr = PDFResourceManager() laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams = laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(fh, caching = True , check_extractable = True ): interpreter.process_page(page) layout = device.get_result() for element in layout: if isinstance (element, LTTextBoxHorizontal): print (element.get_text()) extract_financial_tables( 'financial_report.pdf' ) |
在财务行业,通过pdfminer提取财务报表中的表格数据,进行自动化的数据分析和处理。
3. 研究论文数据提取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
from pdfminer.layout import LAParams, LTTextBoxHorizontal, LTFigure from pdfminer.pdfpage import PDFPage from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator def extract_research_paper_content(pdf_path): with open (pdf_path, 'rb' ) as fh: rsrcmgr = PDFResourceManager() laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams = laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(fh, caching = True , check_extractable = True ): interpreter.process_page(page) layout = device.get_result() for element in layout: if isinstance (element, LTTextBoxHorizontal): print (element.get_text()) elif isinstance (element, LTFigure): print ( "Figure found" ) extract_research_paper_content( 'research_paper.pdf' ) |
在学术研究中,通过pdfminer提取研究论文中的文本和图表信息,辅助研究分析。
4. 文本逐页提取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
from pdfminer.pdfpage import PDFPage from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from io import StringIO def extract_text_by_page(pdf_path): resource_manager = PDFResourceManager() fake_file_handle = StringIO() converter = TextConverter(resource_manager, fake_file_handle) page_interpreter = PDFPageInterpreter(resource_manager, converter) with open (pdf_path, 'rb' ) as fh: for page in PDFPage.get_pages(fh, caching = True , check_extractable = True ): page_interpreter.process_page(page) text = fake_file_handle.getvalue() yield text converter.close() fake_file_handle.close() for page_text in extract_text_by_page( 'example.pdf' ): print (page_text) |
逐页提取PDF文件中的文本,适用于需要逐页处理的情况。
5. 提取目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument, PDFNoOutlines def extract_toc(pdf_path): with open (pdf_path, 'rb' ) as file : parser = PDFParser( file ) document = PDFDocument(parser) try : outlines = document.get_outlines() toc = [] for (level, title, dest, a, se) in outlines: toc.append((level, title)) return toc except PDFNoOutlines: return [] toc = extract_toc( 'example.pdf' ) for item in toc: print (f "Level: {item[0]}, Title: {item[1]}" ) |
提取PDF文档的目录,方便快速定位文档结构。
六、常见问题及解决方案
以下是使用pdfminer时常见的问题及解决方案:
文本提取为空
错误信息 :extract_text返回空字符串。
原因 :PDF文件可能包含非文本内容,或者文本被嵌入为图像。
解决方案 :检查PDF文件的内容,确保文本是可提取的。如果文本嵌入为图像,可以尝试使用OCR工具(如`pytesseract
以上就是Python使用pdfminer库玩转PDF文本提取的详细内容。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。
共有 0 条评论