このページには自動翻訳されたテキストを含めることができます。

ドキュメントの作成

もちろん、データを使って PDF ドキュメントを生成する必要があります。しかし多くの場合、PDF ファイルをパスワードで暗号化したいこともあります。また通常は、出力ファイルに PDF メタデータを追加したいはずです。

PDF ファイルを暗号化するようジェネレーターに指示する方法を知るには、読み進めてください。ドキュメントの作成者とキーワードを指定する方法も説明します。

この記事は、PDF 生成のための Layout API に関するシリーズの一部です。API を初めて使う場合は、まず Layout API の基本 の部分をお読みください。

PDF ドキュメントの作成

作成と生成

Layout API のエントリ ポイントは PdfDocumentBuilder クラスです。まず Create メソッドでこのクラスのインスタンスを作成します。PDF を生成するには、クラスの Generate メソッドを呼び出します。

Generate は、出力をファイルまたはストリームに保存できます。どちらのバージョンのメソッドも、第 2 引数として Action<Document> 型のデリゲートを必要とします。デリゲート内で、取得したいドキュメントを記述します。ライブラリはその記述に基づいて PDF を生成します。

暗号化

出力 PDF を暗号化するには、Generate メソッドの前に Encryption メソッドを呼び出します。

暗号化ハンドラーを作成して指定する必要があります。パスワードで PDF を暗号化するには、PdfStandardEncryptionHandler 型のハンドラーを使用します。

PdfDocumentBuilder.Create()
    .Encryption(new PdfStandardEncryptionHandler("owner", "user"))
    .Generate("encrypted-with-password.pdf", doc => doc.Pages(_ => { }));

証明書を使用して PDF を暗号化することもできます。PDF ドキュメントの暗号化 記事を参照してください。そこには、暗号化ハンドラーと PDF 権限に関する詳細情報があります。

PDFメタデータ

一部のワークフローでは、出力 PDF に適切な PDF キーワードと PDF 作成者を指定することが非常に重要です。Layout API はこれを簡単に行う方法を提供します。Generate メソッドの前に Info メソッドを呼び出し、デリゲート内でメタデータ値を指定します。

PdfDocumentBuilder.Create()
    .Info(info =>
    {
        info.Author = $"{Environment.UserName}";
        info.Title = "Generate encrypted PDF with custom metadata";
        info.Keywords = "Metadata keywords encryption";
    })
    .Generate("metadata.pdf", doc => doc.Pages(_ => { }));

オプション

同じ内容でも、ライブラリは内部構造の異なる PDF ファイルを作成できます。これらのオプションは出力 PDF に影響します。

バージョン

出力 PDF の最小 PDF 形式バージョンを設定するには、Version メソッドを使用します。

PdfDocumentBuilder.Create()
    .Version(PdfVersion.Pdf17)
    .Generate("version.pdf", doc => doc.Pages(_ => { }));

ライブラリは、指定したものより大きいバージョンの PDF を作成できることに注意してください。これは、ドキュメントの内容により、より新しいバージョンが必要な場合に発生します。言い換えると、ドキュメントが指定された PDF 標準バージョンでは使用できない機能を使っている場合です。

オブジェクト ストリーム

既定では、ライブラリは生成された PDF でオブジェクト ストリームを使用します。これにより、より小さく、より適切に圧縮されたファイルを作成できます。

ObjectStreams メソッドを使用して、オブジェクト ストリームなしで PDF ファイルを作成するよう API に指示できます。

PdfDocumentBuilder.Create()
    .ObjectStreams(false)
    .Generate("no-object-streams.pdf", doc => doc.Pages(_ => { }));

規制要件がない限り、オブジェクト ストリームを引き続き使用することをお勧めします。あるいは、ワークフローの他の部分でオブジェクト ストリームを含むドキュメントを処理できない場合です。

ストリーム プロバイダー

ライブラリは中間ストレージとしてストリームを使用します。PDF を生成する際には、画像やその他の大きなオブジェクトに対してこれを行います。ライブラリはストリーム プロバイダーを通じてストリームを取得します。現在の PdfDocumentBuilder インスタンスには、常に 1 つが関連付けられています。

ライブラリは既定で PdfMixedStorageStreamProvider を使用します。このストリーム プロバイダー実装は、データをメモリ内に保持するストリームを提供します。データ量が多すぎると、これらのストリームは内容を一時ファイルに書き出します。これにより、メモリ消費を抑え、LOH の断片化を回避できます。

PDF ファイルを生成する際に、IPdfStreamProvider インターフェイスの独自実装を使用できます。変更の理由の 1 つは、ディスク操作が遅い、または高コストであることかもしれません。クラウド環境はこの説明に当てはまる場合があります。

次のコードは、一時ファイルを使わずに、完全にメモリ内で PDF を生成する方法を示しています。これは、既定のオプションよりもはるかに多くのメモリを必要とする点に注意してください。

using var memoryOnlyProvider = new PdfMemoryStreamProvider();
PdfDocumentBuilder.Create()
    .StreamProvider(memoryOnlyProvider)
    .Generate("created-without-temp-files.pdf", doc => doc.Pages(_ => { }));

ライブラリは最終的に、ストリーム プロバイダーを通じて取得したすべてのストリームに対して Dispose を呼び出します。ストリーム プロバイダーのインスタンスは自分で破棄する必要があります。