【电子书转换】读取指定文件夹内的pdg文件转为png再转为PDF,完美

当我从某个电子书下载网站上下载了一本书,想要阅读时,打开发现:
在这里插入图片描述
不是PDF格式的,是.pdg,虽然可以用画图 打开,但是太影响阅读速度了吧,所以我想,既然它是图片,那我可不可以把它们转换成.png格式,然后我尝试着直接重命名,可以打开!!!
然后我就想,这样一个一个重命名也太费事了,用python写一个批量重命名程序!

import os

def pdg2png(folder_path:str):
    for filename in os.listdir(folder_path):
        if filename.endswith('.pdg'):
            # 构建新文件名,将'.pdg'替换为'.png'
            new_filename = filename.replace('.pdg', '.png')

            # 拼接旧文件路径和新文件路径
            old_file_path = os.path.join(folder_path, filename)
            new_file_path = os.path.join(folder_path, new_filename)

            # 重命名文件
            os.rename(old_file_path, new_file_path)

if __name__ == '__main__':
    folder_path = 'F:\桌面\Work\Patran从入门到精通'  # 替换成你的文件夹路径
    pdg2png(folder_path)

运行看看效果:
在这里插入图片描述
达到了预期,非常不错!
打开查看也没问题,但是这样一页一页的看也很费劲啊!
那~既然是图片,那可不可以组合成PDF?
尝试一下!

from PIL import Image
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import os


def png2pdf(folder_path:str, output_pdf:str):
    # 获取文件夹内所有以'.png'为后缀的图片文件
    image_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]
    if image_files:
        # 创建一个PDF文件
        c = canvas.Canvas(output_pdf, pagesize=letter)

        for image_file in image_files:
            print(image_file)
            # 打开图片文件并获取其尺寸
            image = Image.open(os.path.join(folder_path, image_file))
            image_width, image_height = image.size
            
            # 将图片添加到PDF
            c.drawImage(os.path.join(folder_path, image_file), image_width, image_height)

            # 添加新的页面
            c.showPage()

        # 保存PDF文件
        c.save()
    else:
        print("没有找到以'.png'为后缀的图片文件。")

    print(f"PDF文件已生成: {output_pdf}")

if __name__ == '__main__':
    folder_path = 'F:\桌面\Work\Patran从入门到精通_11161802'  # 替换成你的文件夹路径
    output_pdf = 'F:\桌面\Work\Patran从入门到精通_11161802\output.pdf'  # PDF文件的输出路径和名称

    page_width, page_height = letter
    png2pdf(folder_path, output_pdf)

当然了,这其中出现了一些问题:
(1)图片缩放问题,图片显示不全
(2)图片顺序问题
进行一下改动:
(1)获取页面大小和位置将图片进行缩放并居中放置
(2)根据具体的页面和其名称,进行顺序的修改
完整代码如下:

from PIL import Image
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import os
import re

def match_prefix(file_name:str):
    # 使用正则表达式匹配英文前缀
    match = re.match(r'^[a-zA-Z]+', file_name)
    english_prefix = None
    if match:
        english_prefix = match.group(0)
        print(english_prefix)
    return english_prefix


def get_before_files(image_files:list):
    # 分组图片文件
    grouped_files = {}
    for image_file in image_files:
        file_name = os.path.splitext(image_file)[0]  # 去掉文件扩展名
        first_letter = file_name[0]
        if first_letter.isalpha():
            english_prefix = match_prefix(file_name)
            if english_prefix not in grouped_files:
                grouped_files[english_prefix] = []
            grouped_files[english_prefix].append(image_file)
    # 排序并重新组合
    sorted_groups = ['cov001.png']
    sorted_letters = sorted([k for k in grouped_files.keys() if k.startswith('bok')] + \
                            [k for k in grouped_files.keys() if k.startswith('fow')] + \
                            [k for k in grouped_files.keys() if k.startswith('leg')])
    for letter in sorted_letters:
        if letter in grouped_files:
            sorted_groups.extend(grouped_files[letter])
    print(sorted_groups)
    return sorted_groups


