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

本文介绍了一种使用Python脚本将PDG格式文件批量转换为PDF的方法。首先,脚本将PDG文件重命名为.jpg,然后进行重命名操作,最后利用imgtopdf函数将处理后的.jpg文件合并为PDF。整个过程无需额外软件,适合在没有网络或软件限制的情况下使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

超星图书转换利器 FreePic2PdfPdg2Pic 最新绿色版(pdg转换成pdf),包含Pdg2Pic和FreePic2Pdf两部分软件。 Pdg2Pic 功能: 将PDG文件转成图像文件(包括TIFF、JPG、PNG),具有下列特色: 转换过程不占用系统剪贴板,因此在转换时,不影响用户在前台的正常工作。 在打开目录时自动对PDG文件进行格式统计,并报告结果。 可以自动将文件按封面、前言、目录、正文、附录的顺序排列,也可以手动调整。 提供预览功能,在转换前可以先浏览PDG图像和PDG文件信息。 如果转换过程中出现错误,将给出错误日志,便于定位有问题的PDG文件PDG文件的扫描DPI自动转存入TIFF、PNG文件,便于在转换成PDF文件时指定页面大小。 如果检查发现PDG文件是纯正的JPG文件,将不进行任何转换,直接将PDG复制为JPG;黑白PDG文件转存为采用CCITT G4压缩的TIFF文件,以获取高压缩比;灰度/彩色PDG重新压缩为有损的JPG或采用JPEG压缩的TIFF文件,或无损压缩的PNG文件 ,或JPEG 2000(JP2文件(质量系数为100%时,JPEG 2000为无损压缩,否则为有损压缩)。 与FreePic2Pdf配合,能够自动生成PDF多级书签;能够在PDF文件中自动生成三段页码:封面、版权页用大写英文字母,目录页用小写罗马字母,正文页用阿拉伯数字;能够将BookInfo.dat作为文本添加到PDF文件中,并用其中内容填写PDF的Document Properties,包括Title、Author、Subject、Keyword。 能够将PDG文件直接OCR成文本文件。OCR引擎为微软Office 2003所带的Microsoft Office Document Imaging (MODI)。OCR时自动跳过封面、书名、版权、目录页。 Pdg2Pic基于超星浏览器的Pdg2控件实现,因此运行时需要在本地机上先安装超星浏览器,或注册一个能用的Pdg2.dll。本软件对超星浏览器3.8的支持没有问题,其它版本的超星浏览器没有试过。 PDG文件是超星公司电子图书的专有格式,需要用超星公司的专用浏览器才能阅读。本人无意对超星公司的版权进行任何形式的侵犯,也不希望任何人用本工具从事侵权活动。如果需要浏览PDG电子书,请通过购买点卡等方式,以合法的途径获得。本软件假定用户通过合法的手段获得PDG文件,只是由于希望能够在比超星浏览器更好、更方便的浏览器上阅读,并且不对转换出来的文件进行扩散的情况下,才需要将PDG文件转换成图像文件。 FreePic2Pdf 功能: 将图像文件(包括TIFF、JPG、PNG、GIF、BMP、JPEG 2000)合并、转换成PDF文件的软件: 对有损/无损压缩的JPEG 2000、有损压缩的JPG文件及采用JPEG/OJPEG算法压缩的TIFF文件,直接将原始数据流嵌入PDF文件,避免因为重新压缩而造成图像质量下降;对无损压缩的图像文件,黑白图像解码后压缩为JBig2(有损或无损)或CCITT G4,其它解码后压缩成ZIP数据流嵌入PDF文件。 支持多页TIFF和多帧(动画)GIF,每页或每帧算一幅图像。 可以指定生成PDF文件的页面大小(除A4、B5等,还支持国内常用的32开、16开、大32开)及页边距。如果不指定页面的纸张大小,可以指定页面的固定宽度(长度随图像大小伸缩),避免连续阅读时因为页面宽度变来变去而影响阅读。 支持通过接口自动生成多级书签、分段页码、添加文本页、设置PDF的Document Properties。 接口文件可以用于新生成PDF,也可以用于已有的PDF,包括往已有的PDF上加书签、从PDF取书签等。 软件基于开源代码实现,运行时不需要任何第三方软件或控件的支持。当然如果要浏览制作出来的PDF文件,必须安装Adobe PDF Reader等PDF阅读软件。 使用步骤: 第1步:我们要先用到的是Pdg2Pic,由于这个软件在使用是要用到超星的Pdg2控件,所以我们要先把超星中的Pdg2.dll文件复制到WINDOWS文件夹下的SYSTEM32文件夹中(放到其他的地方行不行我还没有试过)然后点开始---运行---输入regsvr32 pdg2.dll 注册完成之后就可以使用Pdg2Pic了。 软件已经用1、2、3、4表示了操作步骤:先点击“1、选择需转换的PDG文件所在文件夹:” 选择你要转换的PDG文件夹后,这时先不要急着点“开始转换”因为经过第一步的选择文件夹之后,第2步的“选择存放转换出来的图象文件文件夹”也跟着默认的和需转换的PDG文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

还重名就过分了啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值