使用PDFminer解析MathCad测试报告PDF出现符号乱码问题求助
问题根因
MathCad生成PDF时,会把自定义运算符:=存储为Unicode私有使用区的特殊字符,从你提供的输出来看:
\xef\x80\xba对应原始的冒号:\xef\x80\xbd对应原始的等号=
两个字符连续出现就是你需要的:=定位符,不需要修改PDF解析逻辑,只要加一层字符映射替换就能还原内容。
现有代码的错误点
- 第一段代码中不存在
unicode-8编码,应该使用utf-8,且直接将bytes对象转字符串写入文件,会额外写入b''标识污染内容 - 第二段代码存在缩进错误,打开PDF文件应该用二进制读模式
rb,写入文件的语法参数错误
完整可运行实现
from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.pdfparser import PDFParser from io import StringIO import re def extract_mathcad_params(pdf_path, output_txt_path=None): # 字符映射表,可根据后续发现的其他乱码补充 char_map = { '\xef\x80\xba': ':', '\xef\x80\xbd': '=' } output_string = StringIO() # 二进制读PDF with open(pdf_path, 'rb') as in_file: parser = PDFParser(in_file) doc = PDFDocument(parser) rsrcmgr = PDFResourceManager() device = TextConverter(rsrcmgr, output_string, laparams=LAParams()) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.create_pages(doc): interpreter.process_page(page) raw_text = output_string.getvalue() # 替换乱码字符 for bad_char, good_char in char_map.items(): raw_text = raw_text.replace(bad_char, good_char) # 可选:保存还原后的文本到文件 if output_txt_path: with open(output_txt_path, 'w', encoding='utf-8') as f: f.write(raw_text) # 提取所有Param:=Value格式的键值对 param_pattern = re.compile(r'(\w+)\s*:=\s*([^\n]+)') params = {} for match in param_pattern.finditer(raw_text): param_name = match.group(1).strip() param_value = match.group(2).strip() params[param_name] = param_value return params # 调用示例 if __name__ == '__main__': params = extract_mathcad_params("CHrpt.pdf", "还原后的报告.txt") # 打印提取到的参数 for k, v in params.items(): print(f"{k} = {v}") # 后续可以加逻辑把params写入配置数据库
后续优化说明
如果运行后还有其他特殊符号乱码,可以在还原后的文本里找到对应乱码的字符,添加到char_map映射表中即可。提取到的键值对可以直接对接你现有的配置数据库写入逻辑,完成自动更新。
内容的提问来源于stack exchange,提问作者Aaron Dalton
相关产品推荐
相关产品推荐

