鱼C论坛

 找回密码
 立即注册
查看: 30|回复: 2

求助,怎么把英语课本中的分栏按单元词汇导出来?

[复制链接]
发表于 8 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 blackantt 于 2025-11-25 15:30 编辑

想把pdf里的词汇按照 Vocabulary in Each Unit/Vocabulary from Primary School, Starter Unit/Unit  的分类整理出来, 形成表格。用了 PyMuPDF, pdfplumber 等,遇到例外,总是从左边跳到了右边,最后都是乱的。

71.zip (548.46 KB, 下载次数: 0)   , 这个是pdf文件


下面是pdf的几个关键内容页

Screenshot (1923).png

Screenshot (1924).png

Screenshot (1925).png


想最终形成以下这种格式

Screenshot (1926).png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
您好!理解您的问题:从分栏PDF中提取词汇时,文本顺序混乱,是因为工具默认按阅读顺序提取,但分栏内容可能从左栏跳到右栏,导致提取结果不连贯。下面我将提供一个使用Python和pdfplumber的解决方案,通过定义分栏区域来分别提取文本,然后整理成表格格式。

### 步骤概述:
1. 使用pdfplumber打开PDF,并分析页面布局(例如,通过页面宽度定义左栏和右栏)。
2. 分别提取左栏和右栏的文本。
3. 使用正则表达式识别分类标题(如"Vocabulary in Each Unit")和对应的词汇。
4. 将数据保存为CSV表格。

### 代码示例:
以下代码是一个基本示例,您可能需要根据实际PDF调整分栏边界和正则表达式。


  1. import pdfplumber
  2. import re
  3. import csv

  4. # 替换为您的PDF文件路径
  5. pdf_path = "english_book.pdf"
  6. output_csv = "vocabulary.csv"

  7. # 打开PDF文件
  8. with pdfplumber.open(pdf_path) as pdf:
  9.     all_text = ""
  10.     for page in pdf.pages:
  11.         # 获取页面尺寸
  12.         width = page.width
  13.         height = page.height
  14.         
  15.         # 定义左栏和右栏的边界(这里假设分栏在页面中间,您可能需要调整)
  16.         left_bbox = (0, 0, width/2, height)  # 左栏区域:从左上角到中间
  17.         right_bbox = (width/2, 0, width, height)  # 右栏区域:从中间到右下角
  18.         
  19.         # 提取左栏文本
  20.         left_text = page.within_bbox(left_bbox).extract_text()
  21.         # 提取右栏文本
  22.         right_text = page.within_bbox(right_bbox).extract_text()
  23.         
  24.         # 合并文本(先左栏后右栏)
  25.         page_text = left_text + "\n" + right_text
  26.         all_text += page_text + "\n"

  27. # 使用正则表达式匹配分类和词汇
  28. # 假设分类标题如 "Vocabulary in Each Unit",后跟词汇列表(直到下一个标题或结尾)
  29. 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+|$)'
  30. matches = re.findall(pattern, all_text, re.DOTALL)

  31. # 准备表格数据
  32. data = []
  33. for match in matches:
  34.     category = match[0].strip()
  35.     vocabulary_text = match[1].strip()
  36.     # 分割词汇文本为行(假设每行一个词汇)
  37.     words = vocabulary_text.split('\n')
  38.     for word in words:
  39.         word = word.strip()
  40.         if word:  # 忽略空行
  41.             data.append([category, word])

  42. # 保存为CSV文件
  43. with open(output_csv, 'w', newline='', encoding='utf-8') as csvfile:
  44.     writer = csv.writer(csvfile)
  45.     writer.writerow(['Category', 'Vocabulary'])  # 表头
  46.     writer.writerows(data)

  47. print("提取完成!数据已保存到", output_csv)
复制代码


### 注意事项:
- 分栏边界调整:如果PDF的分栏不是均匀的,您可能需要手动检查页面宽度,并调整 left_bboxright_bbox 的坐标。例如,使用 page.width/2 可能不准确,可以尝试用具体像素值。
- 正则表达式优化:如果分类标题或词汇格式不同(例如有编号、项目符号),您需要修改 pattern 来匹配实际内容。
- 测试建议:先在小范围页面测试代码,确保提取正确。
- 其他工具:如果pdfplumber不适用,可以尝试PyMuPDF的类似功能,但pdfplumber通常更易于处理文本位置。

这个方案应该能帮助您整理出表格格式。如果仍有问题,请提供更多PDF细节(如截图或示例文本),我可以进一步优化代码!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
同问,这个有点难
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-25 23:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表