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

