フォルダ内の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リーダーなんぞを関連付けておく必要があります。