Python实现PDF扫描件生成DOCX或EXCEL功能
1。问题描述
应项目需求需要获取PDF扫描文件的内容,但寻遍整个网络能达到这种功能的产品,都要会员充值。苦于囊中羞涩也只好编写功能代码来实现了。
如PDF中表格图片图1效果生成图2
2。实现流程
整个步骤为:读取PDF文件生成图片ORC获取图片内容写入Excel
3。功能代码3。1pdf转为图片importfitzpdf转为图片fromaipimportAipOcr图片文字识别importtime程序运行时间间隔以避免出错importdocx将识别结果保存为docx文件fromdocx。oxml。nsimportqn设置docx文件的字体你的APPIDAKSKAPPIDxxxxxxAPIKEYxxxxxxxxSECRETKEYxxxxxxxxxxxxxxxxxxxxxxxclientAipOcr(APPID,APIKEY,SECRETKEY)将PDF转化为图片pdfPathpdf文件的路径imgPath图像要保存的路径zoomxx方向的缩放系数zoomyy方向的缩放系数rotationangle旋转角度zoomx和zoomy一般取相同值,值越大,图像分辨率越高返回目标pdf的名称和页数,便于下一步操作defpdfimage(pdfPath,imgPath,zoomx10,zoomy10,rotationangle0):获取pdf文件名称namepdfPath。split()〔1〕。split(。pdf)〔0〕打开PDF文件pdffitz。open(pdfPath)获取pdf页数numpdf。pageCount逐页读取PDFforpginrange(0,num):pagepdf〔pg〕设置缩放和旋转系数transfitz。Matrix(zoomx,zoomy)。preRotate(rotationangle)pmpage。getPixmap(matrixtrans,alphaFalse)开始写图像pm。writePNG(imgPathnamestr(pg)。png)pdf。close()returnname,num将图片读取为docx文件imgPath图像所在路径生成的docx也保存在图像所在路径中name为pdf名称(不含后缀)num为pdf页数name和num均可由上一个函数返回defReadDetaildocx(imgPath,name,num):建立一个空doc文档docdocx。Document()设置全局字体doc。styles〔Normal〕。font。nameu宋体doc。styles〔Normal〕。element。rPr。rFonts。set(qn(w:eastAsia),u宋体)读取图片forninrange(0,num):iopen(imgPathnamestr(n)。png,rb)time。sleep(0。1)imgi。read()messageclient。basicAccurate(img)contentmessage。get(wordsresult)将内容写入doc文档foriinrange(len(content)):doc。addparagraph(content〔i〕。get(words))保存doc文档doc。save(imgPathname。docx)defpdftodocx(pdfPath,imgPath,zoomx10,zoomy10,rotationangle0):print(正在将pdf文件转换为图片。。。)调用函数一将pdf转换为图片,并获得文件名和页数name,numpdfimage(pdfPath,imgPath,zoomx,zoomy,rotationangle)print(转换成功!)print(正在读取图片内容。。。)调用函数二逐页读取图片并逐行保存在docx文件中ReadDetaildocx(imgPath,name,num)print(名为{}。pdf的pdf文件共有{}页,已成功转换为docx文件!。format(name,num))pdf储存路径pdfpathJRT01972020金融数据安全数据安全分级指南。pdf图片和生成的docx文件的储存路径imgpathrG:imges调用函数pdftodocx(pdfpath,imgpath)3。2表格图片文字识别到excelimportpandasaspdimportnumpyasnpimportre图片识别fromaipimportAipOcr时间模块importtime网页获取importrequests操作系统接口模块importosimagepath获取文件夹中所有图片defgetimage():images〔〕存储文件夹内所有文件的路径(包括子目录内的文件)forroot,dirs,filesinos。walk(imagepath):path〔os。path。join(root,name)fornameinfiles〕images。extend(path)returnimagesdefImageExcel(APPID,APIKEY,SECRETKEY):调用百度AI接口clientAipOcr(APPID,APIKEY,SECRETKEY)循环遍历文件家中图片imagesgetimage()forimageinimages:以二进制方式打开图片imgopenopen(image,rb)读取图片imgreadimgopen。read()调用表格识别模块识别图片tableclient。tableRecognitionAsync(imgread)获取请求IDrequestidtable〔result〕〔0〕〔requestid〕获取表格处理结果resultclient。getTableRecognitionResult(requestid)处理状态是已完成,获取下载地址whileresult〔result〕〔retmsg〕!已完成:time。sleep(2)暂停2秒再刷新resultclient。getTableRecognitionResult(requestid)downloadurlresult〔result〕〔resultdata〕print(downloadurl)获取表格数据exceldatarequests。get(downloadurl)根据图片名字命名表格名称xlsxnameimage。split(。)〔0〕。xlsx新建excel文件xlsxopen(xlsxname,wb)将数据写入excel文件并保存xlsx。write(exceldata。content)ifnamemain:imagepathrG:imgsAPPIDxxxxxxxxAPIKEYxxxxxxxSECRETKEYxxxxxxxxxxxxxxxxxxxxxxImageExcel(APPID,APIKEY,SECRETKEY)4。案例说明
我这里是获取JRT01972020金融数据安全数据安全分级指南。pdf扫描文件,将内部表格数据写入到excel文件。