别再问如何用Python提取PDF内容了!

公众号后台回复“图书“,了解更多号主新书内容

作者:陈熹

来源:早起Python


导读

大家好,在之前的办公自动化系列文章中我们已经详细介绍了????如何使用Python批量处理PDF文件,包括合并、拆分、水印、加密等操作。

今天我们再次回到PDF,详细讲解如何使用Python从PDF提取指定的信息。我们将以一份年度报告PDF为例进行介绍,内含大量文字、表格、图片,具体如下

模块安装

首先需要安装两个模块,第一个是pdfplumber,在命令行使用pip安装即可????

pip install pdfplumber

第二个是fitz, 它是pymupdf中的一个模块,同样可以使用pip轻松安装

pip install pymupdf

文字信息提取

使用Python提取PDF中文字代码思路如下

  1. 利用pdfplumber打开一个 PDF 文件

  2. 获取指定的页,或者遍历每一页

  3. 利用.extract_text()方法提取当前页的文字

现在让我们用上述代码尝试提取示例数据中第12页的文字????

import pdfplumber
file_path = r'C:\xxxx\practice.PDF'

with pdfplumber.open(file_path) as pdf:
    page = pdf.pages[11]
    print(page.extract_text())

结果如下图所示接着可以将内容通过导入python-docx并借助wordfile.add_paragraph()写入Word文件中,而这个模块我们已经讲解很多次,此处就不再赘述。

表格信息提取

使用Python提取单个表格和提取单页文字的代码非常类似,用的是.extract_table()但需要注意的是.extract_table()默认提取指定页面的第一个表格,如果当前页面有多个表格都需要提取,则要直接使用.extract_tables()

例如示例文件中第 13 页有 2 个表格,我们分别利用.extract_table().extract_tables()观察输出结果

import pdfplumber
file_path = r'C:\xxxx\practice.PDF'

with pdfplumber.open(file_path) as pdf:
    page = pdf.pages[12]
    print(page.extract_table())

结果如下可以看到是一个嵌套列表,熟悉这种格式的人会理解想到可以pandas或者遍历该嵌套列表后借助openpyxlsheet.append(list)写入Excel文件中,

import pdfplumber
file_path = r'C:\xxxx\practice.PDF'

with pdfplumber.open(file_path) as pdf:
    page = pdf.pages[12]
    print(page.extract_tables())

.extract_tables()提取当前页所有表格会产生了一个三级嵌套列表,第一层的列表就代表每一个表格,之后也可以利用其他库写入Excel。

图片提取

对于图片提取,现在没有任何一个模块可以做到百分之百的提取。本文只介绍基于fitz模块的代码,基本思路是通过正则查找图片并将其输出

例如提取示例文件中的图片,代码可以这么写????

import fitz
import re
import os

file_path = r'C:\xxx\practice.PDF'
dir_path = r'C:\xxx' # 存放图片的文件夹

def pdf2pic(path, pic_path):
    checkXO = r"/Type(?= */XObject)"
    checkIM = r"/Subtype(?= */Image)"
    pdf = fitz.open(path)
    lenXREF = pdf._getXrefLength()
    imgcount = 0
    for i in range(1, lenXREF):
        text = pdf._getXrefString(i)
        isXObject = re.search(checkXO, text)
        isImage = re.search(checkIM, text)
        if not isXObject or not isImage:
            continue
        imgcount += 1
        pix = fitz.Pixmap(pdf, i)
        new_name = f"img_{imgcount}.png"
        if pix.n < 5:
            pix.writePNG(os.path.join(pic_path, new_name))
        else:
            pix0 = fitz.Pixmap(fitz.csRGB, pix)
            pix0.writePNG(os.path.join(pic_path, new_name))
            pix0 = None
        pix = None

pdf2pic(file_path, dir_path)

结果如下可以看到成功提取了图片,但PDF中的图片远不止这些,如果你有其他思路或者方法可以在留言区与我交流。

写在最后

