Python提取PDF文本出现单词错误空格问题的解决咨询
解决PDF文本提取时单词错误插入空格的问题
问题根源
PyPDF2的文本提取逻辑较为基础,当PDF文件中的单词因排版需求被拆分成多行(比如行尾拆分单词),它会直接保留拆分后的空格,导致出现"seed ing"这类错误。
解决方案
方案1:换用更精准的PDF提取库(推荐)
使用pdfplumber,它能更好地识别文本的排版结构,大幅减少这类单词拆分错误,同时可精准提取指定章节内容。
示例代码:
import pdfplumber from docx import Document # 提取指定章节文本 def extract_chapter_content(pdf_path, start_keyword, end_keyword): full_text = "" with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: page_text = page.extract_text() full_text += page_text # 到达结束章节后停止提取 if end_keyword in page_text: break # 截取第1章到第2章的内容 start_idx = full_text.find(start_keyword) end_idx = full_text.find(end_keyword) if start_idx != -1 and end_idx != -1: return full_text[start_idx:end_idx] return "" # 主逻辑 if __name__ == "__main__": extracted_text = extract_chapter_content("example.pdf", "Chapter 1", "Chapter 2") # 保存为TXT with open("extracted_text.txt", "w", encoding="utf-8") as f: f.write(extracted_text) # 保存为DOCX doc = Document() doc.add_paragraph(extracted_text) doc.save("extracted_text.docx")
方案2:用正则修复已提取的错误空格
如果不想更换库,可以对PyPDF2提取的文本做后处理,用正则匹配并修复被拆分的单词(比如匹配"小写字母+空格+小写字母"的模式,去掉中间空格)。
示例代码:
import re import PyPDF2 from docx import Document # 修复单词中的错误空格 def fix_word_spaces(text): # 匹配小写字母+空格+小写字母的情况,去掉中间空格 pattern = re.compile(r'([a-z])\s+([a-z])') return pattern.sub(r'\1\2', text) # 提取文本 with open('example.pdf', 'rb') as pdf_file: pdf_reader = PyPDF2.PdfFileReader(pdf_file) text = "" for page in range(pdf_reader.getNumPages()): page_text = pdf_reader.getPage(page).extractText() text += page_text if "Chapter 2" in page_text: break # 截取章节内容并修复 start = text.find("Chapter 1") end = text.find("Chapter 2") if start != -1 and end != -1: text = text[start:end] fixed_text = fix_word_spaces(text) # 保存为TXT with open('extracted_text.txt', 'w', encoding='utf-8') as text_file: text_file.write(fixed_text) # 保存为DOCX doc = Document() doc.add_paragraph(fixed_text) doc.save("extracted_text.docx")
注意事项
- 方案1的依赖库需要提前安装:
pip install pdfplumber python-docx - 方案2的正则仅能处理简单的小写字母拆分场景,遇到带标点、大写字母的拆分情况,需要调整正则规则适配
- 如果目标PDF是扫描件(图片格式),需先用OCR工具(如pytesseract)识别文本后,再进行后续处理
内容的提问来源于stack exchange,提问作者Catao.ed
相关产品推荐
相关产品推荐

