【Python小工具】图片转PDF

文章目录

    • 0 前言
    • 1 主要功能的实现
    • 2 拖拽运行的实现
    • 3 检查细节【未成功实现】
    • 4 总结

0 前言

不知道大家是否遇到过这种情况,提交材料时需要将多个图片材料整合到一个PDF中上传。这个时候我们需要找一个工具,其作用为接收我们给它的若干张图片,并将其按照我们需要的顺序(有时可能也没要求)生成一个PDF文件。对于我本人,之前只能上网找个线上的网站进行整合,不过这种方式需要将自己的图片数据上传,不是很安全,并且上传、处理和下载过程都需要联网,很不方便。于是,今天兴起想用Python写一个脚本工具。

对该工具的期望功能如下:

  1. 能接收图片输入,并输出合并PDF;
  2. 操作简单,只需将多张图片选中,拖拽到py脚本即可运行。

1 主要功能的实现

就一个脚本文件,完整代码如下:

import os
import pymupdf
import argparsedef images_to_pdf(image_paths, output_path):"""使用 PyMuPDF 将多张图片合并为一个PDF文件:param image_paths: 图片路径列表:param output_path: 输出的PDF路径"""doc = pymupdf.open()  # 创建一个新的PDF文档# 按文件名排序图片sorted_images = sorted(image_paths)for img_path in sorted_images:try:img = pymupdf.open(img_path)  # open pic as documentrect = img[0].rect  # pic dimensionpdfbytes = img.convert_to_pdf()  # make a PDF streamimg.close()  # no longer neededimgPDF = pymupdf.open("pdf", pdfbytes)  # open stream as PDFpage = doc.new_page(width=rect.width,  # new page with ...height=rect.height)  # pic dimensionpage.show_pdf_page(rect, imgPDF, 0)  # image fills the pageprint(f"已添加图片: {os.path.basename(img_path)}")except Exception as e:print(f"处理图片 {img_path} 时出错: {e}")continueif len(doc) == 0:print("没有有效的图片可以转换为PDF")return# 保存PDF文件try:doc.save(output_path)print(f"成功生成PDF文件: {output_path}")except Exception as e:print(f"保存PDF失败: {e}")finally:doc.close()def main():# 设置命令行参数parser = argparse.ArgumentParser(description='将图片合并为PDF')parser.add_argument('images', nargs='*', help='要合并的图片文件')parser.add_argument('-o', '--output', default='output.pdf', help='输出的PDF文件名')args = parser.parse_args()# 如果没有拖拽文件,提示用法if not args.images:print("请将图片文件拖拽到本脚本上,或使用命令行参数指定图片文件")print("用法: python images_to_pdf.py 图片1.jpg 图片2.png [...] [-o 输出.pdf]")input("按回车键退出...")return# 检查输出文件扩展名if not args.output.lower().endswith('.pdf'):args.output += '.pdf'# 转换图片为PDFpy_dir = os.path.dirname(__file__)  # 当前脚本所在的目录images_to_pdf(args.images, os.path.join(py_dir, args.output))# 保持窗口打开以便查看结果input("按任意键关闭窗口...")if __name__ == "__main__":main()

依赖PyMuPDF库实现,关键代码部分参考:PyMuPDF 文档。

新建一个txt文件,将上面的代码复制进去,保存,将其重命名为images_to_pdf.py(检查重命名后文件类型是否带PY,别是txt文本文档就行)。

2 拖拽运行的实现

新建一个txt文件,将下面代码复制进去,保存,重命名为pyfile_droppable.reg

Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Python.File\shellex\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"[HKEY_CLASSES_ROOT\py_auto_file\shellex\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"[HKEY_CLASSES_ROOT\Python.File\Shell\open\command]
@="\"H:\\anaconda3\\envs\\opencv\\python.exe\" \"%L\" %*"[HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command]
@="\"H:\\anaconda3\\envs\\opencv\\python.exe\" \"%L\" %*"

其中\"H:\\anaconda3\\envs\\opencv\\python.exe\"为需要调用执行的Python解释器,这里我是指定了安装PyMuPDF库的虚拟环境中的Python解释器。需自行修改,注意\的转义作用。

双击该文件运行,完成注册表的修改。原理参见:文件拖动到 Python 脚本上执行。

