利用python提取扫描版PDF文件内容

发布日期:2023-12-14 17:16 作者:电子数据审计科 苏睆 来源:市审计局 【字体: 阅读:

在审计项目或者是日常工作中,我们经常会遇到一些难以处理的数据或者文件,比如扫描版的PDF文件。扫描出来的PDF文件类似于图片的类型,我们难以将其内容提取出来,涉及到敏感文件我们更不能随意使用网络OCR工具进行识别,因此利用程序设计在相对安全的环境下提取扫描版PDF文件内容将很有帮助。

一、利用python提取扫描版PDF文件内容主要使用的库为os、pytesseract、fitz、PIL,运行前需要下载安装完毕。

二、下载安装OCR识别工具插件tesseract.exe。

三、实现代码如下:

import os

import pytesseract

import fitz

from PIL import Image

class PDFOCR:

'''

初始化需要传入四个文件夹路径:

pdfDir:原始pdf文件夹路径,

pngDir:pdf每一页转png的路径,

txtDir:图片经过ocr路径,

finalTxtDir:最终合并后的完整txt文件存放路径

'''

def __init__(self, pdfDir, pngDir, txtDir, finalTxtDir):

self.pdfDir = pdfDir

self.pngDir = pngDir

self.txtDir = txtDir

self.finalTxtDir = finalTxtDir

# 将pdf文件每一页输出为png图片

def pdfToImg(self):

print('pdfToImg...')

PDF_path = self.pdfDir

save_path = self.pngDir

#先清空txtDir下文件

for file in os.listdir(pngDir):

os.remove(os.path.join(pngDir, file))

# 打开PDF文件,生成一个对象

for root, dirs, files in os.walk(PDF_path):

for file in files:

if not (file.endswith('pdf') or file.endswith('PDF')):

continue

doc = fitz.open(os.path.join(root,file))

# 将PDF文件的每一页都转化为图片

for pg in range(doc.page_count):

page = doc[pg]

rotate = int(0)

# 每个尺寸的缩放系数为2,这将为我们生成分辨率提高4倍的图像。

zoom_x = 2

zoom_y = 2

trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)

pm = page.get_pixmap(matrix=trans, alpha=False)

print(pg)

pm._writeIMG(save_path +'\\'+file.replace('.PDF','') +'##'+'%s.png' % pg,1,1000)

# 将每页图片经过ocr输出为txt

def pngExtract(self):

print('pngExtract...')

pngDir = self.pngDir

txtDir = self.txtDir

finaldir = self.finalTxtDir

text=''

#先清空txtDir下文件

for file in os.listdir(txtDir):

os.remove(os.path.join(txtDir, file))

#先清空txtDir下文件

for file in os.listdir(finaldir):

os.remove(os.path.join(finaldir, file))

for file in os.listdir(pngDir):

# 如果图片扫面过就无需再次扫描

# print(file)

if os.path.exists(os.path.join(txtDir, file+'.txt')):

os.remove(os.path.join(txtDir, file+'.txt'))

if file.endswith('.png') and not os.path.exists(os.path.join(txtDir, file+'.txt')):

print("tesseract " + os.path.join(pngDir, file) + ' ' + os.path.join(txtDir, file) + ' ' + '-l chi_sim')

# os.system("tesseract " + os.path.join(pngDir, file) + ' ' + os.path.join(txtDir, file) + ' ' + '-l chi_sim')

# 加载图像

image = Image.open(os.path.join(pngDir, file))

# 列出支持的语言

# print(pytesseract.get_languages(config=''))

tr = pytesseract.image_to_string(image, lang='chi_sim')

#创建单个识别文本文件

with open(os.path.join(txtDir, file+'.txt'),'x') as f:

f.write(tr)

text=text+tr

#创建final.txt

with open(os.path.join(finaldir, 'final.txt'),'x') as f:

f.write(text)

print(text)

if __name__ == '__main__':

pytesseract.pytesseract.tesseract_cmd = r'E:\Tesseract-OCR\tesseract.exe'

pdfDir = r'E:\pdf'

pngDir = r'E:\png'

txtDir = r'E:\txt'

finalTxtDir = r'E:\finaltxt'

ioo = PDFOCR(pdfDir, pngDir, txtDir, finalTxtDir)

ioo.pdfToImg()

ioo.pngExtract()

三、初始化需要设置pytesseract.pytesseract.tesseract_cmd为tesseract.exe安装路径,并且传入四个文件夹路径pdfDir(原始pdf文件夹路径),pngDir(pdf每一页转png的路径),txtDir(图片经过ocr路径),finalTxtDir(最终合并后的完整txt文件存放路径),最后在python运行环境下执行py文件,finalTxtDir路径下final.txt文件即为最终结果文件。

分享到: