提取PDF考试试题并写入文件时如何保留换行格式
提取PDF考试试题并写入文件时如何保留换行格式
看起来你在从PDF中提取考试题目时遇到了换行丢失的问题,同时还有提取文本里字母被无意义空格分隔的小麻烦。我来帮你分析下代码里的问题,再给出修正后的方案。
原代码的核心问题
- 题目收集逻辑顺序搞反了:你现在是先把每行内容加到
question里,再判断是否遇到题目标记,这会把页面开头到第一个题目标记的无关内容都混进题目里,后续的题目内容也会拼接混乱,换行格式自然就乱了。 - 字符串初始化冗余:
question = """"""""是多余的写法,直接用question = ""初始化空字符串就行,多出来的双引号不仅没用,还可能引发语法隐患。 - 重复的行拆分操作:你已经用
lines = text.splitlines()拆分了文本行,但循环里又重复调用text.splitlines(),完全可以复用已拆分的列表提升效率。
修正后的完整代码
import pypdf import re reader = pypdf.PdfReader(r'C:\Users\kenco\OneDrive\Desktop\AI Stuff\llms\exam_emulation\papers\example_pdf.pdf') questions = [] for page in reader.pages: text = page.extract_text() # 移除非ASCII可打印字符 text = re.sub(r'[^\x20-\x7E]', '', text) # 合并PDF中因排版问题被空格分隔的单个字母(比如Q u e s t i o n → Question) text = re.sub(r'(\b\w)\s+(?=\w\b)', r'\1', text) lines = text.splitlines() current_question = [] in_question = False for line in lines: # 检测题目起始标记(已处理为正常的Question) if 'Question' in line: # 先保存上一个已经收集好的题目 if in_question and current_question: questions.append('\n'.join(current_question)) current_question = [] # 开始收集新的题目 current_question.append(line) in_question = True elif in_question: # 持续收集当前题目的内容 current_question.append(line) # 保存页面最后一个没来得及存入列表的题目 if in_question and current_question: questions.append('\n'.join(current_question)) # 写入文件并严格保留换行格式 with open('extracted_text.txt', 'w', encoding='utf-8') as file: for idx, question in enumerate(questions, 1): file.write(f"题目 {idx}:\n") file.write(question) file.write('\n\n') # 题目之间用空行分隔,可读性更好
关键修改说明
- 重构题目收集逻辑:现在会先检测题目起始标记
Question,遇到时先保存上一个题目(如果存在),再开始新题目的收集,确保每个题目内容独立、结构清晰。 - 修复字母分隔问题:新增的正则替换可以把PDF中因字体/排版问题拆分的单个字母合并成正常单词,比如
d u t y会变成duty,解决你输出里无意义空格的问题。 - 严格保留换行结构:用
'\n'.join(current_question)拼接题目内容,完全保留原PDF中的换行;写入文件时指定utf-8编码,避免乱码问题。 - 优化代码效率:复用拆分后的行列表,避免重复执行相同的拆分操作。
备注:内容来源于stack exchange,提问作者GB Gaming
相关产品推荐
相关产品推荐

