文章目錄
- 0 前言
- 1 主要功能的實現
- 2 拖拽運行的實現
- 3 檢查細節【未成功實現】
- 4 總結
0 前言
不知道大家是否遇到過這種情況,提交材料時需要將多個圖片材料整合到一個PDF中上傳。這個時候我們需要找一個工具,其作用為接收我們給它的若干張圖片,并將其按照我們需要的順序(有時可能也沒要求)生成一個PDF文件。對于我本人,之前只能上網找個線上的網站進行整合,不過這種方式需要將自己的圖片數據上傳,不是很安全,并且上傳、處理和下載過程都需要聯網,很不方便。于是,今天興起想用Python寫一個腳本工具。
對該工具的期望功能如下:
- 能接收圖片輸入,并輸出合并PDF;
- 操作簡單,只需將多張圖片選中,拖拽到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
。接下來打開
計算機\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\" %*"
-
上述方法仍無效,繼續嘗試:
右鍵
py文件,選擇打開方式
,選擇其他應用
,如下圖所示,選擇Python
始終作為.py文件的打開方式。我通過這一步修改就可以成功實現拖拽運行了。
4 總結
- 該工具運行起來很快,也比較方便。使用時,如果需要圖片在PDF中按順序放置,則可以將圖片重命名,在原名稱前加一個數字進行排序,當然也可以在原腳本代碼中添加針對輸入圖片路徑的排序邏輯。如果對順序沒有要求,那就不需要注意這些,直接將待整合的所有圖片全部選中,拖拽進py腳本文件,松手即可運行,整合的PDF文件將在腳本的同目錄下輸出生成。
- 后期如果有必要,也可以使用 PyInstaller 把腳本打包成exe,這樣小工具運行就可以不依賴于虛擬環境了。