from PIL import Image import pytesseract import fitz import numpy as np import cv2 pdf_file_path = r"E:\PyCharm\test\rename\1.pdf" pdf_document = fitz.open(pdf_file_path) scale_factor = 2 ocr_language = 'chi_sim' for page_number in range(pdf_document.page_count): page = pdf_document.load_page(page_number) # 将页面转换为图像 pix = page.get_pixmap(dpi=300) # 将图像数据转换为 PIL Image 对象 img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) # 将 PIL Image 转换为 OpenCV 格式的灰度图像 img_cv = np.array(img) img_cv = cv2.cvtColor(img_cv, cv2.COLOR_RGB2BGR) # 转换颜色空间 img_gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY) # 使用 pytesseract 进行 OCR 识别 text = pytesseract.image_to_string(img_gray, lang=ocr_language, config='--psm 4') # 保存识别结果到文本文件 text_file_name = f"page_{page_number + 1}.txt" with open(text_file_name, "w", encoding="utf-8") as text_file: text_file.write(text) pdf_document.close()在运行
时间: 2025-07-09 13:49:21 浏览: 3
<think>好的,我现在要解决用户的问题:如何使用PIL、pytesseract、fitz和OpenCV库从PDF中通过OCR提取中文文本(chi_sim)并保存至文本文件。首先,我需要理清楚整个流程,并确保每个步骤都正确无误。
首先,用户提到了几个关键的库:PIL(或Pillow)、pytesseract、fitz(PyMuPDF)和OpenCV。这些都是处理PDF和图像识别常用的库。我需要确认这些库的安装和配置是否正确,特别是Tesseract的中文语言包是否安装。
第一步,安装必要的库和环境。用户提供的引用中提到了安装Tesseract OCR和相关的Python库。例如,在Windows下需要下载Tesseract安装程序,并添加到系统路径。同时,中文语言包chi_sim需要下载并放到Tesseract的tessdata目录下。这一步非常重要,否则在运行时会出现找不到语言文件的错误,比如引用[1]中提到的环境变量问题。
接下来是处理PDF文件。用户需要将PDF的每一页转换为图像,因为OCR处理通常基于图像。这里使用PyMuPDF(fitz)来打开PDF文件,逐页渲染成图像。需要注意的是,渲染时的分辨率(DPI)设置,高DPI可以提高识别准确率,但也会增加处理时间和内存使用。引用[2]中提到提取PDF页面为图像,这一步是关键。
然后,处理图像。可能需要对图像进行预处理,比如使用OpenCV进行灰度化、二值化、降噪等操作,以提高OCR的准确性。例如,将图像转为灰度图可以减少计算量,二值化可以增强文字对比度。引用[3]中的图像处理库OpenCV或Pillow在这里派上用场。
接下来是调用pytesseract进行OCR识别。这里需要指定语言为中文(chi_sim),并且确保TESSDATA_PREFIX环境变量正确指向tessdata目录。用户可能遇到的环境问题,如引用[1]中的错误,需要在这里特别注意。代码中需要正确配置pytesseract的路径,特别是在Windows系统中,可能需要指定Tesseract的执行文件路径。
最后,将识别出的文本保存到文件中。需要注意的是文本的编码,确保中文字符正确保存。同时,处理过程中可能需要处理异常,比如某些页面无法渲染或识别,这时候需要捕获异常并记录日志,避免程序崩溃。
现在,整合这些步骤到Python代码中。首先导入必要的库,检查依赖是否安装。然后定义处理PDF的函数,逐页转换为图像,预处理图像,调用Tesseract识别,最后保存文本。测试代码时,需要用一个包含中文的扫描版PDF进行验证,查看输出是否正确,是否有乱码或识别错误的情况。
可能遇到的问题包括:Tesseract未正确安装,语言包缺失,图像渲染质量差导致识别率低,或者内存不足处理大文件时崩溃。针对这些问题,需要在代码中添加错误处理,提示用户检查环境配置,或者优化图像处理步骤,比如分块处理大图像。
此外,用户可能需要批量处理PDF文件,可以考虑添加遍历文件夹的功能,如引用[1]中提到的OS库遍历PDF文件。但根据当前问题,用户可能只需要处理单个文件,所以代码示例中可以专注于单个文件的处理流程。
总结下来,整个流程分为安装配置环境、PDF转图像、图像预处理、OCR识别、保存结果。每一步都需要仔细处理,特别是环境配置和图像处理部分,直接影响OCR的效果。现在将这些思考整理成步骤清晰的代码和解释,帮助用户解决问题。</think>以下是使用Python从PDF中通过OCR提取中文文本的完整解决方案:
### 一、环境准备
1. 安装依赖库(需提前安装Python 3.7+):
```bash
pip install pytesseract pillow opencv-python fitz PyMuPDF
```
2. 安装Tesseract OCR引擎:
- Windows:下载安装包后需勾选中文语言包[^1]
- macOS:`brew install tesseract-lang`
- Linux:`sudo apt-get install tesseract-ocr-chi-sim`
### 二、核心代码实现
```python
import fitz
import pytesseract
import cv2
import os
from PIL import Image
def pdf_to_text(pdf_path, output_txt="output.txt"):
# 配置Tesseract路径(Windows需要设置)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
doc = fitz.open(pdf_path)
text = ""
for page_num in range(len(doc)):
page = doc.load_page(page_num)
pix = page.get_pixmap(dpi=300) # 设置高分辨率DPI[^2]
# 转换为OpenCV图像格式
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
# 图像预处理
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# OCR识别中文
config = '--oem 3 --psm 6 -l chi_sim' # 使用中文语言包[^3]
page_text = pytesseract.image_to_string(thresh, config=config)
text += f"\n第{page_num+1}页内容:\n{page_text}\n"
with open(output_txt, "w", encoding="utf-8") as f:
f.write(text)
return text
# 使用示例
pdf_to_text("input.pdf", "output.txt")
```
### 三、关键步骤说明
1. **PDF转图像**:
- 使用`fitz`(PyMuPDF)将PDF页面转为300DPI的高清位图
- 分辨率建议设置为300-600 DPI[^2]
2. **图像预处理**:
- 灰度化处理:`cv2.cvtColor()`
- 二值化处理:使用OTSU算法自动计算阈值
- 可选增强操作:降噪、锐化、对比度调整
3. **OCR识别**:
- 指定中文语言包:`-l chi_sim`
- OEM选择LSTM引擎:`--oem 3`
- 页面分割模式:`--psm 6`(假设单列文本)
### 四、常见问题解决
1. **中文识别乱码**:
- 确认已安装`chi_sim.traineddata`语言文件
- 检查文件路径是否包含中文或特殊字符
2. **识别率低**:
```python
# 可添加以下预处理
blur = cv2.GaussianBlur(gray, (3,3), 0)
denoised = cv2.fastNlMeansDenoising(blur, h=10) # 降噪处理[^4]
```
3. **处理大文件内存不足**:
- 分页处理,及时释放内存
- 添加`gc.collect()`手动回收内存
阅读全文