Python中如何无损转换PDF为图片文件或进行OCR识别,命令行形式?

我的目的是想 ocr 的一个 pdf 文件, 用 python 调用的方式, 我是用了百度 ocr 的接口, 但是这个接口没有办法转换,pdf 文件,可以转换图片文件,嗯,所以我用了 mutool 这个东西去转换 pdf 文件为图片文件,但是问题是,转换过来的图片是比较模糊的,这个应该不利于 ocr 识别,所以我现在想了两个办法,有没有什么高清可以无损转换 pdf 文件的方法?或者有没有什么直接可以 ocr 这个 pdf 文件的方法?

在这里先感谢各位了,


Python中如何无损转换PDF为图片文件或进行OCR识别,命令行形式?

7 回复

tesseract


import fitz  # PyMuPDF
from PIL import Image
import sys
import os

def pdf_to_images(pdf_path, output_dir="output_images", dpi=300):
    """
    将PDF每页转换为高质量PNG图片
    
    参数:
        pdf_path: PDF文件路径
        output_dir: 输出目录
        dpi: 输出分辨率(默认300)
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 打开PDF文件
    doc = fitz.open(pdf_path)
    
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        
        # 设置缩放比例(dpi/72 因为PDF默认72dpi)
        zoom = dpi / 72
        mat = fitz.Matrix(zoom, zoom)
        
        # 渲染页面为图片
        pix = page.get_pixmap(matrix=mat, alpha=False)
        
        # 保存为PNG
        output_path = os.path.join(output_dir, f"page_{page_num+1:03d}.png")
        pix.save(output_path)
        
        print(f"已保存: {output_path}")
    
    doc.close()
    return output_dir

def pdf_ocr_to_text(pdf_path, output_txt="output.txt"):
    """
    使用OCR提取PDF中的文字
    
    需要安装: pip install pytesseract pillow
    还需要安装Tesseract OCR引擎
    """
    try:
        import pytesseract
        from PIL import Image
        import io
        
        # 检查Tesseract是否安装
        pytesseract.get_tesseract_version()
    except Exception as e:
        print("请先安装Tesseract OCR和pytesseract")
        print("Ubuntu: sudo apt-get install tesseract-ocr")
        print("Mac: brew install tesseract")
        print("然后: pip install pytesseract pillow")
        return
    
    doc = fitz.open(pdf_path)
    all_text = []
    
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        
        # 渲染页面为图片
        pix = page.get_pixmap(dpi=300)
        img_data = pix.tobytes("png")
        
        # 转换为PIL Image
        img = Image.open(io.BytesIO(img_data))
        
        # 执行OCR
        text = pytesseract.image_to_string(img, lang='chi_sim+eng')
        all_text.append(f"--- 第 {page_num+1} 页 ---\n{text}\n")
        
        print(f"已处理第 {page_num+1} 页")
    
    # 保存文本
    with open(output_txt, 'w', encoding='utf-8') as f:
        f.write('\n'.join(all_text))
    
    doc.close()
    print(f"OCR结果已保存到: {output_txt}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("使用方法:")
        print("1. 转换为图片: python pdf_tool.py convert input.pdf [output_dir] [dpi]")
        print("2. OCR识别: python pdf_tool.py ocr input.pdf [output.txt]")
        sys.exit(1)
    
    command = sys.argv[1]
    
    if command == "convert":
        pdf_path = sys.argv[2]
        output_dir = sys.argv[3] if len(sys.argv) > 3 else "output_images"
        dpi = int(sys.argv[4]) if len(sys.argv) > 4 else 300
        pdf_to_images(pdf_path, output_dir, dpi)
        
    elif command == "ocr":
        pdf_path = sys.argv[2]
        output_txt = sys.argv[3] if len(sys.argv) > 3 else "output.txt"
        pdf_ocr_to_text(pdf_path, output_txt)
        
    else:
        print("未知命令,使用 'convert' 或 'ocr'")

安装依赖:

pip install PyMuPDF pillow pytesseract

命令行使用:

# 转换为图片(300dpi)
python pdf_tool.py convert document.pdf

# 转换为图片到指定目录,600dpi
python pdf_tool.py convert document.pdf high_res_images 600

# OCR识别
python pdf_tool.py ocr scanned_document.pdf

# OCR识别到指定文件
python pdf_tool.py ocr scanned_document.pdf result.txt

核心要点:

  • PyMuPDF:高质量的PDF渲染引擎,支持高分辨率输出
  • Pillow:图像处理,配合OCR使用
  • Tesseract:开源OCR引擎,支持多语言(中文需chi_sim语言包)

一句话建议: 用PyMuPDF做转换,Tesseract做OCR,这是最靠谱的组合。

GitHub 搜索 PyPDFOCR

xpdf. 或者… 不需要批量处理? 用 pdf.io 在线处理.

gs -sDEVICE=jpeg -sOutputFile=%09d.jpg -r300 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dBATCH -dNOPAUSE

这个工具 ok 的 无损转换 谢谢

回到顶部