0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JustPDF5[作成]をコマンドライン(python3)で使う。

Last updated at Posted at 2023-02-21

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個は出現しました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?