Python PDF文本提取故障排查:仅处理最后一页生成JPEG与文本文件的原因及解决方法
问题:PDF转图片OCR仅提取最后一页文本的原因与修复
作为Python新手,我实现了将PDF转为JPEG再提取文本的功能,但代码仅能处理PDF的最后一页,生成该页的JPEG文件并将内容写入文本文件,其余页面未被处理。请问该问题的原因是什么?如何修复?
问题原因分析
看你的代码,核心问题出在第二个循环的文件名复用上:
- 第一个
for循环遍历PDF的每一页,生成了page_1.jpg、page_2.jpg……page_n.jpg这些图片,但每次循环都会把当前页的文件名覆盖到filename变量里。 - 当第一个循环结束后,
filename已经变成了最后一页的图片名(比如page_5.jpg,如果PDF有5页的话)。 - 到第二个循环处理OCR时,你始终用
filename去打开图片,相当于每次都在读取最后一页的图片,自然只会输出最后一页的文本。
修复方案
只需要在第二个循环里,根据当前的循环索引i动态生成对应的图片文件名即可,不用复用之前的filename变量。修改后的完整代码如下:
from PIL import Image import pytesseract import sys from pdf2image import convert_from_path import os PDF_file = "file2.pdf" pages = convert_from_path(PDF_file, 500) image_counter = 1 # 第一步:把PDF的每一页转成JPEG for page in pages: filename = f"page_{image_counter}.jpg" page.save(filename, 'JPEG') image_counter += 1 filelimit = image_counter - 1 outfile = "out_text.txt" # 第二步:遍历所有生成的图片,提取文本并写入文件 # 用with语句自动管理文件,避免遗漏关闭操作 with open(outfile, "a") as f: for i in range(1, filelimit + 1): # 动态生成当前要处理的图片文件名 current_img = f"page_{i}.jpg" text = pytesseract.image_to_string(Image.open(current_img)) # 去掉换行时的连字符(比如单词被拆成两行的情况) text = text.replace('-\n', '') f.write(text)
额外优化建议
- 文件管理更安全:用
with语句操作文件,Python会在代码块结束后自动关闭文件,比手动调用f.close()更可靠。 - 清理临时文件:如果不需要保留生成的JPEG图片,可以在OCR完成后遍历删除这些临时文件,比如在代码最后加上:
for i in range(1, filelimit + 1): os.remove(f"page_{i}.jpg") - 优先直接提取文本:如果你的PDF本身是可编辑的(不是扫描件),用
pdfplumber或PyPDF2直接提取文本会比转图片OCR速度更快、准确率更高,不用走OCR的弯路。
内容的提问来源于stack exchange,提问作者JohnD




