1年ぶりにPDFアレコレをバージョンアップ。変更点は以下の通り。
Ver2.00 2019/10/13
・プレービューからのページ回転に対応。PDFiumのPDF編集能力は低いため、iTextSharpによるPDF編集の第一歩。PDF編集はこれからも機能拡張していくつもり。
・セーブにおいて、開いているファイルに対する上書き保存を可能とした。
・シングルページTIFFへの画像変換に対応した。
詳細はコチラ。
上でも少し触れたように、iTextSharpを組み込んだことが大きい。PDFiumにページを回転できそうなAPIがあったものの、使えないものだったので実装を断念していたのに対して、iTextSharpによるページ回転を実装。PDFのプレビューを見ながらページの回転(半時計回りに90度)できるフリーソフトはあんまないんじゃないかな。これもPDFiumの描画エンジンがあるからこそ。
iTextSharpはVer5.5.13.1を利用。Ver5系のライセンス規約では、ソースコードを公開しなければいけないらしいので、とりあえずiTextSharpの実装部分のみ公開しておく。今後、いい感じに仕上がってきたら、PDFium利用部を含めてPDFアレコレ全体のソースコードを公開する予定。
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.Windows.Forms;
namespace PDFiumTest
{
class ITSharp
{
Uty uty = new Uty();
public ITSharp()
{
}
public bool PageRotate(ref string file, int pno)
{
string temp = uty.GetTempPDFName();
bool stat = true;
PdfReader reader = new PdfReader(file);
try
{
int pagesCount = reader.NumberOfPages;
if (0 < pno && pno <= pagesCount)
{
PdfDictionary page = reader.GetPageN(pno);
PdfNumber rotate = page.GetAsNumber(PdfName.ROTATE);
int rotation = rotate == null ? 90 : (rotate.IntValue + 90) % 360;
page.Put(PdfName.ROTATE, new PdfNumber(rotation));
PdfStamper stamper = new PdfStamper(reader, new FileStream(temp, FileMode.Create));
stamper.Close();
}
else
{
stat = false;
MessageBox.Show("ページが範囲外");
}
}
catch(PdfException ex)
{
stat = false;
MessageBox.Show(string.Format("ページ回転に失敗({0})", ex.Message));
}
finally
{
reader.Close();
if (stat)
{
uty.FileDelete(file);
file = temp;
}
}
return stat;
}
}
}
PDFiumとiTextSharpをつなぐのはテンポラリファイル。つまり、一度ファイルに保存してから行き来するってこと。iTextSharpのPDF編集は定評があるので、さらなる強化を図っていくつもり。また、PDFiumの描画まわりは、任意指定の拡大縮小をやってみたい。今はウインドウサイズに応じて拡大率が変わる仕様なので実用的でないから。