【Python-pdg2pdf】将.pdg文件转化为.jpg图片,再合并生成一个PDF文件

1.背景

这两天找到了心仪书籍的扫描件,一张一张的放在压缩包里,是.pdg格式,第一次接触这种文件,根本没法打开,更别说阅读了。就像这样↓
在这里插入图片描述

然后就找了下.pdg转成.pdf格式的方法,发现很多都是利用什么软件,正好现在凌晨校园网断网,流量限速,就懒得下载了,说不定还收费,然后就想着能不能用Python试试。

正好在Github上找到了一个现成的项目,经测试有些bug但是已修改,完全可以运行,分享如下。

2.分析

简单介绍一下这个项目的思路:

Step1

首先,脚本会修改指定目录下的所有.pdg文件后缀名为.jpg。这是因为PDG文件实际上是包含图片数据的文件,而我们需要将其转换为可以直接处理的.jpg格式。

Step2

对指定目录下的.jpg文件进行重命名操作。重命名规则是将文件名中的前三个字符替换为000,例如example.jpg会被重命名为000example.jpg。这样做的目的是为了在后续步骤中方便地对这些文件进行处理。

Step3

调用imgtopdf函数,将处理过的.jpg文件转换为PDF文件。imgtopdf函数接受三个参数:jpgBase(存放.jpg文件的目录),pdfBase(存放生成的PDF文件的目录)和pdfName(生成的PDF文件名)。在这个例子中,PDF文件将被保存在E:\Desktop\P目录下,文件名为testn.pdf

3.代码

需要修改几个路径。

# pdg2pdf 步骤整合  
import os  
import sys  
import re  
import time  
from PIL import Image  
import img2pdf  
import imghdr  
  
# 后缀名批量修改  
def batch_rename(work_dir, old_ext, new_ext):  
    """  
    传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀  
    """    files=os.listdir(work_dir)  
    for filename in files:  
        # 获取得到文件后缀  
        split_file = os.path.splitext(filename)  
        # 定位后缀名为old_ext 的文件  
        if split_file[1] == old_ext:  
            # 修改后文件的完整名称  
            newname = split_file[0] + new_ext  
            # 实现重命名操作  
            os.rename(  
                os.path.join(work_dir, filename),  
                os.path.join(work_dir, newname)  
            )  
            print(split_file[0]+" to "+new_ext)  
        elif split_file[1] == '.dat':  
            os.remove(work_dir+filename)  
  
def get_file_list(file_list_path, file_list_suffix):  
    """得到指定后缀的文件列表"""  
  
    exclude = (['.DS_Store', '.localized', 'Thumbs.db', 'desktop.ini'])  
    result_list = []  
    if os.path.isfile(file_list_path):  
        result_list.append(os.path.abspath(file_list_path))  
    else:  
        for dir_path, dir_names, file_names in os.walk(file_list_path):  
            if os.path.abspath(dir_path) != os.path.abspath(file_list_path):  # 只允许 1 层目录  
                continue  
            for name in file_names:  
                if (not os.path.basename(name) in exclude) \  
                        and (os.path.splitext(name)[1][1:] == file_list_suffix):  # 指定后缀  
                    abs_path = os.path.abspath(os.path.join(dir_path, name))  
                    result_list.append(abs_path)  
    return result_list  
  
def rename(path, suffix, re1, re2=''):  
    """rename主方法"""  
    count = 0  
    file_list = get_file_list(path, suffix)  
    for tar in file_list:  
        base_name = os.path.basename(tar)  
        new_base_name = re.sub(re1, re2, base_name)  
        new_path = os.path.join(os.path.dirname(tar), new_base_name)  
        print('%s --> %s' % (base_name, new_base_name))  
        os.rename(tar, os.path.abspath(new_path))  
        count += 1  
    print('----------')  
    print('总共处理了:%s' % (count))  
  
