目录内图片转PDF(多图片打印助手)
最近同事经常找我帮她打印试卷,很奇葩的是,她的试卷都是*红书上下载的图片,一张张打印不好看,而且可能打印不完全,大小也不协调,所以有了这个脚本。
【需要给小孩打印图片格式的试卷时也比较实用】
---------------------------------------------------------------------------------------------------------------------------------
使用方法:
方法一:直接将脚本放到图片文件夹内,并运行脚本
方法二:命令行运行
命令行参数: 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_folder D:\result.pdf
代码:
# -*- coding: utf-8 -*-import os
import subprocess
import sysfrom PIL import Image
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvasdef 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.sizeif img_height > page_height * 0.95 or img_width > page_width * 0.95:height_scale = (page_height * 0.95) / img_heightwidth_scale = (page_width * 0.95) / img_widthscale = min(height_scale, width_scale)img_width *= scaleimg_height *= scalereturn img_width, img_heightdef 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) / 2y = (page_height - img_height) / 2c.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 = lettercreate_pdf(pdf_file, images, page_width, page_height)return pdf_fileelse: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 * 100sys.stdout.write(f"\r处理进度:|{bar}| {percent:.2f}%")sys.stdout.flush()if __name__ == "__main__":subprocess.run("title 目录内图片转PDF", shell=True)try:(*rest,) = sys.argv[1:]if not rest:img_folder = os.getcwd() # 使用当前文件夹作为 img_folderpdf_file = Noneelse:img_folder, *pdf_file = restpdf_file = pdf_file[0] if pdf_file else Noneexcept 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()
相关文章:
目录内图片转PDF(多图片打印助手)
最近同事经常找我帮她打印试卷,很奇葩的是,她的试卷都是*红书上下载的图片,一张张打印不好看,而且可能打印不完全,大小也不协调,所以有了这个脚本。 【需要给小孩打印图片格式的试卷时也比较实用】 -----…...
React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的
npm install types/包名称 例如:npm install types/jquery 学习链接...
Java 基础 面试 多线程
1.多线程 1.1 线程(Thread) 线程时一个程序内部的一条执行流程,java的main方法就是由一条默认的主线程执行 1.2 多线程 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 许多平台都离不开多…...
软考 系统架构设计师系列知识点之软件构件(1)
所属章节: 第2章. 计算机系统基础知识 第3节. 计算机软件 2.3.7 软件构件 1. 概述 构件又称为组件,是一个自包容、可复用的程序集。构建是一个程序集、或者说是一组程序的集合。这个集合可能会以各种方式体现出来,如源程序或二进制代码。这…...
RHCE8 资料整理(三)
RHCE8 资料整理 第三篇 网络相关配置第11章 网络配置11.1 网络基础知识11.2 查看网络信息11.3 图形化界面修改11.4 通过配置文件修改11.5 命令行管理11.6 主机名的设置 第12章 ssh12.1 ssh基本用法12.2 打开远程图形化界面12.3 ssh无密码登录12.4 ssh安全设置12.5 ssh限制用户1…...
C++ 使用httplib库,发送HTTP请求
简介 C 使用httplib库,发送HTTP请求 接口信息 ip地址 192.168.16.166 端口 8899 接口地址/abc/tk 请求方式GET 响应内容: { “result”: true, “message”: “”, “tk”: “yueguangsaxialexiangshuitan0ihai”, “datetimeout”: “2023-10-22 21…...
OceanBase自动安装部署演示环境demo
OceanBase自动安装部署 前提条件 官方给出硬件条件需要满足以下要求 本文操作系统为:Red Hat Enterprise Linux 8 64 位 下载链接:https://pan.baidu.com/s/1rZ39xJFhk0HdmC4wEJcxvg 提取码:c01x 下载并安装 all-in-one 安装包 执行如下…...
windows系统mysql服务启动失败
原因 电脑重启navicat连接mysql失败,在电脑-管理-服务没有mysql服务 解决方案 找到mysql的安装目录进入bin目录 执行mysqld --install 进行重新安装 提示服务安装成功 net start mysql mysql 启动成功 ...
B-tree(PostgreSQL 14 Internals翻译版)
概览 B树(作为B树访问方法实现)是一种数据结构,它使您能够通过从树的根向下查找树的叶节点中所需的元素。为了明确地标识搜索路径,必须对所有树元素进行排序。B树是为有序数据类型设计的,这些数据类型的值可以进行比较和排序。 下面的机场代…...
React环境初始化
环境初始化 学习目标: 能够独立使用React脚手架创建一个React项目 1.使用脚手架创建项目 官方文档:(https://create-react-app.bootcss.com/) - 打开命令行窗口 - 执行命令 npx create-react-app projectName 说明:…...
Hadoop3教程(二十八):(生产调优篇)NN、DN的多目录配置及磁盘间数据均衡
文章目录 (148)NN多目录配置(149)DataNode多目录配置及磁盘间数据平衡磁盘间数据均衡 参考文献 (148)NN多目录配置 NN多目录的意思是,本地目录可以配置成多个,且每个目录存放内容相…...
博客续更(五)
十一、后台模块-菜单列表 菜单指的是权限菜单,也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表,不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…...
看微功耗遥测终端机如何轻松应对野外环境挑战?
在野外,数据的实时监测和传输是至关重要的。无论是环境温度、湿度,还是水位、流量,都需要精准把控。然而,传统的监测方法往往受限于电源供应问题,而无法充分发挥其功能。这时候,一款微功耗遥测终端机&#…...
vue后台开发第一步
1、创建vue3.2的项目 2、安装前期组件 安装 安装 vue-router npm install vue-router4安装 vuex npm install vuexnext --save安装 element-plus npm install element-plus --save安装 element-plus图标 npm install element-plus/icons-vue 使用 创建router目录、目录下创…...
Vue3踩坑指南
vue.config.ts不起作用 关于项目 项目使用的还是vue-cli搭建的,底层还是webpack,没有使用新的vite搭建。 踩坑1:vue.config.ts不起作用 我本着既然是vue3 ts的项目,那么为了规范,项目中所有的js文件都得替换成ts文…...
第十七章 Java连接数据库
1.打卡“命令提示符”,用管理员身份运行 2.登录MySQL 3.创建库和表 4.使用Java命令查询数据库操作 5.右击——点击“Build Path”——选择第四个——找到包的位置——导入成功 一、创建java项目 二、连接数据库 1.注册驱动 2.获取链接 3.获取statment对象 4.…...
221 - Urban Elevations (UVA)
题目链接如下: Online Judge 首先,我的代码虽然AC了,但是是有问题的,uva的测试数据太水了所以侥幸通过而已。因为题目要求的数据是实数而非整数,我的代码是按所有数据都是整数来暴力做的……但因为刘汝佳的代码写得太…...
驱蚊“卷到”母婴,润本市值73亿
作者 | 若楠 禄存 排版 | Cathy 监制 | Yoda 出品 | 不二研究 从 " 驱蚊第二股 " 到 " 婴童护理第一股 " 润本终于敲钟了。 尽管宣称 " 婴童护理第一股 ",但实际上,润本最初是以驱蚊产品起家的。 10 月 17 日&#…...
Swingbench 压力测试(超详细)
目录 前提需要有配置好的oracle哦 1、环境准备 2、安装Swingbench 3、造数据 4、压测 前提需要有配置好的oracle哦 1、环境准备 启动监听 lsnrctl start 启动数据库 sqlplus / as sysdba startup 创建表 CREATE TABLESPACE soe DATAFILE /u01/app/oracle/oradata/or…...
【python】--python环境安装及配置
目录 一、python开发环境部署1、下载安装Miniconda2、python环境3、进入或退出python环境4、对应python环境安装工具/库5、进入pyhton环境,查看已安装的工具/库6、安装pycharm专业版7、pycharm创建项目并关联python版本环境 一、python开发环境部署 要安装一个pyth…...
开箱即用!Qwen3-Reranker-0.6B Docker镜像部署与API调用指南
开箱即用!Qwen3-Reranker-0.6B Docker镜像部署与API调用指南 1. 模型简介与核心价值 1.1 什么是Qwen3-Reranker-0.6B Qwen3-Reranker-0.6B是通义千问系列中的轻量级语义重排序模型,专为RAG(检索增强生成)场景设计。这个6亿参数…...
Hermes Agent(“爱马仕”)安装完整指南!
Hermes Agent 是一款开源自进化 AI 智能体,内置闭环学习机制,能从经验中自主创建和改进技能,支持长期记忆与跨会话对话检索。可与 企业微信、飞书、钉钉 等主流聊天平台无缝互通,支持 200 大语言模型自由切换,无厂商锁…...
从暴力枚举到高效剪枝:回溯法求解0-1背包的优化之路
1. 从暴力枚举开始:回溯法的原始形态 第一次接触0-1背包问题时,很多人会本能地想到暴力枚举。假设我们有15件物品,每件物品都有选或不选两种可能,那么总共有2^1532768种组合需要检查。这种思路虽然简单直接,但效率极其…...
三星电机完成SAP S/4HANA云ERP切换:以一体化数据平台支撑实时经营决策
三星电机近日宣布,已完成基于 SAP S/4HANA 的新一代 ERP 系统部署,并正式进入全面运营阶段。这次升级的核心意义,并不只是把旧 ERP 换成新系统,而是借此打通企业内部长期分散的数据体系,将原本分别存在于 ERP、MES 和 …...
daily_stock_analysis镜像Prompt安全机制:防止幻觉输出与过度自信结论的约束
daily_stock_analysis镜像Prompt安全机制:防止幻觉输出与过度自信结论的约束 1. 引言:当AI成为你的私人股票分析师 想象一下,你有一个不知疲倦、知识渊博的股票分析师,随时待命。你只需要输入一个股票代码,无论是苹果…...
Spring with AI (): 搜索扩展——向量数据库与RAG(下)馗
. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...
CustomStepper:28BYJ-48裸机步进控制库深度解析
1. CustomStepper 库深度解析:面向嵌入式工程师的 28BYJ-48 精密步进控制实践指南1.1 库定位与工程价值CustomStepper 是一个专为资源受限嵌入式平台设计的轻量级裸机(bare-metal)步进电机控制库,核心目标是为 28BYJ-48 型五相四线…...
Raspberry Pi Imager终极指南:告别复杂操作,轻松打造树莓派系统
Raspberry Pi Imager终极指南:告别复杂操作,轻松打造树莓派系统 【免费下载链接】rpi-imager The home of Raspberry Pi Imager, a user-friendly tool for creating bootable media for Raspberry Pi devices. 项目地址: https://gitcode.com/gh_mirr…...
别再死记命令了!通过一个Packet Tracer静态路由实验,彻底搞懂‘下一跳’和‘出接口’的区别
别再死记命令了!通过Packet Tracer实验彻底搞懂静态路由的“下一跳”与“出接口” 刚接触网络配置时,很多人会陷入一个误区:把静态路由的配置命令当作魔法咒语来记忆。直到某天,当网络拓扑发生变化,或者需要在不同场景…...
**DeFi组合新玩法:基于Solidity的智能合约自动化收益聚合策略实现**在去中心化金融(D
DeFi组合新玩法:基于Solidity的智能合约自动化收益聚合策略实现 在去中心化金融(DeFi)生态中,用户常常面临一个问题:如何高效地管理多种资产、自动捕捉跨平台套利机会并最大化收益率?传统的手动操作不仅效率…...
