0 前言
最近不得不开始准备GRE了,从张巍公众号白嫖了好多单词书,但是我从高中开始就不习惯使用纸质材料背单词了,都是使用不背单词这个app了。没错,我的高中是允许带手机的哈哈哈
不背单词的自定义词书功能还不完善。所以我花了一上午研究怎么把PDF导入进去
思路:通过将pdf文件转成一个个图片,然后使用
tesseract
工具进行OCR识别,然后提取单词存进txt文件
下面是教程
1 准备
1.1 环境要求
- python3环境,我个人是用python3.10.1
- pip安装工具,保证是最新的
- Tesseract的下载 参考这篇文章中的 (Google Tesseract安装) 这一节内容
我的是Windows系统,我觉得大部分人都是。那么直接拉到最下面,安装最下面的程序就好了(这个是最新的)
- 相关包的下载
- PIL
- pytesseract
- tqdm
- fitz (来自PyMuPDF)
- Pillow
// 可以通过下面命令进行下载
pip install PyMuPDF Pillow pytesseract tqdm
1.2 文件夹内设置
我的代码全放在D:\Codeprojects\word
这个目录下,你需要创建两个python
文件,一个空文件夹image_output
用来存pdf转成的图片,还有一个你的词书pdf。
1.3 代码
将下面代码直接复制到对应的python文件中
1 pdf2pic.py
该程序实现将pdf文件转成图片,然后存进image_output
中
注意修改一下
pdf_file
,改成你自己的词书名(建议用英文名,不要有中文字符),其他的不需要修改
import fitz # PyMuPDF
from tqdm import tqdm # 可视化进度条
pdf_file = "gre_words.pdf" # 这个改成你自己的词书名
image_folder = "image_output/"
# 打开PDF文件
pdf_document = fitz.open(pdf_file)
# 配置图像分辨率
image_resolution = 300 # 设置为你想要的分辨率,以每英寸像素数为单位
# 使用 tqdm 创建进度条
progress_bar = tqdm(total=pdf_document.page_count, desc="Converting pages", unit="page")
# 遍历每一页并保存为图像
for page_num in range(pdf_document.page_count):
page = pdf_document[page_num]
zoom = image_resolution / 72.0 # 计算缩放比例,以使分辨率一致
mat = fitz.Matrix(zoom, zoom)
pixmap = page.get_pixmap(matrix=mat)
image_path = f"{image_folder}page_{page_num + 1}.png"
pixmap.save(image_path, "png")
# 更新进度条
progress_bar.update(1)
# 关闭PDF文件
pdf_document.close()
# 关闭进度条
progress_bar.close()
2 word.py
这个程序用来识别图像中的单词,存进txt文件中。
pytesseract.pytesseract.tesseract_cmd = r'D:\Application\Tesseract-OCR\tesseract.exe'
修改成你自己安装的tesseract.exe
路径x1,y1,x2,y2
的区域设置:见这篇文章使用crop时如何定位
import os
from PIL import Image
import pytesseract
image_folder = "image_output/"
output_txt = "extracted_words.txt"
# 下载好tesseract.exe,下面是你的安装路径
pytesseract.pytesseract.tesseract_cmd = r'D:\Application\Tesseract-OCR\tesseract.exe'
# Open the output text file for writing
with open(output_txt, 'w', encoding='utf-8') as output_file:
for image_filename in os.listdir(image_folder):
image_path = os.path.join(image_folder, image_filename)
image = Image.open(image_path)
# 修改成你想要裁剪的区域
x1 = 100
y1 = 310
x2 = 410
y2 = 3300
crop_box = (x1, y1, x2, y2)
cropped_image = image.crop(crop_box)
# 下面注释是显示裁剪出来的图像,你可以看看你上面的标注对不对
# cropped_image.show()
extracted_text = pytesseract.image_to_string(cropped_image, lang='eng') # 识别,lang = 'eng'表示识别为英文
extracted_words = extracted_text.split() # 文本分割
# 写入txt文件,单词之间换行
for word in extracted_words:
output_file.write(word + '\n')
2 运行
- PDF转成图像:运行
pdf2pic.py
,等待进度条完成
- 打开
image_output
文件夹,检查是否导入成功,同时删去不需要的图片,比如封面
-
确保
word.py
中的x1,y1,x2,y2
已经修改正确了,执行这个程序。 -
等
word.py
执行完成,所有的单词都提取到extract_words.txt
中了