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

提取PDF考试试题并写入文件时如何保留换行格式

提取PDF考试试题并写入文件时如何保留换行格式

看起来你在从PDF中提取考试题目时遇到了换行丢失的问题,同时还有提取文本里字母被无意义空格分隔的小麻烦。我来帮你分析下代码里的问题,再给出修正后的方案。

原代码的核心问题

  1. 题目收集逻辑顺序搞反了:你现在是先把每行内容加到question里,再判断是否遇到题目标记,这会把页面开头到第一个题目标记的无关内容都混进题目里,后续的题目内容也会拼接混乱,换行格式自然就乱了。
  2. 字符串初始化冗余:question = """"""""是多余的写法,直接用question = ""初始化空字符串就行,多出来的双引号不仅没用,还可能引发语法隐患。
  3. 重复的行拆分操作:你已经用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')  # 题目之间用空行分隔,可读性更好

关键修改说明

  1. 重构题目收集逻辑:现在会先检测题目起始标记Question,遇到时先保存上一个题目(如果存在),再开始新题目的收集,确保每个题目内容独立、结构清晰。
  2. 修复字母分隔问题:新增的正则替换可以把PDF中因字体/排版问题拆分的单个字母合并成正常单词,比如d u t y会变成duty,解决你输出里无意义空格的问题。
  3. 严格保留换行结构:用'\n'.join(current_question)拼接题目内容,完全保留原PDF中的换行;写入文件时指定utf-8编码,避免乱码问题。
  4. 优化代码效率:复用拆分后的行列表,避免重复执行相同的拆分操作。

备注:内容来源于stack exchange,提问作者GB Gaming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:43:06