python如何提取pdf图中的文字

python如何提取pdf图中的文字

Python提取PDF图中的文字可以通过OCR(光学字符识别)技术实现,常用的方法包括使用Tesseract OCR、Pytesseract库、PDFPlumber库、以及结合OpenCV进行图像预处理。 在这篇文章中,我们将详细介绍这些方法,并探讨如何优化图像预处理以提高OCR的准确性。

一、Tesseract OCR与Pytesseract库

1.1 Tesseract OCR简介

Tesseract OCR是一个开源的光学字符识别引擎,由Google维护。它支持多种语言,并且能够处理复杂的文档布局。Tesseract OCR需要安装在系统上,并通过Python的Pytesseract库进行调用。

1.2 安装Tesseract与Pytesseract

首先,我们需要安装Tesseract OCR引擎和Pytesseract库。在Windows系统中,可以通过以下步骤安装:

  1. 下载并安装Tesseract OCR:Tesseract OCR下载链接
  2. 安装Pytesseract库:
    pip install pytesseract

1.3 使用Pytesseract提取文字

以下是一个简单的示例代码,演示如何使用Pytesseract从PDF图像中提取文字:

import pytesseract

from PIL import Image

import pdf2image

将PDF转换为图像

pages = pdf2image.convert_from_path('sample.pdf', 300)

设置Tesseract可执行文件路径

pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'

提取每一页中的文字

for page_number, page_data in enumerate(pages):

text = pytesseract.image_to_string(page_data, lang='eng')

print(f"Page {page_number + 1}:n{text}")

二、PDFPlumber库

2.1 PDFPlumber简介

PDFPlumber是一个用于操作和提取PDF内容的Python库,它能够精确地提取PDF中的表格、文字和图像等元素。结合Pytesseract,可以实现从PDF图像中提取文字的功能。

2.2 安装PDFPlumber

使用pip命令安装PDFPlumber:

pip install pdfplumber

2.3 使用PDFPlumber提取图像并进行OCR

以下是使用PDFPlumber和Pytesseract提取PDF图像文字的示例代码:

import pdfplumber

import pytesseract

from PIL import Image

设置Tesseract可执行文件路径

pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'

打开PDF文件

with pdfplumber.open('sample.pdf') as pdf:

for page in pdf.pages:

# 获取页面的所有图像

for img in page.images:

# 提取图像数据

img_data = page.within_bbox((img['x0'], img['top'], img['x1'], img['bottom'])).to_image()

# 将图像保存为临时文件

img_path = 'temp_img.png'

img_data.save(img_path)

# 使用Pytesseract提取文字

text = pytesseract.image_to_string(Image.open(img_path), lang='eng')

print(text)

三、图像预处理

3.1 为什么需要图像预处理

图像预处理可以提高OCR的准确性,常见的预处理技术包括灰度化、二值化、去噪和旋转校正。这些技术有助于减少图像中的噪声和干扰,使OCR引擎能够更准确地识别文字。

3.2 使用OpenCV进行图像预处理

以下是使用OpenCV进行图像预处理的示例代码:

import cv2

import pytesseract

from PIL import Image

读取图像

img = cv2.imread('temp_img.png')

灰度化

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

二值化

_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)

去噪

denoised = cv2.fastNlMeansDenoising(binary, None, 30, 7, 21)

保存预处理后的图像

cv2.imwrite('processed_img.png', denoised)

使用Pytesseract提取文字

text = pytesseract.image_to_string(Image.open('processed_img.png'), lang='eng')

print(text)

四、综合示例:从PDF中提取图像文字

4.1 综合代码示例

以下是一个综合的代码示例,演示如何结合PDFPlumber、Pytesseract和OpenCV从PDF中提取图像文字:

import pdfplumber

import pytesseract

from PIL import Image

import cv2

设置Tesseract可执行文件路径

pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'

打开PDF文件

with pdfplumber.open('sample.pdf') as pdf:

for page in pdf.pages:

# 获取页面的所有图像

for img in page.images:

# 提取图像数据

img_data = page.within_bbox((img['x0'], img['top'], img['x1'], img['bottom'])).to_image()

# 将图像保存为临时文件

img_path = 'temp_img.png'

img_data.save(img_path)

# 读取图像

img = cv2.imread(img_path)

# 灰度化

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 二值化

_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)

# 去噪

