笔者最近在备考关于100天后专升本考试,对于现在疫情影响,辅导班也开了对应的网课,笔者从辅导班回家的时候一本书都没有拿,后来老师在群里发了纸质书的pdf版本,让我们背单词,在学习单词的时候不会读音要一个一个去有道云等等相关软件翻译找到读音是一件比较麻烦和浪费时间的事情,便有了此文 我整个写完代码时间大概用了4个小时左右 共计150多行的python代码

思路为:PDF->PNG->txt->xml
将老师发来的pdf版本转换为图片,再用识图解析成txt文本,再用正则表达式提取单词到txt中,最后再解析成可被有道云识别的xml生词本格式。

1.pdf Convert to png
依赖库:pip install pymupdf

import sys, fitz
import os
import datetime
def pdf_convert_png(pdfPath, imagePath):startTime_pdf2img = datetime.datetime.now()#开始时间print("imagePath="+imagePath)pdfDoc = fitz.open(pdfPath)for pg in range(pdfDoc.pageCount):page = pdfDoc[pg]rotate = int(0)# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。# 此处若是不做设置,默认图片大小为:792X612, dpi=96zoom_x = 1.33333333 #(1.33333333-->1056x816)   (2-->1584x1224)zoom_y = 1.33333333mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)pix = page.getPixmap(matrix=mat, alpha=False)if not os.path.exists(imagePath):#判断存放图片的文件夹是否存在os.makedirs(imagePath) # 若图片文件夹不存在就创建pix.writePNG(imagePath+'/'+'images_%s.png' % pg)#将图片写入指定的文件夹内endTime_pdf2img = datetime.datetime.now()#结束时间print('pdf2img时间=',(endTime_pdf2img - startTime_pdf2img).seconds)

读取所在目录下所有类型是pdf的文件返回一个包含所有pdf路径的list

def reload_pdf_path(pdfPath):pdf_files = []; #存储将要转换pdf的名称for filename in os.listdir(pdfPath):if filename.endswith('pdf'):pdf_files.append(filename);return pdf_files;

转换结果:

我擦9-16pdf在末尾了,这可不行 倒时候要按组排序整进去呢 用了List.sort方法也不行 艹

用正则排序:

pdf_files = sorted(pdf_files,key = lambda i:int(re.match(r'(\d+)',i).group()))print(pdf_files);

效果:

呵呵 我真是个带天才

转换了一共12篇pdf

可还行一个没有漏

简单封装下代码留着一会用

2.图文识别【OCR识别】
简单看了下其他博主写的图文识别,觉得效果都不太好,像我这种图片那么复杂的估计会很难识别,这里去找了下大厂提供的API尝试

华为的:

有点贵呀...

百度大法好

试下百度的demo

这个效果..还是免费的..我爱了..

小试牛刀,识别效果还是很棒的

这里就还有一个难题就是

