kazurayam / vba-callgraph

Generating a Call Graph for Excel VBA workbooks
https://kazurayam.github.io/VBACallGraph/
Apache License 2.0
0 stars 0 forks source link

MutoolPosterRunnerの改善: -xと-yの値をMutoolPosterRunnerが自動的に設定しよう, pieceSize("A4") #46

Closed kazurayam closed 2 months ago

kazurayam commented 2 months ago

40 から派生した。v0.1.25のCallGraphAppGrandTestはMutoolPosterRunnerを実行するとき次のように書く。

        // modify the original PDF to a poster PDF
        MutoolPosterRunner mutool =
                new MutoolPosterRunner.Builder()
                        .x(3)
                        .y(3)
                        .original(original)
                        .build();

ここで .x(3) はオリジナルのPDFの1ページをX軸方向に3つに分割せよと指図している。.y(3)はY軸方向に3つに分割せよと指図している。1ページの縦横サイズが大きなPDFを小さな紙(A4とか)に割り付けてプリントするために、分割しなければならない。その割り方を人が考えてMutoolに指定することを要求している。

でも、PlantUMLが生成するPNG画像の縦横サイズは極めて動的に変化する。pumlのコードがちょっと修正されてPNG画像がすごく縦長になったりする。適切な分割数を人が考えるのは無理がある。MutoolPosterRunnerが与えられたオリジナルのPDFの属性を調べて自動的に適切な割り方を導出し適用してほしい。

kazurayam commented 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に直して、それを印刷するのでなければならない。

kazurayam commented 2 months ago

さて、どうしようか。

最終的にどの縦横サイズの紙に印刷したいのかを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になる。紙に印刷された文字が可読ならばそれでもいいだろう。

以上のように考えた。これなら実装できる。実装しよう。

kazurayam commented 2 months ago

done at v0.1.26