CubePDFのソースコード探訪 自動PDF変換機能を簡易実装

先日、CubePDFのダイアログを表示させずにPDFに変換する方法として、デスクトップに「SkipUI.txt」ファイルが存在すればダイアログをスキップしてPDFに変換するという処理を書いた。

だがそれでは実質的に使い道は少ないので、実際の仕事で役立ちそうな方法を実装してみた。
内容としては、デスクトップに「SkipUI」ディレクトリがあればダイアログを表示しないという実装。

これだけでは先のファイルの仕様と何も変わらないが、SkipUIフォルダがあれば、その中にファイルを出力し、かつ、上書きしないよう5桁ゼロ埋めでファイル名[^\d{5}-〇〇]を付け、ポストプロセスの設定がどうあれ、「何もしない」でファイルやフォルダが自動的に開かないようにしている。

これでPDFを量産した後に、CubePDF Pagesなんかで一括で結合すると、ばらばらに印刷したファイルを結合することが出来る。私以外にはこれが何の役に立つかわからないかと思うが、私はこの機能を欲している。

私が業務で利用しているシステムは、日付、カテゴリ単位で印刷キューを発行するため、CubePDFを素で利用すると、1日分で何回かダイアログが表示されてしまう。360日もあれば、1000回以上もダイアログが表示されるという謎仕様で導入されている。

なので、今回修正したシステムを利用すると、フォルダ内に連番でファイルが作成され、それを後から結合すると半自動で1000日分だろうと作成が可能になる。その理由で、先のファイル名の先頭に5桁の連番を付与すると言う仕様にしている。

そもそもCubePDF自体にダイアログを表示しない印刷機能が搭載されていないので、大多数のユーザがその機能を必要としてないのだろうけど、万人の求める機能は、個々人の求める機能とはマッチしないのが世の常である。

今回変更した処理内容はこちら。

               Boolean skipui = false;
               String desktop_path = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
               String skipui_dirname = "SkipUI";
               String skipui_dirpath = System.IO.Path.Combine(desktop_path, skipui_dirname);
               if (System.IO.Directory.Exists(skipui_dirpath))
               {
                   skipui = true;
                   setting.Value.PostProcess = Cube.Pdf.Converter.PostProcess.None;
               }
               if (skipui)
               {
                   int max_num = 0;
                   string new_filename = setting.Value.Destination;
                   string[] filenames = System.IO.Directory.GetFiles(skipui_dirpath, "*.pdf");
                   foreach (string filename in filenames)
                   {
                       string tmp_filename = System.IO.Path.GetFileName(filename);
                       if (System.Text.RegularExpressions.Regex.IsMatch(tmp_filename, @"^\d{5}-.*\.pdf$"))
                       {
                           int cur_num = Int32.Parse(tmp_filename.Substring(0, 5));
                           if (max_num <= cur_num)
                           {
                               max_num = cur_num + 1;
                           }
                       }
                   }
                   string cur_filename = System.IO.Path.GetFileName(setting.Value.Destination);
                   new_filename = String.Format("{0:00000}-", max_num) + cur_filename;
                   string new_filepath = System.IO.Path.Combine(skipui_dirpath, new_filename);
                   setting.Value.Destination = new_filepath;
               }

プログラマの諸氏からすると訳のわからない書き方かもしれないが、これで必要は満たしているので良い。

「C# ファイル 存在 確認」の様な単語の羅列で検索すると書き方がすぐに見つかるので、プログラミングの知識がなくても処理は書けるが、言語仕様の知識が無いので、「変数宣言のスコープがー」、「暗黙のキャストが出来ないよー」というエラーが多発して面倒くさかった。

なによりコンソールプログラムではないため、プリントデバッグが使えず、ポップアップウインドウでデータを見るというのは非常に面倒だ。ソリューションのリビルドの都度、プログラムファイルフォルダにコピーするのも面倒。

なにか良い方法は無いのでしょうか。

いいなと思ったら応援しよう!