Tesseract + Poppler 实现图片型 PDF 转文字

发布于:2025-08-09 ⋅ 阅读:(22) ⋅ 点赞:(0)

用 Tesseract + Poppler 实现图片型 PDF 转文字(Windows/Linux 全流程)

一、需求背景

很多教材、文献是图片型 PDF(扫描件/截图生成),无法直接复制文字。借助 Tesseract(OCR 识别) + Poppler(PDF 转图片),可将这类 PDF 转为可编辑文本,用于知识整理、内容提取。

二、核心工具介绍

1. Tesseract(OCR 引擎)

  • 作用:识别图片中的文字,支持中英文等多语言。
  • 特点:开源免费、识别精度高,需搭配 Poppler 处理 PDF。

2. Poppler(PDF 处理工具集)

  • 作用:将 PDF 转为图片(PNG/JPEG),供 Tesseract 识别。
  • 特点:轻量高效,提供命令行工具(如 pdfinfo pdftoppm)。

三、Windows 环境安装配置

1. 下载地址

2. 安装步骤

Tesseract 安装
  1. 运行下载的 tesseract-ocr-w64-setup-vx.xx.x.exe,按向导安装。
  2. 配置环境变量
    • 找到安装目录(默认 C:\Program Files\Tesseract-OCR)。
    • 右键“此电脑”→属性→高级系统设置→环境变量→Path→添加上述路径。
  3. 验证:命令行输入 tesseract -v,显示版本即成功。
Poppler 安装
  1. 解压 poppler-xx.x.x.zip 到指定目录(如 D:\poppler)。
  2. 配置环境变量
    • 找到 poppler-xx.x.x\Library\bin 路径(含 pdfinfo.exe pdftoppm.exe)。
    • 添加到系统 Path 变量。
  3. 验证:打开cmd,命令行输入 pdfinfo -v,显示版本即成功。

四、Linux 环境安装配置(以 Ubuntu 为例)

1. 下载安装(通过包管理器)

# 更新软件源
sudo apt update  

# 安装 Tesseract(含中文语言包)
sudo apt install tesseract-ocr tesseract-ocr-chi-sim  

# 安装 Poppler
sudo apt install poppler-utils  

2. 验证

tesseract -v       # 检查 Tesseract 版本
pdfinfo -v         # 检查 Poppler 版本

五、Python 代码实现 PDF 转 Markdown

import os
import re
import gc
import subprocess
from pdf2image import convert_from_path
import pytesseract

# 配置路径(Linux 下无需手动指定,依赖系统环境)
if os.name == 'nt':
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
    poppler_path = r'D:\poppler\Release-24.08.0-0\poppler-24.08.0\Library\bin'
else:
    poppler_path = None  # Linux 下依赖系统环境


def process_pdf_page(pdf_path, page_num, lang='chi_sim'):
    """处理单页 PDF,识别后释放资源"""
    try:
        # 转换 PDF 页为图片
        pages = convert_from_path(
            pdf_path,
            dpi=200,
            first_page=page_num,
            last_page=page_num,
            poppler_path=poppler_path
        )
        if not pages:
            return ""
        page = pages[0]
        text = pytesseract.image_to_string(page, lang=lang)
        page.close()  # 主动释放内存
        return text
    except Exception as e:
        print(f"处理第 {page_num} 页失败: {e}")
        return ""


def pdf_to_md(pdf_path, md_path, lang='chi_sim'):
    # 获取 PDF 总页数(跨平台兼容)
    if os.name == 'nt':
        pdfinfo_path = os.path.join(poppler_path, 'pdfinfo.exe')
        result = subprocess.run(
            [pdfinfo_path, pdf_path],
            capture_output=True,
            text=True
        )
    else:
        result = subprocess.run(
            ['pdfinfo', pdf_path],
            capture_output=True,
            text=True
        )
    
    # 解析页数
    match = re.search(r'Pages:\s+(\d+)', result.stdout)
    if not match:
        print("无法获取 PDF 页数,请检查文件")
        return
    page_count = int(match.group(1))

    md_content = ""
    for page_num in range(1, page_count + 1):
        print(f"处理第 {page_num}/{page_count} 页...")
        text = process_pdf_page(pdf_path, page_num, lang)
        md_content += text + "\n\n"
        
        # 每 20 页强制垃圾回收
        if page_num % 20 == 0:
            gc.collect()

    # 保存为 Markdown
    with open(md_path, 'w', encoding='utf-8') as f:
        f.write(md_content)
    print(f"处理完成!共 {page_count} 页,保存至 {md_path}")


if __name__ == "__main__":
    pdf_path = "/path/to/your/pdf.pdf"  # 替换为实际路径
    md_path = "/path/to/output.md"      # 替换为输出路径
    
    # 中文识别需指定 lang='chi_sim',英文可省略
    pdf_to_md(pdf_path, md_path, lang='chi_sim')

六、使用技巧

  1. 提升识别精度

    • 调整 dpi=200(值越大越清晰,内存消耗越高)。
    • 预处理图片(裁剪、降噪)后再识别。
  2. 多语言支持

    • 中文用 lang='chi_sim',英文省略或用 lang='eng'
    • 安装对应语言包(如 tesseract-ocr-jpn 支持日语)。
  3. 内存优化

    • 每页识别后主动 page.close(),定期 gc.collect(),适合大 PDF 处理。

通过以上步骤,即可在 Windows/Linux 环境实现图片型 PDF 转文字,完美解决医学教材、扫描文档的文字提取需求!


网站公告

今日签到

点亮在社区的每一天
去签到