Flask环境下PDF转文本的编码错误及公式乱码问题求助
解决Flask环境下PDF转文本的Unicode编码错误与公式乱码问题
问题分析
- UnicodeEncodeError 原因:Flask运行环境默认输出编码可能是系统字符集(如Windows的cp1252)而非UTF-8,无法解析PDF中的特殊Unicode字符(如公式符号)。原代码里的
encode('utf-8').decode('utf-8')属于多余操作,PyMuPDF的page.get_text()本身已返回Unicode字符串。 - 公式乱码原因:PDF中的公式若使用特殊嵌入字体或矢量格式,默认文本提取模式无法将其转换为可读Unicode字符,会输出
\x91\x91 \xf0\x9d这类字节表示。
解决方案
1. 修复编码错误,确保Flask响应UTF-8输出
修改PDF解析函数,移除多余编码转换,并在Flask返回响应时明确指定UTF-8编码:
优化后的PDF解析函数
def convert_pdf_to_text(pdf_path): """将PDF文件转换为Unicode文本,保留特殊字符""" try: with fitz.open(pdf_path) as doc: text = "" for page in doc: # 直接获取PyMuPDF返回的Unicode文本 page_text = page.get_text() text += page_text return text except Exception as e: # 打印错误时指定UTF-8编码,避免控制台输出乱码 print(f"处理{pdf_path}出错: {e}", encoding='utf-8') return None
Flask路由中指定响应编码
from flask import Flask, Response app = Flask(__name__) @app.route('/process-pdf') def process_pdf(): pdf_content = convert_pdf_to_text("target.pdf") if not pdf_content: return Response("PDF解析失败", status=500) # 明确设置响应的字符编码为UTF-8 return Response(pdf_content, content_type='text/plain; charset=utf-8')
2. 优化公式字符提取
如果默认get_text()模式提取公式仍为乱码,可尝试以下方式:
- 使用raw模式提取:保留更原始的字符表示,适合传递给OpenAI(OpenAI支持大部分Unicode特殊字符):
page_text = page.get_text("raw") - 使用dict模式提取字符元数据:若需进一步处理公式字符,可获取字符详细信息(如字体、位置),但用于OpenAI调用时raw模式已足够:
page_dict = page.get_text("dict") # 从字典中提取文本内容 page_text = ''.join([block['text'] for block in page_dict['blocks'] if 'text' in block])
3. 全局编码强制设置
若仍存在编码问题,可在Flask启动时强制标准输出/错误使用UTF-8:
import sys sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8') app = Flask(__name__)
验证
修改后,Flask返回的文本会正确保留公式的Unicode字符,可直接传递给OpenAI接口(OpenAI API支持UTF-8编码文本输入)。
内容的提问来源于stack exchange,提问作者Nathan Wang
相关产品推荐
相关产品推荐

