JustPDF5[作成]をコマンドライン(python)で使う。20230221(YYYYMMDD)
環境 windows11pro 64bit / python3.9(anaconda) /JustSystem JustPDF5
結論
pythonのsubprocess.runの引数は、{}.format()を使うと成功
pythonでJustPdf5CmdCreator.exe実行すると、CMD制限文字数が8,191文字ではなく32,766文字にみなせると推定。
pythonでJustPdf5CmdCreator.exe実行すると、1アクション当たりのJustPDFの制限である500ページを突破し、2900ページのpdfを作成出来た。
1.JustPDF5の仕様
JustPDF5を標準でインストールすると、"C:\Program Files (x86)\JustSystems\JustPdf5\Creator\JustPdf5CmdCreator.exe"
として、「JustPdf5CmdCreator.exe」がインストールされます。
これが、コマンドライン入力を担います。コマンドライン入力に関し、マニュアルに記載はなく、ヘルプに出てくるだけです。
当該ヘルプに、複数のpng-filesを1つのPDFにする場合は
JustPdf5CmdCreator.exe◇/combine◇"ファイルパス1"◇"ファイルパス2"◇・・・◇/out◇"出力先フォルダー"
とコマンドを実行するとなっています。
◇は、半角スペース。◇と""とPath区切り記号(/)を、厳格に守ることでコマンドライン入力を受け付けます。
これ重要、◇と""とPath区切り記号(/)を、厳格に守る。
combineは、PDF形式以外の、たとえばpng_fileをPDF形式にしてから、結合させるという便利なものです。
2.pythonでJustPdf5CmdCreator.exeを実行する考え方
Pythonのsubprocess.runを使います。
ここで、問題なのは、結合対象の対象とするFileのFile-Pathを全てコマンドラインの中に埋め込むということになります。
つまり、subprocess.runの引数に文字列変数を入れ込むこととなります。
具体的には
subprocess.run(r'JustPdf5CmdCreator.exe◇/combine◇"ファイルパス1"◇"ファイルパス2"◇・・・◇/out◇"出力先フォルダー"')
となり、「"ファイルパス1"◇"ファイルパス2"◇・・・◇」の部分が文字列として入れ込む必要があります。
いろいろと。試行錯誤した結果、
画像fileがリストとして "a001.png" "a002.png"...."a500.png"とある場合
リストをjoin関数で、1文に繋げる。それを{}.format()で入れ込むことで解決しました。
3.pythonでJustPdf5CmdCreator.exeを実行した例
ファイル構成
Sドライブで実施
S:/03_PDFs_by_justPDF5 #作成したPDF-fileを保存するフォルダ
S:/04_main_work/test# test用のpngファイルを保存しているフォルダ。*連番.pngなります。
JustPdf5CmdCreator.exeは、windows11の詳細設定でPathを記憶させておきます。
`
'''
creat PNG2PDF by JustPDF5
'''
import os
import subprocess
os.chdir('S:/04_main_work/test') #JustPdf5CmdCreator.exeに渡すpng-filesにPathを記載しなくてすむように。
pngBasename=os.listdir('S:/04_main_work/test/') #png-filesのbasenameのみを取得します。
spng = '" "'.join(pngBasename) #全てのpng-filesの名前を"◇"を区切り文字として、連結。◇は、半角スペース。
spng = '"'+spng+'"' #spngの前後に"を追加
subprocess.run(r'JustPdf5CmdCreator.exe /combine {} /out "S:\03_PDFs_by_justPDF5" /imagecomp 1'.format(spng))
`
{}.format()を使うことで、コマンドラインに埋め込むことができました。
最初の「r'」は、文字列をそのまま、CMDに渡す設定のようです。だから、{}もそのまま、文字として、持っていかれる心配もありました。最後の/imagecomp 1はpdf圧縮の程度で、数字の1は、JustPDF本体(GUI版)で設定します。
ここで、重要なのはパスの切り方です。特に、pythonのドライブは/で区切りますが、windowsは\です。
3.pythonでJustPdf5CmdCreator.exeを実行した場合の制限事項
JustPDFの仕様は500Filesまでの結合です。501Fileあるとすると、250filesと251files等に分ける必要があります。実際、エラーが出ます。JustPDFのコマンドラインのヘルプでも「指定できるパスは1度に500個までです。」と明記されています。
これって、CMDの文字数制限8191文字に関係してるのかなと思っていました。
ところが、pythonでJustPdf5CmdCreator.exeを実行した場合の文字数制限は32,766文字になるようです。pythonとの組み合わせの場合。
試験として200pixel*100pixelのpng-file(ファイル名は4桁連番、たとえば1234.pngで8文字。区切り文字" "を加えて11文字。)を結合させると
pdfで2900ページ、CMDに渡したと考えられるword数は31977で成功しました。
ちなみに、3000ページでは「WindowsEroor206_ファイル名が長すぎる」が出ました。
ちなみに、Windows Power automate DesktopでCMDスクリプトとしてJustPdf5CmdCreator.exeを実行すると、制限500個は出現しました。