Python自动化:提取扫描件中的文字

news/2024/11/7 14:38:27/

前言

扫描件一直受大众青睐,任何纸质资料在扫描之后进行存档,想使用时手机就能打开,省心省力。但是扫描件的优点也恰恰造成了它的一个缺点,因为是通过电子设备扫描,所以出来的是图像,如果想要处理文件上的内容,直接操作是无法实现的。那要是想要引用其中的内容怎么办呢?别担心,Python帮你解决问题。

目录

前言

需求描述

分析

代码

tess_ocr(pdf_path, lang,first_page,last_page)

writercsv(intxt,outcsv)

compare_file(file1,file2,file3)

总结


需求描述

现有一份pdf扫描件,我们想把其中的文字提取出来并且分三列写入csv文档,内容及效果如下:

f1381ef5673b86d8fa85e8af9d1301bb.png

aabc003dfdd42a46559107949c40c277.png

分析

pdf扫描件是文档扫描成电脑图片格式后转化成pdf,提取其中的文字就相当于识别图片内的文字。所以,我们的工作就是将pdf转成图片,再用ocr工具提取图片中的文字。

代码

首先导入需要用到的第三方库

import os//处理文件
​
from pdf2image import convert_from_path  //pdf转图片
​
import pytesseract//识别图片文字
​
import csv  //处理csv文件

tess_ocr(pdf_path, lang,first_page,last_page)

将pdf文件拆分成图片,并提取文字写入文本文件

pdf_path: pdf文件的存储路径

image: 代表PDF文档每页的PIL图像列表

first_page :允许设置由pdftoppm处理的第一个页面;

last_page:允许设置最后一页由pdftoppm处理

fmt:允许指定输出格式。目前支持的格式是jpg、png和ppm;

output_folder:图片保存路径

def tess_ocr(pdf_path, lang,first_page,last_page):
​# 创建一个和pdf同名的文件夹images = convert_from_path(pdf_path, fmt='png',first_page=first_page,last_page=last_page,output_folder=imagefolder,userpw='site')  # 转成图片
​text = ''
​for img in images:   text += pytesseract.image_to_string(img, lang=lang) # 识别图片文字  with open(r'C:\Users\31678\Desktop\example\data.txt' 'a', encoding='utf-8') as f: #写入txt文件f.write(text)   
        

运行结果

生成一个同名的文件夹存放拆分的图片,接着提取图片文字写入data.txt

4d4532a11177469d584bf7ec08753e70.png

21f21a897b112492e6332287630041da.png

运行问题

问题抛出:pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

解决措施:下载 poppler。

方法一:设置环境变量 poppler/bin;

方法二:参数指定绝对路径:images = convert_from_path(pdf_path=pdf_file_path, poppler_path=r'poppler中bin文件所在地址')

问题抛出:pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for

more information.

解决措施:额外下载安装tesseract-ocr并配置环境变量。

 

modification(infile, outfile):清洗生成的文本文档

infile:需要进行处理的文件地址

outfile:处理后生成的新文件的地址

def modification(infile, outfile):
​infp = open(infile, "r",encoding='utf-8')
​outfp = open(outfile, "w",encoding='utf-8')
​lines = infp.readlines() #返回列表,包含所有的行。
​#依次读取每行
​for li in lines:  
​if li.split():             #str.split(str="", num=string.count(str)),过滤文件中的空行  li=li.replace('[',' ')      #根据识别情况对数据进行清洗 outfp.writelines(li)    
​infp.close()
​outfp.close()      
         

运行结果

生成一个新的txt文件,新文件删除了data.txt中的空行,将原文件中错误识别的内容替换成正确的。

34121753aaca4bf6c2434d6ffbab75a9.png

2987d47b56229c1982c583a9c8f8a492.png

writercsv(intxt,outcsv)

将文本文件按空格分列写入csv表格

intxt:文本文件地址

outcsv:新生成的csv文件

def writercsv(intxt,outcsv):
​csvFile = open(outcsv,'a',newline='',encoding='utf-8') # 使用newlines=''可保证存储的数据不空行。
​writer = csv.writer(csvFile)
​csvRow = []
​f = open(intxt,'r',encoding='utf-8')
​for line in f:
​csvRow = line.split() #以空格为分隔符if len(csvRow)>1 and len(csvRow)<=3:  #约束条件,视情况而定writer.writerow(csvRow)
​f.close()
​csvFile.close()

运行结果:生成一个三列csv文件,第一列是英文名,第二列是中文名,第三列是所在国家

83f837f433b78f824a460314c27e9204.png

fb164dc694a0e0c324164608fbc74d48.png

compare_file(file1,file2,file3)

提取出的csv与原csv进行对比,将内容错误的行写入file3,同时附赠错误提示

file1:提取出的csv

file2:原csv

file3:有误内容

