带 OCR 功能的批量 PDF 转 TXT 代码(无需全局环境变量)

import os
import pdfplumber
from PIL import Image
import pytesseract  # 导入OCR库


def batch_pdf_to_txt(pdf_folder, txt_folder, tesseract_path):
    """
    批量将PDF转换为TXT(支持文字版和扫描版,需指定Tesseract路径)
    :param pdf_folder: PDF文件夹路径
    :param txt_folder: TXT保存路径
    :param tesseract_path: Tesseract的安装路径(指向tesseract.exe)
    """
    # 1. 检查Tesseract路径是否有效(关键:确保能找到引擎)
    if not os.path.exists(tesseract_path):
        print(f"错误:Tesseract路径不存在 -> {tesseract_path}")
        print("请检查路径是否正确,例如:C:\\Program Files\\Tesseract-OCR\\tesseract.exe")
        return

    # 2. 配置pytesseract使用指定的Tesseract路径
    pytesseract.pytesseract.tesseract_cmd = tesseract_path

    # 3. 检查PDF源文件夹
    if not os.path.exists(pdf_folder):
        print(f"错误:PDF源文件夹不存在 -> {pdf_folder}")
        return

    # 4. 创建TXT保存文件夹
    if not os.path.exists(txt_folder):
        os.makedirs(txt_folder)
        print(f"已创建TXT保存文件夹 -> {txt_folder}")

    # 5. 获取所有PDF文件
    pdf_files = [f for f in os.listdir(pdf_folder) if f.lower().endswith(".pdf")]
    if not pdf_files:
        print(f"警告:未找到PDF文件 -> {pdf_folder}")
        return

    print(f"共发现 {len(pdf_files)} 个PDF文件,开始转换(扫描版会自动OCR识别)...")

    # 6. 逐个转换(文字版直接提取,扫描版用OCR)
    for filename in pdf_files:
        pdf_path = os.path.join(pdf_folder, filename)
        txt_filename = os.path.splitext(filename)[0] + ".txt"
        txt_path = os.path.join(txt_folder, txt_filename)

        try:
            with pdfplumber.open(pdf_path) as pdf:
                all_text = ""
                for page_num, page in enumerate(pdf.pages, 1):
                    # 先尝试直接提取文字(文字版PDF)
                    page_text = page.extract_text()
                    
                    if page_text:
                        # 文字版:直接添加文本
                        all_text += f"=== 第{page_num}页(文字版) ===\n"
                        all_text += page_text + "\n\n"
                    else:
                        # 扫描版:用OCR识别(转换为图片后识别)
                        print(f"⚠️  {filename} 第{page_num}页是扫描件,正在OCR识别...")
                        # 将PDF页面转为高清图片(300dpi确保识别 accuracy)
                        img = page.to_image(resolution=300)
                        temp_img_path = "temp_page.png"  # 临时图片路径
                        img.save(temp_img_path)
                        
                        # OCR识别(支持中英文混合,lang参数可按需调整)
                        # 仅英文:lang='eng';仅简体中文:lang='chi_sim';混合:lang='chi_sim+eng'
                        ocr_text = pytesseract.image_to_string(
                            Image.open(temp_img_path),
                            lang='chi_sim+eng'  # 四六级资料建议用这个,兼顾中英文
                        )
                        
                        # 添加OCR结果到文本
                        all_text += f"=== 第{page_num}页(OCR识别) ===\n"
                        all_text += ocr_text + "\n\n"
                        
                        # 删除临时图片
                        os.remove(temp_img_path)

            # 保存到TXT
            with open(txt_path, "w", encoding="utf-8") as f:
                f.write(all_text)

            print(f"✅ 转换成功:{filename} -> {txt_filename}")

        except PermissionError:
            print(f"❌ {filename} 失败:权限不足(无法读取PDF或写入TXT)")
        except FileNotFoundError:
            print(f"❌ {filename} 失败:文件已被删除或移动")
        except Exception as e:
            print(f"❌ {filename} 失败:{str(e)}")


# ----------------------
# 主函数:执行转换(需手动填写Tesseract路径)
# ----------------------
if __name__ == "__main__":
    # 1. 填写你的PDF和TXT文件夹路径(双反斜杠或斜杠)
    pdf_folder = "D:\\大四上文件\\英语\\cet6_pdfs"
    txt_folder = "D:\\大四上文件\\英语\\cet6_txts"

    # 2. 关键:填写你的Tesseract安装路径(必须指向tesseract.exe)
    # 示例默认路径(64位系统):
    tesseract_path = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
    # 如果你装在其他位置,比如D盘:
    # tesseract_path = r"D:\Software\Tesseract-OCR\tesseract.exe"

    # 执行转换
    batch_pdf_to_txt(pdf_folder, txt_folder, tesseract_path)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值