不背单词自定义词书制作与导入

发布时间 2023-08-14 12:08:26作者: wenli7363

0 前言

最近不得不开始准备GRE了,从张巍公众号白嫖了好多单词书,但是我从高中开始就不习惯使用纸质材料背单词了,都是使用不背单词这个app了。没错,我的高中是允许带手机的哈哈哈

不背单词的自定义词书功能还不完善。所以我花了一上午研究怎么把PDF导入进去

思路:通过将pdf文件转成一个个图片,然后使用tesseract工具进行OCR识别,然后提取单词存进txt文件

下面是教程

1 准备

1.1 环境要求

  1. python3环境,我个人是用python3.10.1
  2. pip安装工具,保证是最新的
  3. Tesseract的下载 参考这篇文章中的 (Google Tesseract安装) 这一节内容

我的是Windows系统,我觉得大部分人都是。那么直接拉到最下面,安装最下面的程序就好了(这个是最新的)
2

  1. 相关包的下载
    • PIL
    • pytesseract
    • tqdm
    • fitz (来自PyMuPDF)
    • Pillow
// 可以通过下面命令进行下载
pip install PyMuPDF Pillow pytesseract tqdm

1.2 文件夹内设置

1

我的代码全放在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文件中。

  1. pytesseract.pytesseract.tesseract_cmd = r'D:\Application\Tesseract-OCR\tesseract.exe'修改成你自己安装的tesseract.exe路径
  2. 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 运行

  1. PDF转成图像:运行pdf2pic.py,等待进度条完成

3

  1. 打开image_output文件夹,检查是否导入成功,同时删去不需要的图片,比如封面

4

  1. 确保word.py中的x1,y1,x2,y2已经修改正确了,执行这个程序。

  2. word.py执行完成,所有的单词都提取到extract_words.txt中了