超分辨率重建数据集制作:高分辨率图像采集(将pdf转换为图像)

目录

背景

代码


背景

之前有用到从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转换为图片

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值