|
|
您好!理解您的问题:从分栏PDF中提取词汇时,文本顺序混乱,是因为工具默认按阅读顺序提取,但分栏内容可能从左栏跳到右栏,导致提取结果不连贯。下面我将提供一个使用Python和pdfplumber的解决方案,通过定义分栏区域来分别提取文本,然后整理成表格格式。
### 步骤概述:
1. 使用pdfplumber打开PDF,并分析页面布局(例如,通过页面宽度定义左栏和右栏)。
2. 分别提取左栏和右栏的文本。
3. 使用正则表达式识别分类标题(如"Vocabulary in Each Unit")和对应的词汇。
4. 将数据保存为CSV表格。
### 代码示例:
以下代码是一个基本示例,您可能需要根据实际PDF调整分栏边界和正则表达式。
- import pdfplumber
- import re
- import csv
- # 替换为您的PDF文件路径
- pdf_path = "english_book.pdf"
- output_csv = "vocabulary.csv"
- # 打开PDF文件
- with pdfplumber.open(pdf_path) as pdf:
- all_text = ""
- for page in pdf.pages:
- # 获取页面尺寸
- width = page.width
- height = page.height
-
- # 定义左栏和右栏的边界(这里假设分栏在页面中间,您可能需要调整)
- left_bbox = (0, 0, width/2, height) # 左栏区域:从左上角到中间
- right_bbox = (width/2, 0, width, height) # 右栏区域:从中间到右下角
-
- # 提取左栏文本
- left_text = page.within_bbox(left_bbox).extract_text()
- # 提取右栏文本
- right_text = page.within_bbox(right_bbox).extract_text()
-
- # 合并文本(先左栏后右栏)
- page_text = left_text + "\n" + right_text
- all_text += page_text + "\n"
- # 使用正则表达式匹配分类和词汇
- # 假设分类标题如 "Vocabulary in Each Unit",后跟词汇列表(直到下一个标题或结尾)
- pattern = r'(Vocabulary in Each Unit|Vocabulary from Primary School|Starter Unit|Unit \d+)(.*?)(?=Vocabulary in Each Unit|Vocabulary from Primary School|Starter Unit|Unit \d+|$)'
- matches = re.findall(pattern, all_text, re.DOTALL)
- # 准备表格数据
- data = []
- for match in matches:
- category = match[0].strip()
- vocabulary_text = match[1].strip()
- # 分割词汇文本为行(假设每行一个词汇)
- words = vocabulary_text.split('\n')
- for word in words:
- word = word.strip()
- if word: # 忽略空行
- data.append([category, word])
- # 保存为CSV文件
- with open(output_csv, 'w', newline='', encoding='utf-8') as csvfile:
- writer = csv.writer(csvfile)
- writer.writerow(['Category', 'Vocabulary']) # 表头
- writer.writerows(data)
- print("提取完成!数据已保存到", output_csv)
复制代码
### 注意事项:
- 分栏边界调整:如果PDF的分栏不是均匀的,您可能需要手动检查页面宽度,并调整 left_bbox 和 right_bbox 的坐标。例如,使用 page.width/2 可能不准确,可以尝试用具体像素值。
- 正则表达式优化:如果分类标题或词汇格式不同(例如有编号、项目符号),您需要修改 pattern 来匹配实际内容。
- 测试建议:先在小范围页面测试代码,确保提取正确。
- 其他工具:如果pdfplumber不适用,可以尝试PyMuPDF的类似功能,但pdfplumber通常更易于处理文本位置。
这个方案应该能帮助您整理出表格格式。如果仍有问题,请提供更多PDF细节(如截图或示例文本),我可以进一步优化代码!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|