def get_file_list(file_list_path, file_list_suffix):  
    """得到指定后缀的文件列表"""  
  
    exclude = (['.DS_Store', '.localized', 'Thumbs.db', 'desktop.ini'])  
    result_list = []  
    if os.path.isfile(file_list_path):  
        result_list.append(os.path.abspath(file_list_path))  
    else:  
        for dir_path, dir_names, file_names in os.walk(file_list_path):  
            if os.path.abspath(dir_path) != os.path.abspath(file_list_path):  # 只允许 1 层目录  
                continue  
            for name in file_names:  
                if (not os.path.basename(name) in exclude) \  
                        and (os.path.splitext(name)[1][1:] == file_list_suffix):  # 指定后缀  
                    abs_path = os.path.abspath(os.path.join(dir_path, name))  
                    result_list.append(abs_path)  
    return result_list  
  
def resume(file_list):  
    """删除最后处理的5个图片(按最修改时间排序)"""  
  
    new_file_list = sorted(file_list, key=os.path.getmtime, reverse=True)  
    i = 0  
    for new_tar in new_file_list:  
        if i >= 5:  
            break  
        print("mtime: %s  delete: %s" % (time.strftime("%Y-%m-%d %H:%M:%S",  
                                                       time.localtime(os.path.getmtime(new_tar))  
                                                       ), new_tar))  
        os.remove(new_tar)  
        i += 1  
  
def analyse(in_reverse, file_list):  
    """打印最大、最小的5个文件"""  
    new_file_list = sorted(file_list, key=os.path.getsize, reverse=in_reverse)  
    i = 0  
    for new_tar in new_file_list:  
        if i >= 5:  
            break  
        print("size(Kilobyte): %s" % (round(os.path.getsize(new_tar) / float(1024))))  
        i += 1  
  
def noexif(path, suffix):  
    """noexif主方法方法"""  
    path = path  
    suffix = suffix  
    out_path = os.path.join(path, 'no-exif')  # 输出目录  
    if not os.path.exists(out_path):  
        os.makedirs(out_path)  
    file_list = get_file_list(out_path, suffix)  
    print('max --> min')  
    analyse(True, file_list)  
    print('----------')  
    print('min --> max')  
    analyse(False, file_list)  
    print('----------')  
    resume(file_list)  
    print('----------')  
    count = 0  
    file_list = get_file_list(path, suffix)  
    for tar in file_list:  
        tar_name = os.path.basename(tar)  
        tar_out = os.path.join(out_path, tar_name)  
        # 跳过已有文件  
        if os.path.exists(tar_out):  
            continue  
  
        count += 1  
        print('%s  %s' % (count, tar_name))  
        #parse_image(tar, tar_out)  # 处理图片  
  
    print('----------')  
    print('总共处理了:%s' % (count))  
  
def imgtopdf(jpgBase, pdfBase, pdfName='test.pdf'):  
    # convert all files ending in .jpg inside a directory  
    dirname = jpgBase  
    imgs = []  
    for fname in os.listdir(dirname):  
        if not fname.endswith(".jpg"):  
            continue  
        path = os.path.join(dirname, fname)  
        if os.path.isdir(path):  
            continue  
        imgs.append(path)  
    with open(pdfBase+'\\'+pdfName,"wb") as f:  
        f.write(img2pdf.convert(imgs))  
        print("-->"+pdfBase+'\\'+pdfName)  
  
def main():  
  
    # 修改pdg后缀为jpg  
    work_dir = 'E:\Desktop\PaddlePaddle深度学习实战_14439480\P\\'  # pdg文件目录【修改】  
    batch_rename(work_dir, '.pdg', '.jpg')   # pdg转jpg  
  
    # 进行文件重命名和删除exif  
    path = work_dir  # 处理目录  
    suffix = 'jpg'  # "处理目录"中的指定图片后缀  
    re1 = '000'  
    rename(path, suffix, re1)  
  
    jpgBase = work_dir # jpg来源的文件夹  # 不消除exif时jpg文件目录  
    pdfBase = 'E:\\Desktop\\P'  # pdf文件目录【修改】  
    pdfName = 'testn.pdf'  # pdf文件名【修改】  
    imgtopdf(jpgBase, pdfBase, pdfName)  
  
if __name__ == '__main__':  
    main()

4.总结

感谢nizaiwo以及其他前辈们的工作。
附原项目链接GitHub - nizaiwo/pdg2pdf: a pdg2pdf tool to convert pdg files to pdf

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

还重名就过分了啊

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值