You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python PDF文本提取故障排查:仅处理最后一页生成JPEG与文本文件的原因及解决方法

问题:PDF转图片OCR仅提取最后一页文本的原因与修复

作为Python新手,我实现了将PDF转为JPEG再提取文本的功能,但代码仅能处理PDF的最后一页,生成该页的JPEG文件并将内容写入文本文件,其余页面未被处理。请问该问题的原因是什么?如何修复?


问题原因分析

看你的代码,核心问题出在第二个循环的文件名复用上:

  • 第一个for循环遍历PDF的每一页,生成了page_1.jpgpage_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本身是可编辑的(不是扫描件),用pdfplumberPyPDF2直接提取文本会比转图片OCR速度更快、准确率更高,不用走OCR的弯路。

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

火山引擎 最新活动