之所以要做这件事情,是因为子平的书有很多影印版,我们既要实证,又要有对应的断语。但一个个字手工输入,就会很麻烦而且辛苦,所以就想到是否通过Paddle识别再修正,这样自己一个人可以节省很多时间。
并不能直接识别pdf,需要做一些转换
1 将pdf转换为图片
import datetime
import os
import fitz # fitz就是pip install PyMuPDF
def pyMuPDF_fitz(pdfPath, imagePath):
startTime_pdf2img = datetime.datetime.now() # 开始时间
print("imagePath=" + imagePath)
pdfDoc = fitz.open(pdfPath)
for pg in range(76,pdfDoc.pageCount):
page = pdfDoc[pg]
rotate = int(0)
# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
# 此处若是不做设置,默认图片大小为:792X612, dpi=96
zoom_x = 2 # (1.33333333-->1056x816) (2-->1584x1224)
zoom_y = 2
mat = 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)
if __name__ == "__main__":
# 1、PDF地址
pdfPath = r'./file/006172_陈柏谕-专论企业家八字学.pdf'
# 2、需要储存图片的目录
imagePath = './imgs/qyj'
pyMuPDF_fitz(pdfPath, imagePath)
2 图片识别数据
import os
from paddleocr import PaddleOCR
import datetime
import ocr_util
import re
def traversal_file(img_path,out_path):
list = os.listdir(img_path)
for i in range(0,len(list)):
path = os.path.join(img_path,list[i])
file_name = list[i][:-4]
ocr_img(path, file_name, out_path)
def ocr_img(path,name,out_path):
startTime_pdf2img = datetime.datetime.now() # 开始时间
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
result = ocr.ocr(path, cls=True)
xy_info = ocr_util.xy_info(result)
# xy_info.sort(key=lambda x:(x[2],-x[1]))
# xy_info = sorted(xy_info, key=lambda x:(x[2],-x[1]))
# xy_info = sorted(xy_info, key=lambda x:-x[1])
xy_info.sort(key=lambda x:-x[1])
# data = xy_info.sort(key=takeSecond)
datas = []
for xy in xy_info:
if (len(xy[0])>4) and re.match(r'[\u4e00-\u9fa5]+',xy[0],re.S):
datas.append(xy[0])
# print(xy[0],xy[1],xy[2])
# print(xy_info[0])
if datas:
file_path = os.path.join(out_path,name+'.txt')
with open(file_path,'w',encoding='utf-8') as f:
for line in datas:
f.write(line+'\n')
endTime_pdf2img = datetime.datetime.now() # 结束时间
print(name,'时间消耗', (endTime_pdf2img - startTime_pdf2img).seconds,'S')
if __name__ == "__main__":
# img_path = r'imgs/qyj/images_76.png'
# ocr_img(img_path, 'images_76', r'./txt')
img_path = r'imgs/qyj'
out_path = r'./txt'
根据左上角定点排序
def xy_info(results):
'''
:param results:
:return:
'''
data_list = []
for result in results:
info = result[1][0]
boxx,boxy = result[0][0]
data_list.append([info,int(boxx),int(boxy)])
return data_list
松下電器王厨的創業人丨經管之神:松下·幸之助
本造是享餐世界,
姓名督下幸之助
下幸之助之八字
松下氏之八字是身强之锡官格,命局以食傷澳秀生财需用
情又有力,加上一路吉通相助,故能建立麗大之企業王國·命局年月
雨柱喜神多松忌神,松下原本出身松良好家庭,但因子運(比月通)
父规經商失败,家境疑得赤贫如洗,使得松下氏小學果業之後就到工
氏在十除之年纪即已展现其商業才華·成通中数立松下電氣器具裂
作所,首先代事自行車橙之裂造版费,在其锐意經坐之下,公司不断
成長奥摘大,在联争结束之前即罐有一萬五千名作業员规模之事業
松下企業年营業额近五百镜美元之多
中未午已辰卵寅开子
甲类工辛庚己戊丁丙
新富且之經管之神
企業家的命例研究