Closed kazurayam closed 2 months ago
MutoolPosterRunnerに.x(1)
と.y(1)
を指定して実行したと仮定しよう。つまりオリジナルのPDFとまったく同じ縦横サイズのPDFがもうひとつ生成されるだろう。それをセブンイレブンのネットプリントに送ったらどうなるか?下記のようなエラーが発生します。
https://github.com/kazurayam/VBACallGraph/issues/40
PDFファイルには各ファイルごとに ページサイズ という属性を持っている。そのPDFをプリンタで印刷したら横方向に何mm、縦方向に何mmの紙が必要か、という情報だ。たとえば#40の問題を起こしたPDFファイルのページサイズは
554.9 x 722.5 mm
だった。ところが具体的なプリンタ装置には大きさに制約がある。装置が印刷できる紙のサイズを超えた大きさのPDFを印刷しろと命令されたらプリンタはエラーを返すしかない。
実際、kazurayamの事務所にあるプリンタはA3とA4サイズをサポートしているが、A2サイズの紙には印刷できない。だから554.9 x 722.5 mmの大きなPDFをkazurayamが自分のプリンタでA4の紙に印刷したければ MutoolPosterRunnerに .x(3).y(3)
と指定しなければならない。
いっぽう、コンビニのネットプリントサービスではどうなんだろうか?説明にはこう書いてある。
ネットプリントでご登録頂ける用紙サイズは最大A2(420mm×594mm)
もしPDFがA2サイズより大きければ、PDFをネットプリントに送信した時点でチェックアウトされて、エラー画面が返ってくる。それが #40 が冒頭に示したエラー画面だ。
A2サイズにギリギリ納まるPDFならばネットプリントサービスに登録することはできるだろう。登録が完了した後でkazurayamが自宅近くのセブンイレブンに行ってそのPDFをプリントしようと操作したらどうなるか?きっとエラーが発生する。コンビニの店頭に置いてあるプリンタは普通の機種だからA3の紙なら扱えるけれど、A2の紙など扱えない。だから554.9 x 722.5 mmの大きなPDFをkazurayamがコンビニのプリンタでA4の紙に印刷したければ、やはり MutoolPosterRunnerに .x(3).y(3)
と指定して、1ページあたりの紙のサイズが十分小さい複数ページからなるPDFに直して、それを印刷するのでなければならない。
さて、どうしようか。
最終的にどの縦横サイズの紙に印刷したいのかをMutoolPosterRunnerに指定することがどうしても必要だ。縦横サイズを具体的に指定する記号として A3, A4, B4 などの文字を使うのが良い策だ。もちろん A3とかB4がどういうサイズを表すかは決まっている。下記のURLを参照せよ。
ページのサイズを pageSize という記号で表すことにしよう。そしてMutoolPosterRunnerの呼び出しを次のように書くことにしよう。
// modify the original PDF to a poster PDF
MutoolPosterRunner mutool =
new MutoolPosterRunner.Builder()
.original(original)
.pieceSize("A4")
.build();
するとMutoolPosterRunnerは簡単な演算をする。
originalのPDFのX方向のサイズをpieceSizeのX方向のサイズで割り算する。するとたとえば2.345とかいう数字が得られるだろう。この数字より大きな最小の整数を求める。つまり3だ。だからMutoolを実行するときには -x 3
と指定するのが適当だとわかる。Y方向についても同じような演算をしよう。すると -y 3
が適当だとわかる。
オリジナルのPDFの縦横サイズが大きく変化したとしても、この演算を適用すれば、MutoolPosterRunnerは適当な分割数を導出することができる。
あるいはA3の紙に印刷したければこう書くだろう。
// modify the original PDF to a poster PDF
MutoolPosterRunner mutool =
new MutoolPosterRunner.Builder()
.original(original)
.pieceSize("A3")
.build();
オリジナルのPDFのサイズが 554.9 x 722.5 mm だったなら、-x 2 -y 2
が導出されるだろう。だから4ページからなるposter pdfが生成されるだろう。それをコンビニのプリンタに送って印刷する事ができるだろう。もちろんA3の紙をプリンタに指図して印刷するのが素直だ。
ただし.pieceSize("A3")
と指定して作成したPDFを、プリンタを操作してA4の紙に印刷させることも可能だ。今時のプリンタは賢いので勝手に縮小して印刷してくれるだろう。A4の紙はA3より少し小さいので印刷された文字はA4対A3の比率に比例して小さくなる。つまり√2分の1になる。紙に印刷された文字が可読ならばそれでもいいだろう。
以上のように考えた。これなら実装できる。実装しよう。
done at v0.1.26
40 から派生した。v0.1.25のCallGraphAppGrandTestはMutoolPosterRunnerを実行するとき次のように書く。
ここで
.x(3)
はオリジナルのPDFの1ページをX軸方向に3つに分割せよと指図している。.y(3)
はY軸方向に3つに分割せよと指図している。1ページの縦横サイズが大きなPDFを小さな紙(A4とか)に割り付けてプリントするために、分割しなければならない。その割り方を人が考えてMutoolに指定することを要求している。でも、PlantUMLが生成するPNG画像の縦横サイズは極めて動的に変化する。pumlのコードがちょっと修正されてPNG画像がすごく縦長になったりする。適切な分割数を人が考えるのは無理がある。MutoolPosterRunnerが与えられたオリジナルのPDFの属性を調べて自動的に適切な割り方を導出し適用してほしい。