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