目录内图片转PDF (多图片打印助手)

查看 68|回复 8
作者:wkdxz   
使用场景:最近同事经常找我帮她打印试卷,很奇葩的是,她的试卷都是*红书上下载的图片,一张张打印不好看,而且可能打印不完全,大小也不协调,所以有了这个脚本。
我的常用方法是:将需要打印的图都放到一个目录下,然后将脚本也放进目录,运行脚本就可以转为一个单独的PDF,再打印PDF文件。
转成exe运行的话,速度太慢,且exe体积较大,如有需要,请自行转换。
'''
代码作用:
    将当前或指定文件夹内【不含子目录】的多个图片转为一个pdf文件
    当需要给小孩打印图片格式的试卷时比较实用
特色:
    会将太宽或太高的图片设定为单个页面最大尺寸的95%,防止图片太大时打印不完全
   
使用方法:
    1、直接将脚本放到图片目录,运行即可
    2、假设脚本路径为“C:\Users\Administrator\Desktop\目录内图片转PDF.py”
        图片目录为:“C:\Users\Administrator\Desktop\要转换的图片”
        
        命令行运行: 脚本路径 图片目录
        即:“C:\Users\Administrator\Desktop\目录内图片转PDF.py” “C:\Users\Administrator\Desktop\要转换的图片”
        
'''
[Python] 纯文本查看 复制代码import os
import subprocess
import sys
from PIL import Image
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
# 获取页面大小
page_width, page_height = letter
# 设置要添加的图片格式
img_format = (".jpg", ".png", ".bmp")
def pause():
    subprocess.run("pause", shell=True)
    exit()
def get_images(img_folder):
    """遍历目录,获取目录下所有的图片"""
    images = []
    for file_name in os.listdir(img_folder):
        if file_name.lower().endswith(img_format):
            images.append(os.path.join(img_folder, file_name))
    return sorted(images)
def get_image_size(img_file):
    """设置每个图片的大小"""
    with Image.open(img_file) as img:
        img_width, img_height = img.size
        if img_height > page_height * 0.95 or img_width > page_width * 0.95:
            height_scale = (page_height * 0.95) / img_height
            width_scale = (page_width * 0.95) / img_width
            scale = min(height_scale, width_scale)
            img_width *= scale
            img_height *= scale
    return img_width, img_height
def create_pdf(pdf_file, images):
    """创建 pdf 文件,并添加图片"""
    c = canvas.Canvas(pdf_file, pagesize=letter)
    total_images = len(images)
    for i, img_path in enumerate(images):
        img_width, img_height = get_image_size(img_path)
        x = (page_width - img_width) / 2
        y = (page_height - img_height) / 2
        c.drawImage(img_path, x, y, img_width, img_height)
        c.showPage()
        progress_bar(i + 1, total_images)  # 取消则无进度条
    c.save()
def create_pdf_from_path(img_folder):
    """遍历给定路径,将路径下的图片添加进pdf,并将pdf保存在路径下"""
    pdf_name = os.path.basename(img_folder) + ".pdf"
    pdf_file = os.path.join(img_folder, pdf_name)
    images = get_images(img_folder)
    if images:
        create_pdf(pdf_file, images)
        return pdf_file
    else:
        print(f"{img_folder} 下没有图片,当前支持的图片格式为{img_format}")
        pause()
def progress_bar(current, total, bar_length=60):
    """进度条"""
    filled_length = int(bar_length * current // total)
    bar = "+" * filled_length + "-" * (bar_length - filled_length)
    percent = current / total * 100
    sys.stdout.write(f"\r处理进度:|{bar}| {percent:.2f}%")
    sys.stdout.flush()
if __name__ == "__main__":
    subprocess.run("title 目录内图片转PDF", shell=True)
    if len(sys.argv)

图片, 目录

yaoshun3   

牛....动手能力强
dhwl9899   

谢谢,但愿有效实用。
dork   

感谢分 享
Zhui   

很有用,感谢
wasm2023   

太实用了,收藏了
focus009   

请问 为什么不用 Adobe Acrobat 9 Pro呢
wkdxz
OP
  


focus009 发表于 2023-9-25 17:17
请问 为什么不用 Adobe Acrobat 9 Pro呢

因为没装
jidesheng6   

可以的,膜拜楼主,我们这种小白只能说一声佩服
您需要登录后才可以回帖 登录 | 立即注册

返回顶部