逍遥我逍遥 发表于 2023-10-4 10:29:17

目录内图片转PDF多图片打印助手Python源码

转成exe运行的话,速度太慢,且exe体积较大,如有需要,请自行转换。


当需要给小孩打印图片格式的试卷时比较实用


使用方法:


方法一:直接将脚本放到图片文件夹内,并运行脚本

方法二:命令行运行

命令行参数: python convert_images_to_pdf.py [<图片文件夹路径>] [<PDF保存路径>]


> 图片文件夹路径:可选,默认为:python脚本所在目录


> PDF保存路径:可选,默认路径为 <图片文件夹路径> ,文件名为:<图片文件夹名>.PDF。需先指定<图片文件夹路径>后,再指定<PDF保存路径>




命令行示例:


假设脚本名为:convert_images_to_pdf.py


只指定图片目录
> python convert_images_to_pdf.py C:\img_folder


同时指定图片目录和pdf路径
> python convert_images_to_pdf.py C:\img_folderD:\result.pdf



# -*- coding: utf-8 -*-

import os
import subprocess
import sys

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


def pause_exit():
    subprocess.run("pause", shell=True)
    exit()


def get_images(img_folder):
    """遍历目录,获取目录下所有的图片"""
    img_format = (".jpg", ".png", ".bmp")
    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, page_width, page_height):
    """设置每个图片的大小"""
    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, page_width, page_height):
    """创建 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, page_width, page_height)
      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_file=None):
    """遍历给定路径,将路径下的图片添加进pdf,并将pdf保存在指定路径下"""
    images = get_images(img_folder)
    if images:
      if not pdf_file:
            pdf_name = os.path.basename(img_folder) + ".pdf"
            pdf_file = os.path.join(img_folder, pdf_name)
      page_width, page_height = letter
      create_pdf(pdf_file, images, page_width, page_height)
      return pdf_file
    else:
      print(f"{img_folder} 下没有图片,当前支持的图片格式为 jpg、png 和 bmp")
      pause_exit()


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)

    try:
      (*rest,) = sys.argv
      if not rest:
            img_folder = os.getcwd()# 使用当前文件夹作为 img_folder
            pdf_file = None
      else:
            img_folder, *pdf_file = rest
            pdf_file = pdf_file if pdf_file else None
    except ValueError:
      print("请提供图片文件夹路径作为参数")
      pause_exit()

    if not os.path.exists(img_folder):
      print(f"{img_folder} 路径不存在!")
      pause_exit()
    elif not os.path.isdir(img_folder):
      print(f"{img_folder} 不是一个文件夹!")
      pause_exit()
    else:
      pdf_file = create_pdf_from_path(img_folder, pdf_file)

      if pdf_file:
            subprocess.run(["explorer", pdf_file])
      else:
            pause_exit()


呵呵哒 发表于 2023-10-5 11:55:49

我要下载试试,我要下载试试...

汨黎 发表于 2023-10-6 13:22:21

66666666666666666666

lllll557 发表于 2023-10-7 14:48:53

00.000...000

sdf 发表于 2023-10-8 16:15:25

非常不错,感谢分享!

我去前面探探路 发表于 2023-10-9 17:41:56

感觉不错

wwww 发表于 2023-10-9 21:05:10

6666666666

sxy19931021 发表于 2023-10-10 00:28:24

豆腐干士大夫

wwww 发表于 2023-10-10 03:51:37

谢谢楼主,,,收藏ing

啦啦啦啦啦啦 发表于 2023-10-10 07:14:51

不错不错 支持下
页: [1] 2 3 4 5 6
查看完整版本: 目录内图片转PDF多图片打印助手Python源码