def compare_file(file1,file2,file3):
​#定义空列表来存放两个文件的对应行engname1,engname2,country1,country2,chiname1,chiname2
​#字符串存放对比会出现的错误情况engnameerror,countryerror,chinameeeror
​#open打开提取的文件 别名f1,f2
​#readlines()读取文件中的每一行 存放在fileone,filetwo
​#将fileone中的每一列分离出来,添加进列表中
​for row in fileone:
​engname1.append(row.split(',')[0])   try:country1.append(row.split(',')[1])chiname1.append(row.split(',')[2])except IndexError :    #可能会出现索引越界country1.append(' ') chiname1.append(' ')
​#同理将filetwo中的每一列分离出来,添加进列表中#打开file3#循环第一列的单元格for cell in engname1:  #比较文件中的第一列,若fileone中的第一列中的元素不在filetwo的第一列的对应行中,将这一行写进file3中if cell not in engname2:      csvrow=fileone[engname1.index(cell)]+engnameerrorwriter.writerow(csvrow.split(','))
​#若第一列在,则比较第二列,若fileone中的第二列中的元素不在filetwo的第二列对应行中,将这一行写进file3中
​#若第一列,第二列都对应,则比较第三列,若fileone中的第三列中的元素不在filetwo的第三列对应行中,将这一行写进file3中
​#关闭文件

运行结果

有误的行写入different.csv,同时在行尾显示错误信息

f6ac6a57b7099afbe121e33f0bc30a5d.png

f28c4d802f317e661be349396f431811.png

运行问题

问题抛出:UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position

解决措施:先将文件另存为csv,再用记事本打开,点击文件->另存为,在最下方修改编码方式

总结

通过本次学习实现了从扫描件中提取文字、把内容按要求写进不同格式的文档的需求,最后还完成了与原文件的对比。最初以为提取pdf的库也适用于扫描件,尝试了Pdfplumber库和PyPDF2库。实践发现Pdfplumber只能识别扫描件pdf中的水印,不适用于扫描件的pdf,而PyPDF2库运行报错:NotImplementedError: only algorithm code 1 and 2 are supported。原因是这个被加密的pdf可能是从高版本的acrobot中来的,所以对应的加密算法代号为‘4’,然而,现有的pypdf2模块并只支持加密算法代号为‘1’或者‘2’的pdf加密文件。

 

 


http://www.ppmy.cn/news/814145.html

相关文章

扫描文件存电子版方法

用office软件打开一个PDF格式的文件&#xff0c;文件——新建——从扫描仪获取 选择相应的扫描仪 可以调整相应个参数&#xff0c;扫描即可。 拆分合并PDF文件方法

纸质合同扫描存档和电子合同签字盖章的区别

扫描盖章应该是指实体文件进行扫描&#xff0c;盖章应该是指在纸质文件上盖章吧&#xff01; 你或许只是考虑了办公的便利性&#xff0c;但是我必须提醒你&#xff0c;如果你原本的工作内容是纸质文件上盖章&#xff0c;然后扫描成电子照片&#xff0c;进行存档&#xff01;这…

如何自己制作身份证扫描件?

1&#xff0c;手机下载全能扫描王&#xff08;其他的扫描软件亦可&#xff09;&#xff0c;扫描身份证正反面。 2&#xff0c;打开word&#xff0c;赋值图片粘贴到word里&#xff0c;调整身份证大小为85.6mm54.0mm即可&#xff0c;设置身份证图片的格式为&#xff0c;嵌于文字…

解决如何为扫描件图片PDF添加页眉页脚页码日期的问题

前言&#xff1a;在日常办公中&#xff0c;会面临这样的情况&#xff1a;需要将几份盖章的扫描件整合到一个文档中&#xff0c;并编制页眉/页脚/页码。普通的word文档&#xff0c;可以直接添加页眉页脚、页码&#xff0c;并通过“另存为...”pdf格式保证页码和内容不被更改&…

联想M7605DW怎么连接WiFi网络

联想M7605DW是一款拥有WiFi功能的打印机&#xff0c;可以通过WiFi连接无线网络&#xff0c;实现打印无线传输。 首先&#xff0c;需要确保你的WiFi网络已经正常连接&#xff0c;并且知道WiFI的网络名称和密码&#xff0c;同时确保你的电脑或手机设备与WiFi相连接。 启动联想M76…

Word批注模式,修改用户名

Word批注模式&#xff0c;修改用户名 坑 我后来采用的方案是&#xff0c;直接更换账号了。

如何利用Word 2016为文档添加批注

在日常工作中&#xff0c;某些文件需要领导审阅或者经过大家讨论后才能够执行&#xff0c;所以就需要在这些文件上进行一些批示、修改。办公软件提供了批注、修订、更改等审阅工具&#xff0c;大大提高了办公效率。在使用Word 2016编辑文档时也会遇到各种各样此类问题&#xff…