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

自作のJavaプログラムからMuPDFを実行する方法を解明せよ #29

Closed kazurayam closed 1 month ago

kazurayam commented 1 month ago

【MuPDF】 MacでPDFをポスター(分割)印刷する方法 をみた。有望だと思った。これを使いこなしたい。

kazurayam commented 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画像は特徴がある。

  1. 概してサイズが大きい。test_writeDiagram_Options_KAZURAYAM.puから生成された画像はおそらくA1サイズの紙にプリントしてようやく文字が読める。A1はA4の紙8枚分の広さだ。それを8分の1に縮小してA4サイズの紙に印刷したら字が小さく潰れて読めない。
  2. A4の紙の縦横比は1:√2と決まっている。ところがPlant UMLが作り出すPNG画像の縦横比は決まっていない。図の内容しだいでものすごく横長になったり縦長になったりする。与えられたPNG画像の大きさと縦横比を調べ、それを適切に分割して、A4とかA3の紙に上手に収まるようにしたい。その計測と分割を人間が頭で考えて答えを得るのはかなり難しい。1回だけならまあいいが、何度も繰り返したくない。ソフトウェアにやらせたい。

さてMuPDFを使えばPDFを分割できる。-xオプションを指定してタテ方向にn分割しろ、-yオプションを指定してヨコ方向にm分割しろ、というふうに指示することができる。

さて、ここで問題です。

x軸方向にXピクセル、y軸方向にYピクセルのサイズを持ったPNG画像(PDFファイルをPNG画像の等価物とみなしてもいいだろう)をA4サイズの紙で印刷したい時、-xオプションと-yオプションにどういう値を指定すると最もナイスな印刷物ができるだろうか?「最もナイスな」とは使う紙の枚数が最も少なくて済む、という意味と考えていいだろう。

このロジックを実装せよ。いわゆる線形計画法の典型的な問題ですね。

このロジックを適用しつつPNG画像を複数ページからなるPDFに変換するソフトウエアを実装せよ。A4の紙とA3の紙と、二つをサポートすべき。紙を縦長に置く(portrait)か横長に置くか(horizontal)も可変要素となる。ソフトウェアに自動的に決定させるのをデフォルトとしつつ、人がportraitとhorizontalとどちらかを指定することもサポートすべきか。

kazurayam commented 1 month ago

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.

31 の成果として、一つの大きなPNG画像を包んだPDFファイルができた。そのPDFをmutool 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、速い。

poster.pdf

わたしがコマンドラインでやった手作業のこの操作をJavaプログラムからできるようにすればいい。そのためにはSubprocessjプロジェクトが使える。

kazurayam commented 1 month ago

done at v0.1.13