前几天在做应标方案,少不了从各种合同、验收文档中截取一下案例图片,试了半天也没找到合适的工具,从网上找python相关方案,最后选中了PyMuPDF,主要是好用,而且功能也听过,目前只实现了pdf转图片,pdf抽取文本两种功能,后续的有待再学习。
# pip install PyMuPDFimport datetime
import os
import fitz # 导入PyMuPDF
if __name__ == "__main__":
# 指定待转换的PDF文件路径和名称 pdfpathfile = 'Oracle分析函数.pdf' # 指定储存图片的目录 imgpath = 'yyyy/' pdftoimage(pdfpathfile, imgpath)
pdftotext(pdfpathfile, imgpath)
def pdftoimage(pdfpathfile, imagepath):
starttime = datetime.datetime.now() # 开始时间 pdfdoc = fitz.open(pdfpathfile) # Document('xxx.pdf'),返回Document对象 for pg in range(pdfdoc.pageCount): # 获取pdf页码 page = pdfdoc[pg]
rotate = int(0)
# 默认输出图片大小为:597*837, dpi=96 # 可通过zoom_x,zoom_y调整输出图片大小 # 如将图片输出为716*1256的分辨率 # 则zoom_x=716/597=1.2,zoom_y=1256/837=1.5 zoom_x = 1.2 zoom_y = 1.5 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 = datetime.datetime.now() # 结束时间 print('pdf转换image时间=', (endtime - starttime).seconds)
解析结果如下:
def pdftotext(pdfpathfile, imagepath):
starttime = datetime.datetime.now() # 开始时间 pdfdoc = fitz.open(pdfpathfile) # Document('xxx.pdf'),返回Document对象 for pg in range(pdfdoc.pageCount): # 获取pdf页码 page = pdfdoc[pg]
rotate = int(0)
doc = fitz.open(pdfpathfile) # open document out = open(pdfpathfile + ".txt", "wb") # open text output for page in doc: # iterate the document pages text = page.get_text().encode("utf8") # get plain text (is in UTF-8) out.write(text) # write text of page out.write(bytes((12,))) # write page delimiter (form feed 0x0C) out.close()
endtime = datetime.datetime.now() # 结束时间 print('pdf转换text时间=', (endtime - starttime).seconds)
解析结果如下: