Closed kazurayam closed 1 month ago
Excelのxlsmファイル群からクラス図のdiagramファイル(.puとか.pumlとかいう名前のテキストファイル)を生成することができたとしよう。例えばこんなふうにして。 例
test_writeDiagram_Options_KAZURAYAM.pu.txt
このdiagramファイルをIntelliJやVSCodeで開いて、PlantUMLプラグインを利用して、プレビュー画像を生成して見ることができる。そして画像をローカルディスクにPNGファイルとして出力することもできる。この操作は手作業でちまちまやる。ビルドプロセスの一部にしなきゃならないほどのことではない。手作業でOKだ。
さて、PNGファイルができたところで私は満足するか?ーーー満足しませんね。何のためにPNGファイルを作るかといえば、
PNG画像をプリンタに送って紙に印刷したい。
Excelワークブック群のモジュールやプロシジャのlinkage図をなぜ紙に印刷したいと思うか?
赤鉛筆を使って紙に書き込みしたいんです。
「モジュールの名前やメソッドの名前にスペルミスがあったから変更しよう」と赤鉛筆で紙に印を付けたい。
「モジュール間に引かれた有向グラフが混んでいるならそれらモジュールは重要度が高いことを示唆する、しかし有向グラフが疎ならばそのモジュールはゴミである可能性が高い、削除した方がいいのではないか?しかしVBAコードをちゃんと検証してからじゃないと確かなことはいえない、後でここをちゃんと調べよう」と赤鉛筆で紙に印を付けたい。
こういうボンヤリした印をつける作業は紙と赤鉛筆でやるのが一番やりやすい。コンピュータの上ではやりにくい。
PlantUMLが作り出すPNG画像は特徴がある。
さてMuPDFを使えばPDFを分割できる。-xオプションを指定してタテ方向にn分割しろ、-yオプションを指定してヨコ方向にm分割しろ、というふうに指示することができる。
さて、ここで問題です。
x軸方向にXピクセル、y軸方向にYピクセルのサイズを持ったPNG画像(PDFファイルをPNG画像の等価物とみなしてもいいだろう)をA4サイズの紙で印刷したい時、-xオプションと-yオプションにどういう値を指定すると最もナイスな印刷物ができるだろうか?「最もナイスな」とは使う紙の枚数が最も少なくて済む、という意味と考えていいだろう。
このロジックを実装せよ。いわゆる線形計画法の典型的な問題ですね。
このロジックを適用しつつPNG画像を複数ページからなるPDFに変換するソフトウエアを実装せよ。A4の紙とA3の紙と、二つをサポートすべき。紙を縦長に置く(portrait)か横長に置くか(horizontal)も可変要素となる。ソフトウェアに自動的に決定させるのをデフォルトとしつつ、人がportraitとhorizontalとどちらかを指定することもサポートすべきか。
HomebrewでMuPDFをmacにインストールした。コマンドラインでmutoolが使える状態になった。mutool posterコマンドが使える。
The poster command reads the input PDF file and for each page chops it up into x by y pieces. Each piece becomes its own page in the output PDF file. This makes it possible for each page to be printed upscaled and can then be merged into a large poster.
$ cd ~/github/VBAProcedureUsageAnalyzer/lib/build/tmp/testOutput/com.kazurayam.vba.PDFFromImageGeneratorTest (issue29 *)
$ ls
FindUsageAppGrandTest.testWriteDiagram_Options_KAZURAYAM.pdf
$ mutool poster -x 2 -y 2 FindUsageAppGrandTest.testWriteDiagram_Options_KAZURAYAM.pdf poster.pdf
$ ls
FindUsageAppGrandTest.testWriteDiagram_Options_KAZURAYAM.pdf
poster.pdf
poster.pdfファイルができた。処理は一瞬だった。mutool、速い。
わたしがコマンドラインでやった手作業のこの操作をJavaプログラムからできるようにすればいい。そのためにはSubprocessjプロジェクトが使える。
done at v0.1.13
【MuPDF】 MacでPDFをポスター(分割)印刷する方法 をみた。有望だと思った。これを使いこなしたい。