def png2pdf(folder_path:str, output_pdf:str):
    # 获取文件夹内所有以'.png'为后缀的图片文件
    image_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]
    # before_files = ['cov001.png','bok001.png','fow001.png','fow002.png','leg001.png']
    # mulu_files = ['!0000'+str(file_name)+'.png' for file_name in range(1,10)]
    # print(mulu_files)
    content_files = [f for f in image_files if not f[0].isalpha()]
    print(content_files)
    after_files = ['cov002.png']
    before_files = get_before_files(image_files)
    sorted_files = before_files + content_files + after_files

    if sorted_files:
        # 创建一个PDF文件
        c = canvas.Canvas(output_pdf, pagesize=letter)

        for image_file in sorted_files:
            print(image_file)
            # 打开图片文件并获取其尺寸
            image = Image.open(os.path.join(folder_path, image_file))
            image_width, image_height = image.size

            # 计算缩放比例以适应页面
            scale_x = page_width / image_width
            scale_y = page_height / image_height

            # 选择较小的缩放比例,以确保图片完全显示在页面上
            scale = min(scale_x, scale_y)

            # 计算图片在页面上的位置,使其居中
            x = (page_width - (image_width * scale)) / 2
            y = (page_height - (image_height * scale)) / 2

            # 将图片添加到PDF并缩放
            c.drawImage(os.path.join(folder_path, image_file), x, y, image_width * scale, image_height * scale)

            # 添加新的页面
            c.showPage()

        # 保存PDF文件
        c.save()
    else:
        print("没有找到以'.png'为后缀的图片文件。")

    print(f"PDF文件已生成: {output_pdf}")

if __name__ == '__main__':
    folder_path = 'F:\桌面\Work\Patran从入门到精通_11161802'  # 替换成你的文件夹路径
    output_pdf = 'F:\桌面\Work\Patran从入门到精通_11161802\output.pdf'  # PDF文件的输出路径和名称

    page_width, page_height = letter
    png2pdf(folder_path, output_pdf)

但是我还有很多书要转换,那~我能不能添加一个界面,可以选择pdg文件所在的文件夹,并且可以输入要生成的PDF的名称,单击生成按钮即可生成呢?
当然可以:

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
from tkinter import filedialog
from PIL import Image
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import os
import re

def pdg2png(folder_path:str):
    for filename in os.listdir(folder_path):
        if filename.endswith('.pdg'):
            # 构建新文件名,将'.pdg'替换为'.png'
            new_filename = filename.replace('.pdg', '.png')

            # 拼接旧文件路径和新文件路径
            old_file_path = os.path.join(folder_path, filename)
            new_file_path = os.path.join(folder_path, new_filename)

            # 重命名文件
            os.rename(old_file_path, new_file_path)


def match_prefix(file_name:str):
    # 使用正则表达式匹配英文前缀
    match = re.match(r'^[a-zA-Z]+', file_name)
    english_prefix = None
    if match:
        english_prefix = match.group(0)
        print(english_prefix)
    return english_prefix


def get_before_files(image_files:list):
    # 分组图片文件
    grouped_files = {}
    for image_file in image_files:
        file_name = os.path.splitext(image_file)[0]  # 去掉文件扩展名
        first_letter = file_name[0]
        if first_letter.isalpha():
            english_prefix = match_prefix(file_name)
            if english_prefix not in grouped_files:
                grouped_files[english_prefix] = []
            grouped_files[english_prefix].append(image_file)
    # 排序并重新组合
    sorted_groups = ['cov001.png']
    sorted_letters = sorted([k for k in grouped_files.keys() if k.startswith('bok')] + \
                            [k for k in grouped_files.keys() if k.startswith('fow')] + \
                            [k for k in grouped_files.keys() if k.startswith('leg')])
    for letter in sorted_letters:
        if letter in grouped_files:
            sorted_groups.extend(grouped_files[letter])
    print(sorted_groups)
    return sorted_groups

