You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pytesseract与PyPDF2时页面重复/被覆盖问题排查

扫描版PDF转可搜索PDF页面顺序混乱问题

问题描述

我编写了代码将扫描版PDF转换为支持Ctrl+F搜索的PDF文件,但程序有时会出现页面顺序混乱的问题,例如输出页面序列为page1、page2、page3、page2、page5……即page2被重复写入,覆盖了page4的位置。以下是可复现问题的代码:

import pytesseract , PyPDF2 , io , os , tempfile
from pdf2image import convert_from_path
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

# 设置必要路径
pdf_folder_path = 'U:/pdf_folder/'
poppler_path = r'C:\poppler-24.02.0\Library\bin'
pytesseract.pytesseract.tesseract_cmd = r'C:\Users\User\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'

# 创建示例PDF文件
c = canvas.Canvas("output.pdf", pagesize=letter)
width, height = letter
c.setFont("Helvetica", 100)

for i in range(50):
    c.saveState()
    c.translate(width/2, height/2)
    c.drawCentredString(0, 0, str(i + 1))
    c.restoreState()
    c.showPage()
c.save()

# 列出文件夹中所有需要转换为可搜索格式的PDF文件
directory = os.fsencode(pdf_folder_path)
file_paths = []

for file in os.listdir(directory):
    filename = os.fsdecode(file)
    if filename.endswith('.pdf'): 
        file_paths.append(filename)
        continue
    else:
        continue

print('找到的文件:')

# 将扫描件转换为可搜索格式
for file in file_paths:

    original_pdf = 'U:/Make pdfs searchable/' + file
    searchable_pdf = original_pdf[:-4] + ' (searchable).pdf'

    print('当前处理文件: ' + original_pdf)

    with tempfile.TemporaryDirectory() as path:
        images = convert_from_path(original_pdf, poppler_path=poppler_path, output_folder=path)
        pdf_writer = PyPDF2.PdfWriter()
        for image in images:
            page = pytesseract.image_to_pdf_or_hocr(image, extension='pdf', lang='eng')
            pdf = PyPDF2.PdfReader(io.BytesIO(page))
            pdf_writer.add_page(pdf.pages[0])
        with open(searchable_pdf, "wb") as f:
            pdf_writer.write(f)
    print(original_pdf + ' 处理完成!')

print('所有处理完成.')

请问出现该问题的原因是什么?


临时解决办法(更新1/3)

尚未找到问题原因,但已使用PdfMerger()实现了一个临时解决办法,不过该方法速度较慢:

for file in os.listdir(input_folder):

    if file.endswith(".pdf"):

        original_pdf = input_folder + file
        modified_pdf = output_folder + file[:-4] + ' (searchable).pdf'

        print('当前处理PDF: ' + file)

        with tempfile.TemporaryDirectory() as path:
            images = convert_from_path(original_pdf, poppler_path=poppler_path, output_folder=path)
            merger = PyPDF2.PdfMerger()
            for count, image in enumerate(images, 1):
                print('当前处理页面: ' + str(count))
                page = pytesseract.image_to_pdf_or_hocr(image, extension='pdf', lang='eng')
                pdf = PyPDF2.PdfReader(io.BytesIO(page))
                merger.append(io.BytesIO(page))
            with open(modified_pdf, 'wb') as combined_pdf_file:
                merger.write(combined_pdf_file)

        print(file + ' 处理完成!')

print('所有处理完成.')

内容的提问来源于stack exchange,提问作者mas123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:05:04