[Python-pdg2pdf] Konvertieren Sie .pdg-Dateien in .jpg-Bilder und führen Sie sie dann zusammen, um eine PDF-Datei zu generieren

1. Hintergrund

In den letzten zwei Tagen habe ich gescannte Exemplare meiner Lieblingsbücher gefunden. Sie wurden einzeln in einer komprimierten Verpackung verpackt. Sie hatten das Format.pdg. Es war das Als ich zum ersten Mal auf eine solche Datei stieß, konnte ich nicht anders. Öffnen, geschweige denn lesen. Genau so↓
Fügen Sie hier eine Bildbeschreibung ein

Dann suchte ich nach Möglichkeiten, .pdg in das .pdf-Format zu konvertieren, und stellte fest, dass viele davon irgendeine Art von Software verwendeten. Das Campus-Netzwerk entstand einfach Die Verbindung sollte am frühen Morgen getrennt werden. Aufgrund der Geschwindigkeitsbegrenzung im Straßenverkehr habe ich mir nicht die Mühe gemacht, es herunterzuladen, und möglicherweise würde eine Gebühr anfallen, also habe ich darüber nachgedacht, es mit Python auszuprobieren.

Ich habe zufällig ein fertiges Projekt auf Github gefunden. Nach dem Testen weist es einige Fehler auf, wurde aber geändert. Es ist voll funktionsfähig. Ich werde es wie folgt teilen.

2.Analyse

Lassen Sie uns kurz die Idee dieses Projekts vorstellen:

Schritt 1

Zuerst ändert das Skript alle.pdg Dateien im angegebenen Verzeichnis mit dem Suffixnamen.jpg. Dies liegt daran, dass die PDG-Datei eigentlich eine Datei mit Bilddaten ist und wir sie in ein Format konvertieren müssen, das direkt verarbeitet werden kann. .jpg

Schritt 2

Benennen Sie die.jpg Datei im angegebenen Verzeichnis um. Die Umbenennungsregel besteht darin, die ersten drei Zeichen im Dateinamen durch 000 zu ersetzen. Beispielsweise wird example.jpg in 000example.jpg umbenannt . Der Zweck besteht darin, die Verarbeitung dieser Dateien in nachfolgenden Schritten zu erleichtern.

Schritt 3

Rufen Sie die Funktionimgtopdf auf, um die verarbeitete.jpg-Datei in eine PDF-Datei zu konvertieren. imgtopdfDie Funktion akzeptiert drei Parameter: jpgBase(das Verzeichnis, in dem die Datei .jpg gespeichert ist), pdfBase( Das Verzeichnis, in dem die generierte PDF-Datei gespeichert ist) und pdfName (der Name der generierten PDF-Datei). In diesem Beispiel wird die PDF-Datei im Verzeichnis E:\Desktop\P mit dem Dateinamen testn.pdf gespeichert.

3.Code

Mehrere Pfade müssen geändert werden.

# 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. Zusammenfassung

Vielen Dank an Nizaiwo und andere Senioren für ihre Arbeit.
Angehängter Original-ProjektlinkGitHub – nizaiwo/pdg2pdf: ein pdg2pdf-Tool zum Konvertieren von PDF-Dateien in PDF

Guess you like

Origin blog.csdn.net/U202113837/article/details/131468015