最后要说明的是,在上一篇文章及本文中我们剖析了每一行代码。但针对PDF的模块较多,且有些模块功能并不完善,代码也没有类似OFFICE三件套操作那般简洁,因此更多时候以理解为主,不需要完全掌握写,会用会改即可!

当然还是希望大家能够理解Python办公自动化的一个核心就是批量操作-解放双手,并且能与日常办公结合让复杂的工作自动化!

今天的文章就到这里,原创不易,如果喜欢的话请给我一波三连支持吧(在看、转发、留言)

◆ ◆ ◆  ◆ ◆
麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:

点击下方小程序即可进入购买页面:

数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:


猜你喜欢

● 麟哥拼了!!!亲自出镜推荐自己新书《数据分析师求职面试指南》● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
<think>好的,用户之前过如何用Python批量下载文献论文,现在又接着能否用Python处理本地的PDF文档,进行段落拆分和文字提取。这说明用户可能在处理学术文献,需要自动化处理下载后的PDF文件,可能是为了后续的文本分析、信息抽取或者建立知识库之类的需求。 首先,我需要确认用户的具体需求。用户提到段落拆分和文字提取,可能不仅仅是简单的文本提取,还需要保持段落结构,这样后续处理会更方便。PDF的解析本身比较复杂,因为PDF有不同的编码格式,可能有图片、表格等文本元素,这些都需要考虑进去。 接下来,我需要考虑使用哪些Python库。常见的库有PyPDF2、pdfplumber、PyMuPDF,可能还有其他的。需要比较这些库的优缺点,比如PyPDF2比较基础,但处理复杂布局可能不够好;pdfplumber能提取更详细的布局信息,包括表格;PyMuPDF速度较快,但安装可能麻烦一些。另外,文本提取后的段落拆分可能需要一些自然语言处理的方法,比如根据句号、换行符或者缩进来判断段落边界。 然后,用户可能有不同的PDF类型,比如扫描版的图片PDF和可编辑的文字PDF。对于图片PDF,需要OCR处理,比如用pytesseract和pdf2image库。这时候要提醒用户这两种情况的处理方式不同,是否需要自动检测还是分开处理。 还需要考虑编码题,PDF中的文本可能有特殊的编码格式,提取时要注意正确解码。另外,处理后的文本如何保存,比如分段落保存到TXT文件或者CSV中,方便后续使用。 用户可能还关心处理后的准确率,比如是否能正确识别段落结构,是否保留原文的格式。这时候需要给出一些处理策略,比如基于缩进、换行符或句子结束符来拆分段落,同时也要说明这些方法可能有误差,需要根据具体文档调整。 最后,可能需要给出一个完整的示例代码,从读取PDF提取文本,再到段落拆分和保存结果,让用户能够直接参考使用。同时要提醒用户注意依赖库的安装,比如Tesseract OCR的安装路径题,避免运行时出错。 还要注意法律题,确保用户处理的PDF文档是合法获得的,避免涉及版权题。可能不需要特别强调,但如果有相关风险的话,还是应该提一下。 总结来说,我需要分步骤解释如何用Python提取PDF文本,处理不同情况,拆分段落,并提供代码示例和注意事项,确保用户能够顺利实现需求。</think>以下是使用Python进行 **PDF文档段落拆分与文字提取** 的完整技术方案,包含 **多种格式处理** 和 **智能分段策略**: --- ### 一、技术路线选择 ```mermaid graph TD A[PDF类型] --> B{是否可复制文字?} B -->|可编辑文本| C[直接文本提取] B -->|扫描件图片| D[OCR文字识别] C --> E[基于布局的段落分割] D --> E E --> F[结构化输出] ``` --- ### 二、核心工具库 | 库名称 | 功能定位 | 安装命令 | |-----------------|---------------------------|--------------------------| | **PyPDF2** | 基础文本提取 | `pip install PyPDF2` | | **pdfplumber** | 精准文字+表格提取 | `pip install pdfplumber` | | **PyMuPDF** | 高性能解析 | `pip install PyMuPDF` | | **pytesseract** | OCR图像文字识别 | `pip install pytesseract`| --- ### 三、具体实现步骤 #### **1. 文本PDF解析(以pdfplumber为例)** ```python import pdfplumber def extract_text(pdf_path): paragraphs = [] with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: text = page.extract_text(layout=True) # 保留布局信息 # 基于缩进和换行的段落分割 current_para = [] for line in text.split('\n'): if line.strip() == '': if current_para: paragraphs.append(' '.join(current_para)) current_para = [] else: # 判断行首缩进(需根据实际文档调整阈值) if line.startswith(' ') and current_para: paragraphs.append(' '.join(current_para)) current_para = [line.lstrip()] else: current_para.append(line) if current_para: paragraphs.append(' '.join(current_para)) return paragraphs ``` #### **2. 扫描件PDF处理(OCR方案)** ```python from pdf2image import convert_from_path import pytesseract def ocr_pdf(pdf_path): images = convert_from_path(pdf_path, dpi=300) full_text = [] for img in images: text = pytesseract.image_to_string(img, lang='chi_sim+eng') full_text.append(text) # 合并后使用NLP模型进行段落划分(需安装spacy) import spacy nlp = spacy.load('zh_core_web_sm') doc = nlp('\n'.join(full_text)) return [sent.text.strip() for sent in doc.sents] ``` --- ### 四、进阶处理技巧 #### **1. 保留原文结构** ```python # 使用pdfminer获取精确坐标信息 from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainer def layout_analysis(pdf_path): structure = [] for page_layout in extract_pages(pdf_path): for element in page_layout: if isinstance(element, LTTextContainer): structure.append({ 'text': element.get_text(), 'x0': element.x0, 'y0': element.y0, 'x1': element.x1, 'y1': element.y1 }) # 根据坐标进行段落重组 return structure ``` #### **2. 深度学习段落分割** ```python # 使用预训练模型(需安装transformers) from transformers import pipeline segmenter = pipeline("text-classification", model="shibing624/text2vec-base-chinese-paragraph") def ai_segment(text): chunks = [] max_length = 512 # 模型最大输入长度 for i in range(0, len(text), max_length): chunk = text[i:i+max_length] result = segmenter(chunk) chunks.extend(result['split_points']) return chunks ``` --- ### 五、完整工作流示例 ```python import pandas as pd def process_pdf(pdf_path, output_format='csv'): # 自动检测PDF类型 if is_scanned_pdf(pdf_path): # 需要实现检测逻辑 paragraphs = ocr_pdf(pdf_path) else: paragraphs = extract_text(pdf_path) # 结果输出 df = pd.DataFrame({'paragraph': paragraphs}) if output_format == 'csv': df.to_csv('output.csv', index=False) elif output_format == 'txt': with open('output.txt', 'w', encoding='utf-8') as f: f.write('\n\n'.join(paragraphs)) return df ``` --- ### 六、注意事项 1. **编码题处理** ```python # 处理特殊字符 text = text.encode('latin-1', 'replace').decode('utf-8', 'ignore') ``` 2. **性能优化** - 多页PDF使用多线程处理 - 启用PyMuPDF的加速模式:`open(filename, fast=True)` 3. **格式保留建议** - 使用`pdfplumber`的`extract_text()`保持文本顺序 - 对于学术论文,优先提取章节标题(正则表达式匹配`\d\.\s[A-Za-z]+`) --- ### 七、典型题解决方案 | 题现象 | 解决方案 | |-------------------------|------------------------------| | 文字乱码 | 尝试`latin-1`/`gbk`编码转换 | | 段落合并错误 | 调整缩进检测阈值 | | 表格内容混杂在文本中 | 使用`pdfplumber.extract_tables()`单独处理 | | 数学公式丢失 | 配合LaTeX解析器 | --- **扩展建议**:对于需要更高精度的场景,可以结合使用: - PDF结构解析器:`pdfminer.six` - 公式识别:`pix2tex` 模型 - 版式还原:`pdf2htmlEX` 转换工具
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值