3 检查细节【未成功实现】

  • 若完成步骤1、2后,还不能拖拽运行,可尝试:

    • 重启资源管理器;
    • 关机重启。
  • 上述方法仍无效,继续尝试:

    打开注册表,查看计算机\HKEY_CLASSES_ROOT\.py的值,我这里是py_auto_file

    image-20250804162632227

    接下来打开计算机\HKEY_CLASSES_ROOT\py_auto_file,确保该目录下的项已安装步骤2正确修改。

    [HKEY_CLASSES_ROOT\py_auto_file\shellex\DropHandler]
    @="{60254CA5-953B-11CF-8C96-00AA00B8708C}"[HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command]
    @="\"H:\\anaconda3\\envs\\opencv\\python.exe\" \"%L\" %*"
    

    image-20250804163809641

  • 上述方法仍无效,继续尝试:

    右键py文件,选择打开方式选择其他应用,如下图所示,选择Python始终作为.py文件的打开方式。

    image-20250804164411886

    我通过这一步修改就可以成功实现拖拽运行了。

4 总结

  • 该工具运行起来很快,也比较方便。使用时,如果需要图片在PDF中按顺序放置,则可以将图片重命名,在原名称前加一个数字进行排序,当然也可以在原脚本代码中添加针对输入图片路径的排序逻辑。如果对顺序没有要求,那就不需要注意这些,直接将待整合的所有图片全部选中,拖拽进py脚本文件,松手即可运行,整合的PDF文件将在脚本的同目录下输出生成。
  • 后期如果有必要,也可以使用 PyInstaller 把脚本打包成exe,这样小工具运行就可以不依赖于虚拟环境了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94353.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零售消费行业研究系列报告

消费者洞察报告:即时零售美妆用户消费行为跃迁 食品饮料行业深度:新消费研究之三:即时零售应需而生,酒类品牌或迎新机遇 2025年上半年连锁零售门店发展蓝皮书 商贸零售行业新消费细分赛道投资机会梳理:新消费势能向…

Uniapp 验证 HTTPS 协议

Uniapp 中 验证 HTTPS协议的是示例代码<template><view class"content"><view style"margin-top: 20px;"><text>sslVerify : {{text}}</text></view><view><button click"testSslVerify">sslVe…

可视化图解算法57:字符串的排列

牛客网 面试笔试 TOP101 | LeetCode 3437. 全排列III 1. 题目 描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BA…

Go语言常量

目录 前言&#xff1a; 1、const声明常量 2、一次声明多个常量 前言&#xff1a; 这次来学习一下Go语言中的常量&#xff0c;在上一期中我学习了Go语言中的变量&#xff0c;如果有兴趣可以看看我往期的文章&#xff0c;或者点击Go语言声明变量。 相对于变量&#xff0c;常量的…

SelectDB:新一代实时数仓的核心引擎与应用实战

> 数据价值随时间流逝而衰减,而SelectDB让企业在数据洪流中抓住了每一秒的价值 在数字化转型浪潮中,企业数据呈现**爆发式增长**,传统数据仓库在实时性、查询效率和成本控制方面遭遇严峻挑战。中通快递的案例极具代表性——其原有架构处理分钟级查询时,资源消耗巨大,…

华为OD机考2025C卷 - 分配土地 (Java Python JS C++ C )

题目描述 从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。 某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积? 输入描述 第一行输入 m 和 n, m 代…

NetBSD notes

文章目录the introduce to NetBSDreferencesthe introduce to NetBSD NetBSD is a Unix-like Open Source operating system, which can run in many hardware platforms , and is advantageous to production and research.> boot hd0a:netbsd is used for booting NetBSD…

【数据迁移】Windows11 下将 Ubuntu 从 C 盘迁移到 D 盘

由于个人情况存在差异&#xff0c;请在参考本文进行数据迁移前后多方比对确认&#xff0c;确保无误后再谨慎操作&#xff01; 【2025-08-03补充】运行过程中发现实际上 docker 的迁移工作可能更为复杂&#xff01;强烈不推荐本文的 docker 迁移方法&#xff08;本文已翻车&…

Java面试(常考基础知识点)总结

1. 面向对象三大特性相关 1.1 三大特性 封装&#xff1a;对抽象的事物抽象化成一个对象&#xff0c;并对其对象的属性私有化&#xff0c;同时提供一些能被外界访问属性的方法&#xff1b;继承&#xff1a;子类扩展新的数据域或功能&#xff0c;并复用父类的属性与功能&#x…

[Shell编程] 零基础入门 Shell 编程:从概念到第一个脚本

