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

使用Python提取PDF文本失败:文件无法打开且无文本返回

Python提取PDF简历文本的问题排查与解决

问题概述

尝试用Python提取简历PDF文本时,两种常规方案均失败:

方案1:PyMuPDF(fitz)二进制流提取

代码实现:

def extract_text_from_pdf_binary(pdf_binary):
    doc = fitz.open(stream=pdf_binary, filetype="pdf")
    num_pages = doc.page_count

    text = ''
    for page_number in range(num_pages):
        page = doc.load_page(page_number)
        text += page.get_text()

    doc.close()
    return text

@app.route('/', methods=['GET', 'POST'])
def index():
    form = UploadForm()
    if request.method == 'POST':
        file = request.files['file']
        binary = file.read()
        print(binary[0:300])
        text = extract_text_from_pdf_binary(binary)
        print("text: ", text)

问题:能读取二进制数据,但提取结果为空,更换其他PDF测试情况一致。

方案2:pdfminer保存文件后提取

代码实现:

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextBoxHorizontal

def extract_text_from_path(pdf_path):
    extracted_text = ''
    for page_layout in extract_pages(pdf_path):
        for element in page_layout:
            if isinstance(element, LTTextBoxHorizontal):
                obj_str = element.get_text()
                extracted_text += obj_str
    return extracted_text

@app.route('/', methods=['GET', 'POST'])
def index():
    form = UploadForm()
    if request.method == 'POST':
        file.save("temp.pdf")
        extract_text_from_path("temp.pdf")

问题:保存的temp.pdf无法打开,提示The file “temp.pdf” could not be opened.,同时触发错误:

pdfminer.pdfparser.PDFSyntaxError: No /Root object! - Is this really a PDF?

虽能读取文件内容,但无法完成文本提取。

从提供的PDF截图来看,该简历是扫描生成的图片型PDF,无内嵌文本层,这是导致常规文本提取工具失效的核心原因。


解决思路

1. 针对图片型PDF的OCR方案

扫描版PDF本质是图片集合,必须通过OCR技术识别图片中的文本,推荐使用pdf2image+pytesseract组合:

步骤1:安装依赖

pip install pdf2image pytesseract pillow

额外安装Tesseract OCR引擎:

  • Windows:下载官方安装包并配置环境变量
  • Linux:sudo apt install tesseract-ocr tesseract-ocr-chi-sim(含中文语言包)
  • Mac:brew install tesseract

步骤2:示例代码

from pdf2image import convert_from_bytes
import pytesseract
from flask import Flask, request, render_template
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'

class UploadForm(FlaskForm):
    file = FileField('上传PDF简历')
    submit = SubmitField('提取文本')

def extract_scanned_pdf(pdf_binary):
    # 将PDF二进制转为图片
    pages = convert_from_bytes(pdf_binary)
    full_text = ""
    # 逐页OCR识别
    for page in pages:
        full_text += pytesseract.image_to_string(page, lang='chi_sim')
    return full_text

@app.route('/', methods=['GET', 'POST'])
def index():
    form = UploadForm()
    result_text = ""
    if request.method == 'POST':
        file = request.files['file']
        pdf_data = file.read()
        result_text = extract_scanned_pdf(pdf_data)
    return render_template('index.html', form=form, extracted_text=result_text)

if __name__ == '__main__':
    app.run(debug=True)

2. 修复方案2的文件保存问题

方案2中文件保存后损坏,大概率是上传文件未完整写入,可添加完整性校验:

@app.route('/', methods=['GET', 'POST'])
def index():
    form = UploadForm()
    if request.method == 'POST':
        file = request.files['file']
        if not file.filename.endswith('.pdf'):
            print("请上传PDF格式文件")
            return render_template('index.html', form=form)
        
        try:
            file.save("temp.pdf")
            # 验证PDF文件头
            with open("temp.pdf", 'rb') as f:
                if f.read(4) != b'%PDF':
                    print("上传文件不是有效的PDF")
                else:
                    text = extract_text_from_path("temp.pdf")
                    print(text)
        except Exception as e:
            print(f"文件处理出错:{str(e)}")
    return render_template('index.html', form=form)

内容的提问来源于stack exchange,提问作者Revolucion for Monica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:37:52