【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
英文地址,請注明出處:http://en.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…