使用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
相关产品推荐
相关产品推荐