目录 一、什么是 Shell&#xff1f;—— 连接用户与系统的 "桥梁" 二、常见的 Shell 类型 —— 不同系统的 "操作面板" 三、Shell 能做什么&#xff1f;—— 不止于 "输入命令" 1️⃣命令行操作&#xff1a;这是最基础的功能。通过ls&#x…

【数据结构】排序(sort) -- 插入排序

目录 一、插入排序 二、直接插入排序&#xff08;straight insertion sort&#xff09; 1. 思路介绍 2. 代码实现 3. 特性总结 三、希尔排序&#xff08;Shell sort&#xff09; 1. 思路介绍 2. 代码实现 3. 特性总结 四、总结 一、插入排序 常见的排序算法有&…

水面垃圾清扫船cad【6张】三维图+设计说明书

海洋吸尘器结构设计 摘 要 近年来&#xff0c;随着经济的快速发展&#xff0c;海洋产业及海上活动的增加&#xff0c;导致海洋漂浮垃圾越来越多&#xff0c;对沿岸的居民和海洋的生物的生命安全造成了很大的威胁&#xff0c;严重破坏海洋生态平衡。针对海洋垃圾污染这一主要问…

03-List列表数据类型

1.特点&#xff1a; 原属是字符串类型 列表头尾增删块&#xff0c;中间慢&#xff0c;增删元素是常态 元素可重复 最多包含2^32-1个元素 索引通python列表2.常用命令 ------增------ 1.从列表头部压入数据LPUSH key value1 value22.从列表尾部压入数据RPUSH key value1 value23…

防火墙认证用户部署

文章目录1、配置vlan2、防火墙配置&#xff08;1&#xff09;配置安全区域&#xff08;2&#xff09;接口加入安全区域(3)fw配置DHCP(4)地址组&#xff08;5&#xff09;管理员(6)用户认证1、配置vlan vlan batch 10 20 [Huawei-GigabitEthernet0/0/2]port link-type access …

Vue.js之监听器

watch侦听器&#xff1a;作用:监视数据变化&#xff0c;执行一些 业务逻辑 或 异步操作。 语法:简单写法→简单类型数据&#xff0c;直接监视完整写法 → 添加额外配置项 (1)deep:true 对复杂类型深度监视(2)immediate:true 初始化立刻执行一次handler方法//1.简单写法 data: {…

25电赛e题杂乱环境稳定识别矩形框(附源码)

​ 识别并跟踪矩形目标 识别视频中符合矩形轮廓的目标区域&#xff0c;并标记中心点位置。 实现思路 **图像预处理&#xff1a;灰度 二值化**闭运算消除孔洞二值化处理查找并筛选矩形轮廓解算中心点目标筛选结果绘制 环境 使用 OpenCV 和 python&#xff1a; 图像预处理…

【前端安全】聊聊 HTML 闭合优先级和浏览器解析顺序

【前端安全】聊聊浏览器解析顺序和 HTML 闭合优先级 最近在研究 XSS 的时候&#xff0c;发现一个特别容易被忽略的问题 —— 浏览器到底是怎么解析 HTML 的&#xff1f;为什么有些 payload 成功了&#xff0c;有些却怎么试都不行&#xff1f;其实这跟标签的闭合优先级还有解析顺…

PHP-分支语句、while循环、for循环

分支语句 无论在何种编程语言中&#xff0c;流程控制都是很重要的内容。由于 PHP 的大部分语法都继承了C语言的特点&#xff0c; 因此在流程控制方面&#xff0c;PHP 有着和C语言类似的流程控制。 if else 语句是流程控制中根据条件判断执行的一种。该语句执行时先对条件进行判…

并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用

在并发编程中&#xff0c;除了CountDownLatch和Semaphore&#xff0c;CyclicBarrier和Phaser也是实现多线程协作的重要工具。它们在处理多阶段任务同步、动态调整参与线程等场景中展现出独特价值。本文作为并发工具类系列的第二篇&#xff0c;将深入解析CyclicBarrier和Phaser的…

机器人焊接节气装置

在摩托车制造过程中&#xff0c;精密部件的焊接质量直接影响整车的安全性和操控性能。以发动机缸体焊接为例&#xff0c;传统手工焊接容易出现焊缝不均匀的问题&#xff0c;而采用六轴弧焊机器人后&#xff0c;焊接精度能控制在0.1毫米以内。日本川崎重工的生产数据显示&#x…