目录
背景
之前有用到从pdf中提取图片,见:
超分辨率重建数据集制作:高分辨率图像采集(从pdf中获取图像)_Alocus的博客-CSDN博客_高分辨率图像数据集背景嗯嗯代码ee其他eehttps://blog.csdn.net/Crystal_remember/article/details/122899476但是有的时候提取会失败,提取出长条状的残次图像,提取不完整。因此我找了网上的代码,并将pdf转换为图片整合了到一起。
代码
该代码来自https://github.com/jtyoui/Jtyoui/tree/master/jtyoui
#coding=utf-8
import os
import fitz
from os.path import abspath, dirname
# 使用fitz 库直接提取pdf的图像
# 参数: pdf 源pdf文件完整路径
# 参数: picPath 提取图像的路径
def muExtractImages(pdf, picPath):
pdfsplit = os.path.split(pdf) # 分离出文件名和路径
pdfname = pdfsplit[-1] # 获取文件名
pdfsplit1 = os.path.splitext(pdfname)
pdfname1 = pdfsplit1[0] # 获取不带扩展名的文件名
# print(pdfsplit)
# print(pdfname)
# print(pdfname1)
# 打开pdf,打印PDF的相关信息
doc = fitz.open(pdf)
# 图片计数
imgcount = 0
lenXREF = doc.xref_length() # 获取pdf文件对象总数
# 打印PDF的信息
print("文件名:{}, 页数: {}, 对象: {}".format(pdf, len(doc), lenXREF - 1))
# 遍历doc,获取每一页
for page in doc:
try:
imgcount += 1
tupleImage = page.get_images()
lstImage = list(tupleImage)
xref0 = lstImage[0] # 取第一个元组
xref1 = list(xref0) # 元组转化为列表
xref = xref1[0] # 最终取得xref ok
print("imgID: %s" % imgcount)
print("xref: %s" % xref)
img = doc.extract_image(xref) # 获取文件扩展名,图片内容 等信息
imageFilename = ("%s-%s." % (imgcount, xref) + img["ext"])
imageFilename = pdfname1 + "_" + imageFilename # 合成最终 的图像的文件名
imageFilename = os.path.join(picPath, imageFilename) # 合成最终图像完整路径名
print(imageFilename)
imgout = open(imageFilename, 'wb') # byte方式新建图片
imgout.write(img["image"]) # 当前提取的图片写入磁盘
imgout.close
except:
continue
def _get_dir_name(file_dir):
base_name = os.path.basename(file_dir) # 获得地址的文件名
dir_name = os.path.dirname(file_dir) # 获得地址的父链接
return dir_name, base_name
def pdf_image(pdf_address, image_dir=None):
"""PDF转照片
:param pdf_address: PDF文件地址
:param image_dir: 照片的文件夹地址
:return: 成功返回True
"""
dir_name, base_name = _get_dir_name(pdf_address)
pdf = fitz.Document(pdf_address)
for pg in range(0, pdf.pageCount):
page = pdf[pg] # 获得每一页的对象
trans = fitz.Matrix(1.0, 1.0).preRotate(0)
pm = page.getPixmap(matrix=trans, alpha=False) # 获得每一页的流对象
if not image_dir:
pm.writePNG(str(pdf_address[:-4]) + os.sep + str(base_name[:-4]) + '_{:0>4d}.jpeg'.format(pg + 1)) # 保存图片
else:
pm.writePNG(image_dir + os.sep + str(base_name[:-4]) + '_{:0>4d}.jpeg'.format(pg + 1)) # 保存图片
pdf.close()
return True
def image_pdf(file_dir, pdf_address=None):
"""照片转pdf
:param file_dir: 照片的地址文件夹
:param pdf_address: 保存pdf的文件地址,默认是当前地址
:return: 成功返回True
"""
dir_name, base_name = _get_dir_name(file_dir)
doc = fitz.Document()
for img in sorted(glob.glob(file_dir + '\\*'), key=os.path.getmtime): # 排序获得对象
img_doc = fitz.Document(img) # 获得图片对象
pdf_bytes = img_doc.convertToPDF() # 获得图片流对象
img_pdf = fitz.Document("pdf", pdf_bytes) # 将图片流创建单个的PDF文件
doc.insertPDF(img_pdf) # 将单个文件插入到文档
img_doc.close()
img_pdf.close()
if not pdf_address:
doc.save(dir_name + os.sep + base_name + ".pdf") # 保存文档
else:
doc.save(pdf_address + ".pdf") # 保存文档
doc.close()
return True
if __name__ == '__main__':
current_path = abspath(dirname(__file__)) # 获取当前目录
pdf = r"C:\Users\Administrator\Desktop\111.pdf"#os.path.join(current_path, 'test444.pdf')
print(pdf)
savepath = r"C:\Users\Administrator\Desktop\result"
if not os.path.exists(savepath):
os.mkdir(savepath)
#muExtractImages(pdf,savepath) #pdf中提取图片
pdf_image(pdf, image_dir=savepath) #pdf转换为图片