CubePDF Utilityで一時ファイルの作成をローカルのテンポラリフォルダにする
先のNoteに書いたとおり、CubePDF Utilityで一時ファイルが保存先と同じフォルダに出力されるのが不便なので、ローカルのテンポラリフォルダに出力するように変更する。
CubePDF Utilityのソースコードのダウンロードと、プログラミング環境の準備はCubePDFと同じ。
https://note.com/ktinote/n/n5ef9690271e1
早速、一時ファイルを作成しているこコードを探すが、正しいやり方がわからないので、CubePDF UtilityはCube.PDF.Editorだと当たりを付け、以下のフォルダ内のファイルをファイル名から探索。
Application\Cube.Pdf.Editor
そうすると、以下の2つのファイルが怪しいと想像をつける。理由はもちろんファイル名が保存っぽいから。
Application\Cube.Pdf.Editor\Sources\Models\SaveAction.cs
Application\Cube.Pdf.Editor\Sources\Models\SaveOption.cs
この2つのファイルの中身を見てみると、以下のコードが怪しい。
private void SaveAsDocument(string dest,
IDocumentReader src,
IEnumerable<Page> pages,
Action<Entity> prev,
Action<Entity> next
) {
var fi = Options.IO.Get(dest);
var tmp = Options.IO.Combine(fi.DirectoryName, Guid.NewGuid().ToString("D"));
try
{
using (var writer = new Itext.DocumentWriter())
{
if (Options.Attachments != null) writer.Add(Options.Attachments);
if (Options.Metadata != null) writer.Set(Options.Metadata);
if (Options.Encryption != null) writer.Set(Options.Encryption);
if (src != null) writer.Add(pages, Source);
else writer.Add(pages);
writer.Save(tmp);
}
prev(fi);
Options.IO.Copy(tmp, fi.FullName, true);
next(fi);
}
finally { _ = Options.IO.TryDelete(tmp); }
}
tmp変数に一時ファイルのパスを入れていそう。
なので、以下にテスト修正。
var tmp = Options.IO.Combine(fi.DirectoryName, "testtemporaryfile.tmp");
ソリューションをリビルドして実行し、PDFファイルを編集してみる。
見事、一時ファイルのファイル名が変わっている。
ただし、今まで通りの文字列のファイルも作成されている。一時ファイルが2回作られている様子。
とりあえず、この一時ファイルの作成先をローカルに変更してみる。
ローカルの一時ファイル作成フォルダは「System.IO.Path.GetTempPath()」で取れるとのこと。便利。
var tmp = Options.IO.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString("D"));
またまたソリューションをリビルドして実行。
今までより早く保存できるようにはなったが、保存先に一時ファイルが出来るのは変わらない。もしかすると、一時ファイルは2度作られているのかもしれない。なので、一時ファイルのファイル名を決めていた「Guid.NewGuid().ToString("D")」でソリューション内を検索。
以下が見つかった。
Libraries\Cube.Pdf.Itext\Sources\DocumentWriter.cs
コードはこちら。
protected override void OnSave(string path)
{
var dir = IO.Get(path).DirectoryName;
var tmp = IO.Combine(dir, Guid.NewGuid().ToString("D"));
try
{
Merge(tmp);
Release();
Finalize(tmp, path);
}
catch (BadPasswordException err) { throw new EncryptionException(err.Message, err); }
finally
{
_ = IO.TryDelete(tmp);
Reset();
}
}
こちらも一時ファイルの保存先をテンポラリフォルダに変更してみる。
var tmp = IO.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString("D"));
かなり高速になり、保存先に一時ファイルが出来ることがなくなった。
このItextライブラリは他のアプリケーションからも参照されているため、全てのアプリケーションで一時ファイルの保存先がこれで変わる。
CubePDFはコードが整理されているのか、プログラミング初心者でもすぐにカスタマイズができて便利だ。すばらしい。