这里我没有使用正则,而是换了一种方式查找字符串中的[然后往前用切片就能得到单词,这种正确率不是很高 但是我懒得[我不会正则]整了

for i in png_json['words_result']:flag_index = i['words'].find('[');#过滤出单词#字符串查找[符号获得下标后使用字符串切片#过滤掉除了英文的东西if flag_index !=-1 and i['words'][:flag_index].isalpha():print(i['words'][:flag_index]);word_list.append(i['words'][:flag_index]);

这里就得到了单词,然后下一步就是将单词写入xml中

'''
将解析出的单词写成有道云词典的xml'''
def word_convert_xml(word_list,xml_name):xml_file = open(xml_name,'w');xml_file.write('<wordbook>') #xml起始位置for word in word_list:xml_file.write('<item>')xml_file.write('    <word>' + word + '</word>\n')xml_file.write('    <trans>' + '<![CDATA[]]>' +  '</trans>\n')xml_file.write('    <tags>'+"游龙当归海"+'</tags>\n') #reading是你单词本的名字,你可以改成自己的xml_file.write('    <progress>1</progress>\n')xml_file.write('</item>')xml_file.write('</wordbook>')#xml结束位置
# word_convert_xml(test_list,'d1.xml');
# print("单词个数:",len(test_list));

这里就大功告成了,下面是详细代码,简单分为3个模块

1.pdf 转图片
2.图片解析出单词
3.单词写入xml

'''
pdf_convert_png.py
解析pdf为png图片
'''import sys, fitz
import os
import datetime
import re;
from setting import pdf_path,image_path;png_count = 0;def pdf_convert_png(pdf_path,pdf_file_name, imagePath,count):global png_count;complete_pdf_path = pdf_path+"/"+pdf_file_name;#print("完整路径:"+complete_pdf_path);pdfDoc = fitz.open(complete_pdf_path)for pg in range(pdfDoc.pageCount):page = pdfDoc[pg]rotate = int(0)# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。# 此处若是不做设置,默认图片大小为:792X612, dpi=96zoom_x = 2 #(1.33333333-->1056x816)   (2-->1584x1224)zoom_y = 2mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)pix = page.getPixmap(matrix=mat, alpha=False)if not os.path.exists(imagePath):#判断存放图片的文件夹是否存在os.makedirs(imagePath) # 若图片文件夹不存在就创建pix.writePNG(imagePath+'/'+str(count)+'-images_%s.png' % pg)#将图片写入指定的文件夹内png_count = png_count + 1;print("[.]解析成png图片数:",png_count);def reload_fileNames(pdfPath,types):pdf_files = []; #存储将要转换pdf的名称for filename in os.listdir(pdfPath):if filename.endswith(types):pdf_files.append(filename);print("装载文件个数:{} 文件类型:{}".format(len(pdf_files),types));return pdf_files;
# if __name__ == "__main__":
#     pdf_files = reload_fileNames(pdfPath,'pdf');
#     #对文件名称排序
#     pdf_files = sorted(pdf_files,key = lambda i:int(re.match(r'(\d+)',i).group()))
#     print(pdf_files);
#     count = 1;
#     for p in pdf_files:
#         print("当前转换pdf:{}".format(p));
#         pdf_convert_png(pdf_path,p, image_path,count)
#         count = count + 1; #计算pdf数量

'''
png_convert_word.py
解析png图片中的单词
'''
import requests
import base64
from pdf_convert_png import reload_fileNames;
from setting import SK,AK;
from setting import pdf_path,image_path;
word_list=[]; #1.调用鉴权接口获取token
# client_id 为官网获取的AK, client_secret 为官网获取的SK
def get_token(ak,sk):    #有效日期为30天token ="";host = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id="+AK+"&client_secret="+SK;print("host:"+host);response = requests.get(host)if response:#print(response.json())token = response.json();token = token['access_token'];elif(response.status_code==400):print("获取token失败,请检查AK和SK是否过期");return token;
# 二进制方式打开图片文件
def png_convert_json(token,filename):request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"f = open(filename, 'rb')img = base64.b64encode(f.read())params = {"image":img}access_token = token;request_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)if response:return response.json(); #返回识别json结果#print (response.json())
def png_convert_word(file_name,file_path): #传入文件路径和文件名global word_list;#print("..................解析图片为单词开始..................");#token = get_token(AK,SK); #2020年2月23日00:52:00 token = 24.e1aea6**e***e532c.2**2000.158498**44.28233**-18**149token = "24.e****69d2f691b534e885e62***ce532c.2592000.1584982244.282335-18553149";#file_name = "../png/1-images_0.png";complete_path = file_path+"/"+file_name;print("当前操作文件:{}".format(complete_path));png_json = png_convert_json(token,complete_path);#json文件 words_result_num 检测数量 words_result['words'] 检测结果#print("识别数量:",png_json['words_result_num']);for i in png_json['words_result']:flag_index = i['words'].find('[');#过滤出单词#字符串查找[符号获得下表后使用字符串切片#过滤掉除了英文的东西if flag_index !=-1 and i['words'][:flag_index].isalpha():print(i['words'][:flag_index]);word_list.append(i['words'][:flag_index]);print("识别单词个数:{}".format(len(word_list)));#return word_list;# if __name__ == "__main__":
#     png_files = reload_fileNames(image_path,'png')
#     #print(png_files);
#     for png_file_name in png_files:
#         png_convert_word(png_file_name,image_path);
#         #input();
#     print("识别单词个数:",len(word_list));
#     print(word_list);
'''
word_convert_XML.py将解析出的单词写成有道云词典的xml'''
def word_convert_xml(word_list,xml_name):xml_file = open(xml_name,'w');xml_file.write('<wordbook>') #xml起始位置for word in word_list:xml_file.write('<item>')xml_file.write('    <word>' + word + '</word>\n')xml_file.write('    <trans>' + '<![CDATA[]]>' +  '</trans>\n')xml_file.write('    <tags>'+"游龙当归海"+'</tags>\n') #reading是你单词本的名字,你可以改成自己的xml_file.write('    <progress>1</progress>\n')xml_file.write('</item>')xml_file.write('</wordbook>')#xml结束位置
# word_convert_xml(test_list,'d1.xml');
# print("单词个数:",len(test_list));

还有一个公共变量setting.py

pdf_path = '../Word'  #pdf所在的路径
image_path = '../png' #存放图片所在的位置
AK="wymGK1blbN**RL4eemjkF"; #api key
SK= "PLfqdTh7j**FqcVk6kIteqY" #secert key

最后是主文件main.py

from  pdf_convert_png import *;
from png_convert_word import*;
from word_convert_XML import *;
#from png_convert_word import word_list;
from setting import*;def main():print("................PDF To PNG................");pdf_files = reload_fileNames(pdf_path,'pdf');#对文件名称排序pdf_files = sorted(pdf_files,key = lambda i:int(re.match(r'(\d+)',i).group()))#print(pdf_files);count = 0;for p in pdf_files:#print("当前转换pdf:{}".format(p));pdf_convert_png(pdf_path,p, image_path,count)count = count + 1; #计算pdf数量print("[.]抓取pdf文件个数:{}".format(count));print("................PNG to Word................")png_files = reload_fileNames(image_path,'png')# #print(png_files);for png_file_name in png_files:png_convert_word(png_file_name,image_path);#     #input();print("识别单词个数:",len(word_list));word_convert_xml(word_list,'test.xml');print("单词个数:",len(word_list));if __name__ == "__main__":main();

pdf文件

分离出的图片:

效果:

对照PDF,效果还是OK的

这里就会不断的去识别pdf切割出的图片

经过处理后的xml

导入到单词本中:
 

这里还有众多BUG,就不改了,凑合用,大概80%的成功率已经可以了  
后续发现老师发来的pdf竟然还有斜着的...老师他们用的这扫描仪也不行阿。。。 辣鸡

这也就是为啥这里只识别了一个nt,

我认为好好使用一下百度的ocr接口是可以完全识别这种斜的,而且在加上正则,我估计会有至少99%的正确率
我写的demo就留给大家进行二次开发把,我python代码水平比较差python基本上没有学过,代码结构和变量命名规则极其不规范~不过也罢啦,我本身就只是拿python当成一种工具使用而已 .为了100天的考试[解放]加油!!!!!!!!!!!!!!!

使用python解析pdf文档中的单词导入到有道云词典中相关推荐

  1. 用Python提取解析pdf文档中内容

    用Python提取解析pdf文档中内容 文章目录: 参考: 1.https://blog.csdn.net/tmaczt/article/details/82876018 # Tika库 2.http ...

  2. 数据导入与预处理-第4章-数据获取python读取pdf文档

    数据导入与预处理-第4章-数据获取Python读取PDF文档 1 PDF简介 1.1 pdf是什么 2 Python操作PDF 2.1 pdfplumber库 2.2 pdfplumber基本操作 2 ...

  3. Python读取PDF文档(或TXT)

    字符串在Python内部的表示是Unicode编码,首先我们来认识Python中encode()和decode()的作用与区别: 在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的 ...

  4. 【Python】PDF文档导出指定章节为TXT

    PDF文档导出指定章节为TXT 需求 要导出3000多个pdf文档的特定章节内容为txt格式(pdf文字可复制). 解决 导出PDF 查了一下Python操作PDF文档的方法,主要是通过3个库,PyP ...

  5. 教你如何使用 Python 将 pdf 文档进行 加密 解密——python实用小技能分享

      上次说了怎么将word转换为pdf格式 及 实现批量将word转换为pdf格式(点击这里),这次我又get到一个新技能–使用 Python 将 pdf 文档进行 加密 解密,哈哈哈 希望帮到更多人 ...

  6. python搜索pdf内容所在页码_利用Python在pdf文档中寻找某些词出现的页码

    要研究pdf文件的页码,首先要考虑这个文件的种类.pdf可能是一本书的电子版,可能是一份简历.可能是由Word.PPT或其他文档导出的--如果不是一本书,通常页面内容里是没有页码的:如果是一本书,虽然 ...

  7. 【Java】基于Pdfbox解析PDF文档中指定位置的文字和图片

    1.1 PDFBOX介绍 Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换. 我们可以使用PDFBox开发可以创建,转换和操作PDF文档的Java程序.PDFBox的主要功能 ...

  8. python书籍pdf文档密码-Python玩转PDF的各种骚操作

    Portable Document Format(可移植文档格式),或者PDF是一种文件格式,可以用于跨操作系统的呈现和文档交换.尽管PDF最初是由Adobe发明的,但它现在是由国际标准化组织(ISO ...

  9. python分割pdf文档

    python -V 3.7 需求 需要将一个pdf文档分割成一页一页的pdf 代码 可以使用PyPDF2库 from PyPDF2 import PdfFileReader, PdfFileWrite ...

  10. Apache PdfBox 2.0.X 版本解析PDF文档(文字和图片)

    最近项目开发过程涉及到了pdf文件的内容的解析和和内容的提取入库操作,其中pdf的解析采用了开源的apache pdfbox 插件,版本选用的是最新版本的2.0.8版本,现将简单的读取解析的步骤记录如 ...

最新文章

  1. 一罐百事可乐的背后,竟藏着这些人工智能
  2. PHP开发者应了解的24个库
  3. Spark _26_Spark On Hive的配置
  4. java:我们对Iterator理解错了
  5. 答网友问:如果用 OData 就能直接和 SAP 系统互通,BTP 和 CPI 这样的平台意义在哪里呢?
  6. 将八进制数制转换为二进制,十进制和十六进制数制
  7. 容器编排技术 -- Kubernetes kubectl edit 命令详解
  8. SVM 训练--在训练集上acc为94% 在测试集上为70%
  9. SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题
  10. python selenium2 动态调试
  11. 2017-2018-2 1723《程序设计与数据结构》第三周作业 实验一 总结
  12. JavaWeb学习笔记7--JSP脚本元素、指令元素、动作元素
  13. python练习题--斐波那契数列
  14. 数据库多表查询时,返回值该如何接收问题
  15. js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型
  16. 广东理工学院c语言考试试卷,20年广东理工学院成人高考期末考试 C语言程序设计 复习资料(15页)-原创力文档...
  17. matlab绘图笔记
  18. 万众电子期刊在线阅读系统(awd复现)
  19. 自动驾驶、无人驾驶、车联网笔记分享
  20. windows10 C盘后面有一个恢复分区,无法扩展C盘的解决办法

热门文章

  1. Agent Tesla样本分析
  2. 分布式技术核心(上)-ZookeeperDubbo
  3. 2021.02.18 北师大寒假新生训练
  4. 14. AsciiArt礼节/15. cterm的拷贝TCP包功能
  5. 解密深圳IT人士的当前薪情【转自:中国it实验室】
  6. 如何为你的CSDN博客加入百度统计
  7. [e袋购APP]高校物业管理的特点
  8. 查看游戏服务器ip地址网站,查看游戏服务器IP地址
  9. GAEA Winsieve v1.2 1CD(快速输入和打印结晶粒度分析曲线)
  10. Camera_Hal3_User_Manual