利用python提取扫描版PDF文件内容
在审计项目或者是日常工作中,我们经常会遇到一些难以处理的数据或者文件,比如扫描版的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文件即为最终结果文件。