python 提取pdf文件中的信息

本文详细介绍使用Python读取PDF文件的方法,涵盖pdfminer3k、fitz和pymupdf三个扩展包。通过实例代码讲解如何提取PDF文档中的文本信息,并介绍各对象作用及文档属性方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python 读取pdf文件有3个扩展包   pdfminer3k(python2中为pdfminer)、fitz和pymupdf

1.pdfminer3k

读取并获得pdf文档中的信息:

from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager,PDFPageInterpreter,PDFTextExtractionNotAllowed
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams,LTTextLineHorizontal,LTFigure,LTRect,LTLine,LTCurve

#  文件对象
pd_file = open("d.pdf", "rb")

#  pdf文件解析对象
parser = PDFParser(pd_file)

# print(parser)
#  pdf文档对象
document = PDFDocument()
parser.set_document(document)
document.set_parser(parser)


#  初始化文档密码
document.initialize()
if document.is_extractable:
    print(True)
else:
    raise PDFTextExtractionNotAllowed
#  存储文档资源
src = PDFResourceManager()

#  设备对象
device = PDFPageAggregator(src,laparams=LAParams())

#  解释器对象

inter = PDFPageInterpreter(src,device)

pages = document.get_pages()

for page in pages:
    #print(page.contents)
    inter.process_page(page)
    layout = device.get_result()
    for x in layout:
        if isinstance(x, LTTextBoxHorizontal):
            print(str(x.get_text()))
        #t = dir(x)
        #print(t)
        #print(type(x))

以上代码属于搬运工 (~自带笑哭表情~~~)

上述代码中各个对象的作用:

文件解析对象(PDFParser):从文件中提取数据                                                 

文档对象(PDFDocument): 保存提取到的数据

资源对象(PDFResourceManager):保存共享内容

设备对象(PDFDevice):处理资源对象为我们所需要的格式

解释器对象(PDFPageInterpreter): 处理页面内容

layout : 包含文档的全部内容对象主要包含:

    LTPage:页面对象

    LTTextBox:代表一个区域内的文字信息,包含多个LTTextLine,get_text()方法可以获得文本内容。

    LTTextLine:代表一行文字信息,包含多个LTChar,get_text()方法可以获得文本内容。

    LTChar:代表一个字符信息,get_text()方法可以获得文本内容。

    LTAnno:代表文本中的字符的Unicode字符串。

    LTFigure:代表PDF的表单对象,可以包含图形或图片。

    LTImage:代表一个图片对象。

    LTLine : 代表一条直线。

    LTRect:代表一个矩形区域。

    LTCurve:代表一条曲线。

tip:LTTextBox、LTTextLine可以分别和Horizontal、Vertical 组合表示水平方向和垂直方向

文档对象(Document)常用属性和方法:

    doc.get_outlines(): 获取文档的目录数据

    doc.is_extractable(): 判断文档是否支持转文字

    doc.get_pages(): 获取所有页面对象

    doc.initialize():初始化文档密码

    doc.set_parser():绑定文档解析对像

内容对象(LTTextBox、LTTextLine、LTImage...等等)常用属性和方法:

    LTImage:

        LTImage.get_rawdata(): 获取图片数据

2. fitz 包:

   参考:https://blog.youkuaiyun.com/qq_15969343/article/details/81673302

3.pymupdf包:

   操作pdf文件,可以实现创建pdf文件、修改pdf文件等等。。功能强大。(以后补充...)

 

 

