フォルダ内のPDFを印刷する

フォルダの中にあるPDFファイルを印刷したい、ということがあると思いますが、そんな時に使えそうなプログラムをPythonで書いてみました。

印刷ってどうやるんだろうか、と思って検索してみると、Windowsではwin32apiというのを使うとよろしい、ということが分かったので、早速使ってみた。

プログラムとしては、以下の感じですな。

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

# フォルダ内のpdfを印刷する
# なんらかの順番で印刷できるとうれしい

# GUIで行うこと
#  印刷するフォルダを指定
#  印刷ボタンクリックで作業開始
#  終了のポップアップ
# 具体的な作業内容
#  指定されたフォルダ内のPDFファイルを探す
#  リストに格納する
#  順番を整える
#  その順番でPrintに渡す
#  順番を守るために1つ渡してから2秒待ってみる


import PySimpleGUI as sg
import win32api
import time
import glob

# Windows Layout
layout = [  [sg.T('印刷したいフォルダを選択')],
           [sg.In(key='-IN-'),sg.FolderBrowse(target='-IN-',key='folder')],
           [sg.T('進行状況'),sg.ProgressBar(100, orientation='h', size=(20, 20), key='progressbar'),sg.T('   %',key='fper')],
           [sg.Button('印刷',key='go')]  ]

# Make Windows Title=フォルダ内のPDF印刷
window = sg.Window('フォルダ内のPDF印刷', layout) 
# プログレスバーとテキストを書き換えるためにオブジェクトを設定する
pb = window['progressbar']   
fp = window['fper']   

# Main loop
while True:
   event, values = window.read()
   
   # これがないと無限ループになります
   # プログラムの最後にwindow.close()を書いて終了にする
   if event == sg.WIN_CLOSED: #ウィンドウのXボタンを押したときの処理
       break

   # 印刷ボタンが押された場合
   if event == 'go':
       # 作業フォルダとグループフォルダを定義
       work_folder = values['folder']
       # pdfファイルをリストにする
       all_file = glob.glob(work_folder + '/*.pdf')
       # 名前でソートする
       all_file.sort()
       # 全ファイル数
       afnum = len(all_file)
       # 終了したファイル数
       ffnum = 0
       # それぞれのファイルを印刷
       for file in all_file:
               # Windowsの機能を使って印刷
               win32api.ShellExecute(0,"print",file,None,".",0)
               # 順番を守るように2.5秒間隔でキューを送ってみる
               time.sleep(2.5)
               # 終了ファイルを1増やす
               ffnum += 1
               # プログレスバーとテキストに%を表してみる)
               pb.UpdateBar(ffnum / afnum * 100)
               fp.Update(value=str(int(ffnum / afnum * 100))+'%')
       # 終了のポップアップを表示して終了
       sg.popup('印刷終了',title='完了')

window.close()

いろんな形式のファイルを選べるように、リストを作るとかもありますが、今のところは、pdfだけで我慢しておく。

(22.07.07追記)
プログラムでやってることは、Windowsに対して「このファイルを印刷してね」という情報を渡しているだけです。
イメージとしては、ファイル右クリックメニューの一つを選んでる、みたいなもんだと思います。
ですので、pdfファイルには、edgeではなくAcrobatリーダーなんぞを関連付けておく必要があります。