def png2pdf(folder_path:str, output_pdf:str, pdf_generator_instance):
    # 获取文件夹内所有以'.png'为后缀的图片文件
    image_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]
    # before_files = ['cov001.png','bok001.png','fow001.png','fow002.png','leg001.png']
    # mulu_files = ['!0000'+str(file_name)+'.png' for file_name in range(1,10)]
    # print(mulu_files)
    content_files = [f for f in image_files if not f[0].isalpha()]
    print(content_files)
    after_files = ['cov002.png']
    before_files = get_before_files(image_files)
    sorted_files = before_files + content_files + after_files

    if sorted_files:
        # 创建一个PDF文件
        c = canvas.Canvas(output_pdf, pagesize=letter)

        for i, image_file in enumerate(sorted_files):
            print(image_file)
            # 打开图片文件并获取其尺寸
            image = Image.open(os.path.join(folder_path, image_file))
            image_width, image_height = image.size

            # 计算缩放比例以适应页面
            scale_x = page_width / image_width
            scale_y = page_height / image_height

            # 选择较小的缩放比例,以确保图片完全显示在页面上
            scale = min(scale_x, scale_y)

            # 计算图片在页面上的位置,使其居中
            x = (page_width - (image_width * scale)) / 2
            y = (page_height - (image_height * scale)) / 2

            # 将图片添加到PDF并缩放
            c.drawImage(os.path.join(folder_path, image_file), x, y, image_width * scale, image_height * scale)

            # 添加新的页面
            c.showPage()
            if i % 10 == 0:
                # 更新进度条
                progress = int((i + 1) / len(sorted_files) * 100)
                pdf_generator_instance.update_progress(progress)

        # 保存PDF文件
        c.save()
        print(f"PDF文件已生成: {output_pdf}")
        # 显示完成时的弹窗消息
        messagebox.showinfo("转换完成", "PDF转换完成。")

    else:
        print("没有找到以'.png'为后缀的图片文件。")
        messagebox.showinfo("转换失败", "没有找到以'.png'为后缀的图片文件。")


class PDFGenerator:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF Generator")

        # 创建文件夹选择按钮
        self.folder_button = tk.Button(root, text="选择文件夹", command=self.select_folder)
        self.folder_button.pack()

        # 创建PDF文件名输入框
        self.pdf_name_label = tk.Label(root, text="PDF文件名:")
        self.pdf_name_label.pack()
        self.pdf_name_entry = tk.Entry(root)
        self.pdf_name_entry.pack()

        # 创建生成PDF按钮
        self.generate_button = tk.Button(root, text="生成PDF", command=self.generate_pdf)
        self.generate_button.pack()

        # 创建信息输出文本框
        self.info_text = tk.Text(root, height=5, width=40)
        self.info_text.pack()

        # 创建进度条
        self.progress_bar = ttk.Progressbar(root, orient='horizontal', length=200, mode='determinate')
        self.progress_bar.pack()
        self.progress_bar["maximum"] = 100  # 设置进度条的最大值

        # 初始化变量
        self.selected_folder = ""
        self.pdf_file_name = ""


    def update_progress(self, value):
        self.progress_bar["value"] = value
        root.update_idletasks()

    def select_folder(self):
        self.selected_folder = filedialog.askdirectory()
        # self.info_text.delete(1.0, tk.END)
        self.info_text.insert(tk.END, f"选择的文件夹:   {self.selected_folder}\n")
        pdg2png(self.selected_folder)
        print(self.selected_folder)

    def generate_pdf(self):
        self.pdf_file_name = f"{self.selected_folder}\\{self.pdf_name_entry.get()}.pdf"
        # self.info_text.delete(1.0, tk.END)
        self.info_text.insert(tk.END, f"已生成PDF文件:   {self.pdf_file_name}")
        print(self.pdf_file_name)
        self.update_progress(0)  # 重置进度条
        png2pdf(self.selected_folder, self.pdf_file_name, self)

if __name__ == "__main__":
    page_width, page_height = letter
    folder_path = ''  # 替换成你的文件夹路径
    output_pdf = ''  # PDF文件的输出路径和名称

    root = tk.Tk()
    app = PDFGenerator(root)
    root.mainloop()

非常奈斯,并且还设置了一个进度条
在这里插入图片描述
但是呢,有一个问题,如果要转换的书页数太多,会卡住,但是不影响程序运行,原因应该是进度条刷新太频繁。
在这里插入图片描述
完美!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超星图书转换利器 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文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值