<think>首先,用户的问题是:“我想从扫描的PDF文件提取文本信息 请问Python 提取扫描版PDF中的文本内容”。这是一个关于使用Python提取扫描版PDF文本内容的问题。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 参考站内引用: - 引用[1]: 关于Python解析PDF提取文本内容,提到有工具和库可用。 - 引用[2]: 关于使用OCR技术提取扫描版PDF文本,需要安装tesseract-ocr引擎。 这些引用是参考,我需要基于用户的问题来构建回答。用户的问题是关于扫描版PDF的,所以引用[2]更相关。 用户问题:提取扫描版PDF中的文本内容。扫描版PDF通常是图像,因此文本不是直接可选的;需要使用OCR(光学字符识别)技术。 关键点: - 扫描版PDF是图像,所以标准PDF文本提取库(如PyPDF2)可能无效。 - 需要OCR来识别图像中的文本。 推荐的Python库: - PyMuPDF (fitz):用于处理PDF文件,可以提取图像。 - Tesseract-OCR:用于OCR识别文本。 - pytesseract:Python包装器用于Tesseract。 - 其他库如Pillow用于图像处理。 步骤: 1. 安装必要的库:PyMuPDF, pytesseract, Tesseract-OCR引擎。 2. 使用PyMuPDF提取PDF中的图像。 3. 使用OCR(通过pytesseract)识别图像中的文本。 4. 组合结果。 确保回答结构化: - 逐步解释。 - 提供代码示例。 - 使用中文。 - 生成相关问题。 最后,生成相关问题。 回答结构: 1. 介绍扫描版PDF的特点。 2. 解释为什么需要OCR。 3. 列出所需工具和安装步骤。 4. 提供代码示例。 5. 讨论潜在问题和优化。 6. 添加引用标识。 7. 生成相关问题。 引用标识:在相关段落末尾添加[^1]或[^2]。引用[1]是关于一般PDF文本提取,引用[2]是关于扫描版PDF和OCR。所以,在提到OCR或tesseract时,使用[^2]。 代码示例:需要写一个Python函数或脚本,使用PyMuPDF提取图像,然后用pytesseract进行OCR。 确保LaTeX:用户的问题没有数学内容,但如果有数学表达式,使用正确格式。这里可能不需要。 生成相关问题:在结尾添加相关问题。</think>### Python 提取扫描版 PDF 中的文本内容 扫描版 PDF 文件本质上是图像文件(如 JPG 或 PNG 格式的页面),而不是包含可编辑文本的数字 PDF。因此,直接使用标准 PDF 文本提取库(如 PyPDF2)无法获取文本内容。相反,需要结合 OCR(光学字符识别)技术来识别图像中的文字。下面我将逐步解释如何使用 Python 实现这一过程,确保回答真实可靠,基于实际工具和实践经验。 #### 1. **理解扫描版 PDF 的特点** - 扫描版 PDF 由扫描仪或相机生成,每个页面是位图图像,文本不可直接选择或提取。 - 提取文本需要先将 PDF 页面转换为图像,然后使用 OCR 引擎识别图像中的文字。 - 常见挑战包括图像质量差、字体模糊或语言兼容性问题(如中英文混合)[^2]。 #### 2. **所需工具和安装步骤** 在开始前,确保安装以下 Python 库和外部引擎: - **Python 库**: - `PyMuPDF` (fitz):用于读取 PDF 文件提取图像。 - `pytesseract`:Python 包装器,调用 Tesseract OCR 引擎。 - `Pillow` (PIL):处理图像格式转换。 - 安装命令(使用 pip): ```bash pip install PyMuPDF pytesseract pillow ``` - **外部 OCR 引擎**: - Tesseract-OCR:开源 OCR 引擎,支持多语言(包括中文)。 - 下载安装(Windows 环境): - 从 [Tesseract GitHub 发布页](https://github.com/tesseract-ocr/tesseract/releases) 下载安装包(如 `tesseract-ocr-w64-setup-5.3.3.20231005.exe`)。 - 安装时勾选“中文(简体)”语言包,以支持中文识别[^2]。 - 安装后,设置环境变量:将 Tesseract 的安装路径(如 `C:\Program Files\Tesseract-OCR`)添加到系统 PATH。 - 验证安装:在命令行运行 `tesseract --version`,确保输出版本信息。 #### 3. **Python 代码实现步骤** 以下代码示例演示了如何从扫描版 PDF提取文本。代码兼容中英文识别,并处理了常见错误(如图像质量差)。 ```python import fitz # PyMuPDF from PIL import Image import pytesseract import io # 设置 Tesseract 路径(如果未添加到环境变量,需指定) # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def extract_text_from_scanned_pdf(pdf_path, output_txt_path): """ 提取扫描版 PDF文本内容并保存到文本文件。 :param pdf_path: 输入 PDF 文件路径 :param output_txt_path: 输出文本文件路径 """ # 打开 PDF 文件 doc = fitz.open(pdf_path) text_content = [] # 遍历每一页 for page_num in range(len(doc)): page = doc.load_page(page_num) # 将页面渲染为图像(分辨率设为 300 DPI 以提高识别率) pix = page.get_pixmap(matrix=fitz.Matrix(300/72, 300/72)) img_bytes = pix.tobytes("ppm") # 转换为 PPM 格式字节流 img = Image.open(io.BytesIO(img_bytes)) # 使用 Tesseract OCR 识别图像中的文本 # 设置语言参数:英文(eng)和中文(chi_sim) text = pytesseract.image_to_string(img, lang='eng+chi_sim') text_content.append(f"Page {page_num + 1}:\n{text}\n") # 保存所有文本到文件 with open(output_txt_path, 'w', encoding='utf-8') as f: f.write("\n".join(text_content)) print(f"文本已保存到: {output_txt_path}") # 示例用法 if __name__ == "__main__": pdf_path = "扫描文件.pdf" # 替换为你的 PDF 文件路径 output_path = "提取文本.txt" # 输出文本文件路径 extract_text_from_scanned_pdf(pdf_path, output_path) ``` #### 4. **代码解释和优化建议** - **关键步骤**: - 使用 `PyMuPDF` 将 PDF 页面渲染为高分辨率图像(300 DPI),提高 OCR 准确性。 - `pytesseract.image_to_string` 调用 Tesseract OCR 识别文本,语言参数 `lang='eng+chi_sim'` 支持中英文混合。 - 输出保存为 UTF-8 编码文本文件,避免乱码。 - **优化建议**: - **图像预处理**:如果图像质量差(如低对比度),使用 `Pillow` 调整亮度、对比度或二值化处理(例如 `img = img.convert('L').point(lambda x: 0 if x < 128 else 255, '1')`)。 - **多线程处理**:对于大型 PDF,使用 `concurrent.futures` 并行处理页面,加速提取。 - **语言支持**:确保 Tesseract 安装了所需语言包(运行 `tesseract --list-langs` 检查)。 - **错误处理**:添加 try-except 块捕获 OCR 失败(如 `pytesseract.TesseractError`)。 - **潜在问题**: - OCR 准确率受图像质量影响:模糊或倾斜文本可能导致错误。建议使用扫描仪设置高 DPI(至少 300 DPI)。 - 中文识别:Tesseract 对简体中文支持良好,但复杂字体可能需要训练自定义模型[^2]。 #### 5. **性能和应用场景** - **性能**:OCR 处理较慢(每页约 2-10 秒,取决于图像大小和硬件)。优化图像分辨率可平衡速度与准确率。 - **应用场景**:适用于档案数字化、法律文档提取或学术论文处理,尤其当 PDF 来自扫描书籍或合同[^1][^2]。 通过以上步骤,您可以高效提取扫描版 PDF 文本。如果遇到问题,检查图像质量或调整 OCR 参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值