使用Python + fitz + PIL+ pytesseract 解析PDF

本文介绍了一种处理PDF文件内容的方法,特别是针对扫描版PDF,先将其转换为图片,再利用OCR技术识别图片中的文字,包括使用Python的fitz库进行PDF到图片的转换,以及pytesseract模块进行图片的OCR识别。

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

之前想了很多种办法来解析PDF文件内容(Python 读取PDF文件),一般针对电子版word或者Excel转化为PDF的PDF文件具有不错的效果,但是依然不能解析图片(图片中文字)内容,如果PDF是扫描版呢,那种方法就不行了。

所以我又想了另一个办法,就是先把PDF文件转化为图片,然后再将图片进行OCR识别,得到最终PDF的内容。

1 把PDF转化为图片

可以参考博文:windows下用Python把pdf文件转化为图片

代码如下:

import fitz

PDF_path = "你的PDF文件路径"
imgs_save_path = "图片保存文件夹路径"

def PDF_to_imgs(PDF_path, save_path):
    # 打开PDF文件,生成一个对象
    doc = fitz.open(PDF_path)

    # 将PDF文件的每一页都转化为图片
    for pg in range(doc.pageCount):
        page = doc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高4倍的图像。
        zoom_x = 2
        zoom_y = 2
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pm = page.getPixmap(matrix=trans, alpha=False)
        pm.writePNG(save_path + '%s.png' % pg)
        
                
PDF_to_imgs(PDF_path, imgs_save_path)          

2 将图片进行OCR识别

pytesseract模块的安装参考博文:基于python的OCR字符识别

代码如下:

import os
import pytesseract
 
from PIL import Image

imgs_save_path = "C:\\Users\\Administrator\\Desktop\\PDF\\"
txts_save_path = "C:\\Users\\Administrator\\Desktop\\TXT\\"
        
def img_to_txt(imgs_path, save_path):
    # 将文件夹下的所有图片进行OCR识别
    for files, _, file_names in os.walk(imgs_path):
        for file_name in file_names:
            image = Image.open(files + file_name)
            # chi_sim 是中文识别包,equ 是数学公式包,eng 是英文包
            content = pytesseract.image_to_string(image, lang="chi_sim")
            txt_name = file_name.split(".")[0] + ".txt"
            with open(save_path + txt_name, "w") as f:
                f.write(content)


img_to_txt(imgs_save_path, txts_save_path)          

 

### Python 实现 PDF 扫描件 Word 的方法 要将 PDF 扈扫件换为 Word 文档,可以采用不同的库和技术方案。以下是几种常见的实现方式及其特点。 #### 方法一:使用 `PyPDF2` 和 `python-docx` 这种方法适用于简单的文本提取场景,但对于扫描件的效果有限,因为扫描件通常是以图像形式存储的内容。如果扫描件中的文字无法被识别,则需要借助 OCR 技术来先提取文本[^1]。 ```python import PyPDF2 def pdf_to_word(pdf_path, word_path): with open(pdf_path, 'rb') as file: reader = PyPDF2.PdfReader(file) text = "" for page in range(len(reader.pages)): text += reader.pages[page].extract_text() with open(word_path, 'w', encoding='utf-8') as file: file.write(text) pdf_to_word('input.pdf', 'output.doc') ``` 此方法仅适合纯文本型 PDF 文件,对于扫描件效果不佳[^1]。 --- #### 方法二:结合 OCR 处理扫描件 当面对的是扫描件时,推荐引入 OCR(光学字符识别)技术。常用的工具是 Tesseract OCR 结合 PIL 或 OpenCV 来处理图像内容。以下是一个完整的流程: 1. 将 PDF 中的每页化为图像; 2. 对图像应用 OCR 提取文本; 3. 将提取到的文字写入 Word 文件。 代码示例如下: ```python from PIL import Image import pytesseract import fitz # PyMuPDF from docx import Document def extract_text_from_image(image_bytes): image = Image.open(io.BytesIO(image_bytes)) return pytesseract.image_to_string(image) def pdf_scanner_to_word(pdf_path, word_path): document = Document() pdf_document = fitz.open(pdf_path) for page_num in range(len(pdf_document)): page = pdf_document.load_page(page_num) pix = page.get_pixmap() # 获取页面像素数据 img_data = pix.tobytes() # 换为字节流 extracted_text = extract_text_from_image(img_data) document.add_paragraph(extracted_text) # 添加段落到 Word document.save(word_path) # 使用示例 pdf_scanner_to_word('scanned_pdf.pdf', 'output.docx') ``` 上述代码依赖于 `pytesseract` 库来进行 OCR 操作,并通过 `fitz` 加载 PDF 页面并将其渲染为图像[^4]。 --- #### 方法三:利用 `pdf2docx` 进行高质量换 `pdf2docx` 是一个专门用于 PDF 到 Word 换的库,它能够较好地保留原始布局和样式。安装命令如下: ```bash pip install pdf2docx ``` 其核心代码非常简洁: ```python from pdf2docx import Converter def convert_pdf_to_docx(pdf_file, docx_file): cv = Converter(pdf_file) cv.convert(docx_file, start=0, end=None) cv.close() convert_pdf_to_docx('input.pdf', 'output.docx') ``` 尽管如此,对于扫描件而言,该库仍然可能表现欠佳,因为它主要针对可编辑的 PDF 文件设计[^3]。 --- #### 方法四:基于 `pypandoc` 的高级解决方案 另一种强大的选项是使用 Pandoc 工具配合 `pypandoc` 包完成复杂格式间的互。不过需要注意的是,Pandoc 需要在本地环境中预先配置好。 ```python import pypandoc def convert_with_pypandoc(input_file, output_file): output = pypandoc.convert_file(input_file, 'docx', outputfile=output_file) assert output == "" convert_with_pypandoc('input.pdf', 'output.docx') ``` 这种方式灵活性高,但同样不擅长直接解析扫描件[^2]。 --- ### 总结 不同方法各有优劣: - **简单文本提取** 可用 `PyPDF2` + `python-docx`。 - **OCR 支持下的扫描件处理** 推荐组合 `Tesseract`, `Fitz`, 和 `DocX`. - **保持原样式的高效换** 建议选用 `pdf2docx`. 最终的选择取决于实际需求以及输入 PDF 的特性。 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值