denoised = cv2.fastNlMeansDenoising(binary, None, 30, 7, 21)

# 保存预处理后的图像

processed_img_path = 'processed_img.png'

cv2.imwrite(processed_img_path, denoised)

# 使用Pytesseract提取文字

text = pytesseract.image_to_string(Image.open(processed_img_path), lang='eng')

print(f"Extracted text from page {page.page_number}:n{text}")

4.2 解释代码

  1. 加载PDF文件:使用PDFPlumber打开PDF文件,并遍历每一页。
  2. 提取图像:从每一页中提取所有图像,并保存为临时文件。
  3. 图像预处理:使用OpenCV对图像进行灰度化、二值化和去噪处理,以提高OCR的准确性。
  4. 文字提取:使用Pytesseract从预处理后的图像中提取文字。

五、优化OCR的准确性

5.1 选择合适的语言包

Tesseract OCR支持多种语言,可以通过安装和使用特定语言包来提高识别准确性。例如,如果处理的PDF主要包含中文文字,可以使用中文语言包:

pip install pytesseract

然后在代码中指定语言:

text = pytesseract.image_to_string(Image.open(processed_img_path), lang='chi_sim')

5.2 调整Tesseract配置参数

Tesseract提供了多种配置参数,可以通过调整这些参数来优化OCR的准确性。例如,可以增加字符间的间距,或调整页面分块算法:

config = '--psm 6'

text = pytesseract.image_to_string(Image.open(processed_img_path), config=config)

5.3 使用高级图像预处理技术

除了基本的灰度化和二值化,还可以使用更多高级的图像预处理技术,例如自适应阈值、边缘检测和形态学变换,以进一步提高OCR的准确性:

# 自适应阈值

adaptive_threshold = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

边缘检测

edges = cv2.Canny(adaptive_threshold, 100, 200)

形态学变换

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

morph = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)

cv2.imwrite('enhanced_img.png', morph)

text = pytesseract.image_to_string(Image.open('enhanced_img.png'), lang='eng')

print(text)

六、总结

在这篇文章中,我们深入探讨了如何使用Python提取PDF图像中的文字。我们介绍了Tesseract OCR与Pytesseract库、PDFPlumber库,并展示了如何使用OpenCV进行图像预处理以提高OCR的准确性。综合示例代码展示了从PDF中提取图像文字的完整流程,并提供了优化OCR准确性的方法。

通过这些技术和方法,开发者可以有效地从PDF图像中提取文字,为文档处理和数据分析提供强有力的支持。如果在项目管理中需要处理大量PDF文档,可以考虑使用研发项目管理系统PingCode通用项目管理软件Worktile,以提高项目管理效率和协作能力。

相关问答FAQs:

1. 如何使用Python提取PDF图中的文字?

使用Python提取PDF图中的文字可以通过使用一些开源库来实现,例如PyPDF2、pdfminer等。这些库提供了一些函数和方法,可以帮助我们解析PDF文件并提取其中的文字内容。

2. 有没有简单的示例代码来演示如何使用Python提取PDF图中的文字?

当然有!以下是一个简单的示例代码,演示了如何使用PyPDF2库来提取PDF图中的文字:

import PyPDF2

def extract_text_from_pdf(pdf_file_path):
    pdf_file = open(pdf_file_path, 'rb')
    pdf_reader = PyPDF2.PdfReader(pdf_file)
    
    text_content = ""
    for page_num in range(len(pdf_reader.pages)):
        page = pdf_reader.pages[page_num]
        text_content += page.extract_text()
    
    pdf_file.close()
    return text_content

# 调用示例函数并指定PDF文件路径
pdf_text = extract_text_from_pdf("example.pdf")
print(pdf_text)

这段代码会打开指定的PDF文件,然后逐页提取文字内容,并将提取的文字内容存储在一个字符串变量中。

3. 提取PDF图中的文字是否会受到文字格式的影响?

是的,提取PDF图中的文字可能会受到文字格式的影响。PDF文件中的文字可以包含不同的字体、大小、颜色等样式,这些样式可能会影响到提取的结果。有些库可以尝试保留文字的样式信息,但在某些情况下,提取的文字可能会失去一些格式信息。因此,在使用Python提取PDF图中的文字时,需要根据具体情况进行进一步处理和调整。

文章包含AI辅助创作,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/1132661

(0)
Edit2Edit2
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部