DioDocs for PDF
さて、DioDocs for Excelがあまりにも個人的に衝撃的すぎた結果、ここまでExcel側の言及が多かったかもしれませんが、DioDocs for PDFも素性の良い製品です。
まずここまでお話ししてきた、次のような「バランスの良さ」はDioDocs for PDFも兼ね備えています。
- .NET Standard 2.0準拠
- ランタイムフリー
- 開発元は日本が本社の企業なので直接サポートが受けられる
- 軽快な動作速度
PDF操作ライブラリの選定を考えた場合、.NET Standard 2.0準拠であるというのは非常に大きな加点要素となります。PDFを扱うとなると、画像を扱う頻度が高くなりますが、先にも説明したように.NET Framework標準の画像ライブラリはサーバープロセスでの利用に耐え得るものではありません。.NET Standardはクロスプラットフォーム対応が前提のため、必然的にWindowsの固有機能であるGDI+へ依存してないことが期待できます。
先にお話ししたPDFSharpがまさに画像処理にGDI+に依存しており、サーバープロセスでの利用ははばかられます。
有償製品を考えた場合、サーバープロセスでの動作を保証している製品はそれなりにありますが、ランタイムライセンスを必要とする製品の割合が高いように思います。先にも記載しましたが、クラウドでスケールアウトすることを考えると、コア数ベースなどのランタイムライセンスは躊躇してしまいます。そもそもFaaSなどでコア数ライセンスを適切に運用できるのでしょうか?
また有償製品を購入するとした場合に、国内で購入するにあたって販売代理店ではなく、開発会社の日本法人が存在するのは、有償製品を利用するケースでは比較的重要な評価指標だと私は考えているので、その点でも優位にあります。
これらの点を考慮するとDioDocs for PDFが非常に良いバランスの上に成り立っているのが理解いただけると思います。
ただしDioDocs for PDFについては、個人的には最も利用したい機能の1つが日本版にはまだリリースされていませんでした。具体的には複数のPDFを結合する機能です。
※複数のPDFを結合する機能は、2019年2月27日にリリースされた最新バージョンのDioDocs for PDFより利用できます。
そこでDioDocsの英語版である「GrapeCity Documents for PDF(以下、GCPDF)」の機能を紹介したいと思います。GCPDFでは先行して機能がリリースされています。DioDocsの次のバージョンには現在のGCPDFの機能が含まれてリリースされるそうで、そうなればPDFも結合や分割の機能も提供されるようになります。日程は未確定ですが、そう遠くない未来にリリースされるようです。
では実際にPDF操作の例を見ていただきましょう。ここでは次の2つの例を紹介いたします。
- 複数のPDFを連結して、1つのPDFにまとめる
- PDFに電子署名を付与する
例としてこの2つを選択したのには明確な理由があります。
業務システムでデータを帳票として出力したいという場合、次のいずれかであるケースが多いでしょう。
- 紙に印刷して顧客などに配送する
- 電子帳票として出力してメールなどで送信する
前者の場合、1枚(もしくは1セット)ずつ印刷するのは非効率なので、単一のPDFファイルにまとめて一括印刷することが必要となるでしょう。
後者の場合、電子帳票は紙と違って改ざんが容易であるというデメリットがありますが、署名することによって発行者を明確にし、発行後に改ざんされていないことを保証することが可能になります。
というわけで、実際の例を見ていただきましょう。非常に簡単に実現できることが見て取れることと思います。
複数のPDFを連結して、1つのPDFにまとめる
それでは実際のコードを紹介していきましょう。まずはライセンスを有効化します。
GcPdfDocument.SetLicenseKey("YOUR_KEY");
続いて、必要なPDFを都度読み込んで結合していきます。ここでは同じファイルになっていますが、10回読み込んで結合しています。
var newDoc = new GcPdfDocument(); for (var i = 0; i < 10; i++) { using (var inputStream = new FileStream("Invoice.pdf", FileMode.Open)) { var invoice = new GcPdfDocument(); invoice.Load(inputStream); newDoc.MergeWithDocument(invoice, new MergeDocumentOptions()); } } using (var outputStream = new FileStream("Result.pdf", FileMode.Create)) { newDoc.Save(outputStream); outputStream.Flush(); }
結合後に結果PDFとして出力しています。実際にPDFを開いてみてみましょう。
Result.pdfが10ページの同じ帳票で構成されているのが見て取れます。
さて、複数ページのPDFを作成するにあたって、実のところもう1つの方法があります。それはExcel上で全ページ分のシートを作成して、そこから一括で1枚のPDFを出力する方法です。
しかし、個人的にはPDFを1枚ずつ出力して最後に統合する方が好みです。
と言うのは、途中で何らかのエラーになった場合、エラーが発生する前までのPDFは残しておくことができるからです。エラーの直前までのファイルがあるなら、業務的に先にそれらを処理することも可能になります。
1つの大きな処理で完結するより、小さな処理を組み合わせた方が柔軟性が増すことが多いと思うからです。
PDFに電子署名を付与する
続いてデジタル証明書を利用してPDFに署名する例を紹介しましょう。デジタル証明書による署名を行うことで改ざんの検知などが可能となり、不正の抑止にもつながります。
では具体的な実装例を紹介しましょう。ライセンスはすでに有効化されているものとします。
まず署名対象のStreamと、署名後のファイル保存用のStreamを開き、GcPdfDocumentにPDFをロードします。
using (var inputStream = new FileStream("Invoice.pdf", FileMode.Open)) using (var outputStream = new FileStream("Signed.pdf", FileMode.Create)) { var doc = new GcPdfDocument(); doc.Load(inputStream);
続いて署名をPDF上に表示する署名フィールドを作成し、ドキュメントに追加します。
// 署名を保持する署名フィールドを初期化 var signatureField = new SignatureField(); signatureField.Widget.Rect = new RectangleF(400, 750, 140, 36); signatureField.Widget.Page = doc.Pages.Single(); signatureField.Widget.BackColor = Color.LightSeaGreen; signatureField.Widget.TextFormat.FontName = "游ゴシック"; // ドキュメントに署名フィールドを追加 doc.AcroForm.Fields.Add(signatureField);
そして署名フィールドとひも付ける形で署名を作成します。
// 署名フィールドと署名を結びつけ var signatureProperties = new SignatureProperties { Certificate = new X509Certificate2(File.ReadAllBytes("diodocs.pfx"), "diodocs"), Location = "My Desktop", SignerName = "DioDocs", SignatureField = signatureField };
最後にPDFを署名して保存します。
// 署名して文書を保存 // 注意 // - 署名と保存は一連の操作で、2つは分離できません // - Sign()メソッドに渡されたストリームは読み込み可能である必要があります。 doc.Sign(signatureProperties, outputStream);
それでは署名されたファイルを開いてみましょう。
SignatureFieldで追加した領域が右下の緑の矩形の領域です。ここをクリックすると次のダイアログが表示されます。
さらに「署名のプロパティ」を開いてみましょう。
適切に署名され、署名された日時から変更されていないことが確認できます。非常に簡単に署名を追加することができました。
さいごに
さて、ここまでお付き合いいただいた方は、DioDocsに大きな興味を持っていただけたものと思います。
DioDocsは、掛け値なしに大変素晴らしい製品です。私の身近なユースケースで考えた場合、ユーザーメンテナンスが可能な帳票サービスを、クラウド上に作成するケースで非常に有効に働くと思います。
実際、簡便な帳票出力であれば、今後はDioDocsの採用を検討したいと私自身感じています。既存の帳票ライブラリと比較すると、厳密な出力制御や柔軟性は劣る面もあるかと思いますが、Excel&DioDocsで事足りる範囲では圧倒的な生産性向上が見込める可能性があります。その利用範囲を広げるためにも、PDFの結合などを含んだDioDocs for PDFの次のバージョンの早期リリースを期待します。実際のプロダクトに採用してみて、深く掘り下げて評価・利用してみたいところです。
本稿はここで終了とさせていただきますが、別の機会に、具体的にユーザーメンテナンスが可能な帳票サービスを、DioDocsを利用してどう実現するか? アーキテクチャ設計を踏まえて紹介したいと思います。アプリケーションレベルで活用する具体例になる予定です。ご期待ください。