DioDocs for PDF
セキュリティ
機能 > セキュリティ
このトピックの内容:

機密情報または極秘情報が含まれている PDF ドキュメントには、セキュリティを設定して、承認されていないユーザーによるアクセスまたは変更を制限する必要があります。PDF のセキュリティの詳細については、PDF 仕様 1.7(セクション 7.6.3)を参照してください。

DioDocs for PDF を使用すると、暗号化、パスワード保護、権限の設定などのさまざまな機能により、PDF ドキュメントを不要なアクセスから保護できます。

PDF の暗号化

機密情報または極秘情報が含まれている PDF ドキュメントには、セキュリティを設定して、承認されていないユーザーによるアクセスを制限する必要があります。GcPDFのSecurity クラスを使用して、ドキュメントを暗号化し、承認されていないユーザーへのアクセスを拒否できます。

標準セキュリティハンドラリビジョン4を使用して、PDF ファイルを暗号化するには

  1. StandardSecurityHandlerRev4 クラスのオブジェクトを作成します。
  2. パスワード、暗号化アルゴリズムなど、StandardSecurityHandlerRev4 オブジェクトの必須プロパティを設定します。
  3. オブジェクトを Security クラスの EncryptHandler プロパティに渡して、PDF ドキュメントを暗号化します。
C#
コードのコピー
public void CreatePDF(Stream stream)
{
    GcPdfDocument doc = new GcPdfDocument();
    var page = doc.NewPage();
    var g = page.Graphics;
    const float In = 150;
    
    //暗号化を追加します
    var std = new StandardSecurityHandlerRev4();
    std.OwnerPassword = "abc";
    std.UserPassword = "qwe";
    
    // EncyptionAlgorithmを設定します
    std.EncryptionAlgorithm = EncryptionAlgorithm.RC4;
    std.EncryptionKeyLength = 128;
    
    // EncryptHandlerプロパティを設定します
    doc.Security.EncryptHandler = std;
    
    // DrawStringメソッドを使用してテキストをレンダリングします
    g.DrawString("Welcome to GrapeCity, Inc", new TextFormat()
    { Font = StandardFonts.TimesBold, FontSize = 12 }, new PointF(In, In));
    
    // ドキュメントを保存します
    doc.Save(stream);
}

GcPDFは、256-bit AES暗号化を使用する標準セキュリティハンドラリビジョン6(PDF 2.0仕様で定義)もサポートしています。

標準セキュリティハンドラリビジョン6を使用して、PDF ファイルを暗号化するには

  1. StandardSecurityHandlerRev6クラスのオブジェクトを作成します。
  2. StandardSecurityHandlerRev6 オブジェクトのパスワード、印刷許可などの必須プロパティを設定します。
  3. オブジェクトをSecurityクラスのEncryptHandlerプロパティに渡して、PDFドキュメントを暗号化します。
    C#
    コードのコピー
    public void CreatePDF(Stream stream)
    {
        GcPdfDocument doc = new GcPdfDocument();
        var page = doc.NewPage();
        var g = page.Graphics;
        const float In = 150;
        // 暗号化を追加します
        var ssh = new StandardSecurityHandlerRev6();
        ssh.OwnerPassword = "password";
        ssh.PrintingPermissions = PrintingPermissions.Enabled;
        // EncryptHandlerプロパティを設定します
        doc.Security.EncryptHandler = ssh;
        // DrawStringメソッドを使用してテキストをレンダリングします
        g.DrawString("Welcome to GrapeCity, Inc", new TextFormat()
        { Font = StandardFonts.TimesBold, FontSize = 12 }, new PointF(In, In));
        // ドキュメントを保存します
        doc.Save(stream);
    }
    
先頭に戻る

権限の設定

PDF ドキュメントに対する権限を設定することで、他のユーザーによるドキュメントのコピー・印刷・編集を防ぐことはできます。DioDocs for PDF ライブラリの Security クラスを使用すると、ユーザーは PDF ドキュメントに権限を設定できます。

PDF ドキュメントで権限を設定するには

  1. StandardSecurityHandlerRev3 クラスのオブジェクトを作成します。
  2. StandardSecurityHandlerRev3 オブジェクトの必須プロパティを使用して、編集、印刷などの権限を設定します。
  3. オブジェクトを Security クラスの EncryptHandler プロパティに渡します。
C#
コードのコピー
public void CreatePDF(Stream stream)
{
    GcPdfDocument doc = new GcPdfDocument();
    var page = doc.NewPage();
    var g = page.Graphics;
    int In = 72;

    // セキュリティハンドラを作成します
    var std = new StandardSecurityHandlerRev3();
    std.EditingPermissions = EditingPermissions.Enabled;
    std.OwnerPassword = "abc";
    std.UserPassword = "qwe";

    // 権限を設定します
    std.EditingPermissions = EditingPermissions.Enabled;
    std.CopyContentPermissions = CopyContentPermissions.Enabled;
    std.PrintingPermissions = PrintingPermissions.Disabled;
    doc.Security.EncryptHandler = std;

    // DrawStringメソッドを使用してテキストをレンダリングします
    g.DrawString("Welcome to GrapeCity, Inc.", new TextFormat()
    { Font = StandardFonts.TimesBold, FontSize = 12 }, new PointF(In, In));

    // ドキュメントを保存します
    doc.Save(stream);
}
先頭に戻る

パスワードなしで暗号化されたPDFを開く

パスワードを指定せずに暗号化された PDF ファイルのロードが必要となる場合もあります。DioDocs for PDF では、パスワードを指定せずにパスワードで保護された PDF ファイルを開くには、DecryptionOptions クラスの ThrowExceptionIfInvalidPassword プロパティ (フラグ) を false に設定してから、 (デフォルトでは true です)、GcPdfDocument クラスの Load(Stream stream, DecryptionOptions decryptionOptions) オーバーロードを使用します。この方法で開いた PDF でできることには多くの制限がありますが、次のことができます。

PDF形式には「オブジェクトストリーム」機能があります。 オブジェクトストリームとは、最外側のファイルレベルではなく、一連の間接オブジェクトが格納されるストリーム オブジェクトです。PDF が暗号化されている場合、オブジェクトストリームも暗号化されるため、PDF オブジェクトにはアクセスできません。したがって、DioDocs for PDF では、パスワードを指定せずにオブジェクト ストリーム関数で PDF ファイルを開くことができず、例外が発生します。パスワードを指定せずにパスワードで保護された PDF を操作する場合、次のことはできません。

次のセクションでは、パスワードを指定せずに暗号化された PDF ファイルを操作する場合に役立つシナリオをいくつか示します。

注釈の追加

C#
コードのコピー
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    // GcPdfDocument を初期化します。
    GcPdfDocument doc = new GcPdfDocument();

    // PDF ファイルをロードし、復号化オプションを false に設定します。
    doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });

    // PDF ファイルの最初のページをアクティブ ページとして設定します。
    var page = doc.Pages[0];

    // ページサイズを取得します。
    var pageSize = page.Size;

    // 正方形注釈を追加します。
    SquareAnnotation sa = new SquareAnnotation();
    sa.Page = page;

    /* UserName を削除します。これはデフォルトで初期化されており、
       文字列を暗号化できないため、ドキュメントの保存時に例外が発生します。 */
    sa.UserName = null;

    // ページに正方形を追加します。
    sa.Rect = new RectangleF(10, 10, pageSize.Width - 20, pageSize.Height - 20);

    // 正方形の色を設定します。
    sa.Color = Color.Red;

    // PDF ファイルを保存します。
    doc.Save("Annotation.pdf");
}

メタデータ値の取得

C#
コードのコピー
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    // GcPdfDocument を初期化します。
    GcPdfDocument doc = new GcPdfDocument();

    // PDF ファイルをロードし、復号化オプションを false に設定します。
    doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });

    // メタデータが暗号化されているかどうかを確認し、暗号化されていない場合はメタデータを変更します。
    bool encryptMetadata = true;
    if (doc.Security.EncryptHandler is StandardSecurityHandlerRev4 ssh)
        encryptMetadata = ssh.EncryptMetadata;

    if (!encryptMetadata)
    {
        // メタデータが暗号化されません。
        Metadata m = doc.Metadata;
        Console.WriteLine("The document has not encrypted metadata:");
        Console.WriteLine($"CreatorTool: {m.CreatorTool}");
        Console.WriteLine($"CreateDate: {m.CreateDate}");
    }
    else
    {
        Console.WriteLine("The document metadata is ENCRYPTED");
    }
}

メタデータ値の変更

C#
コードのコピー
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    // GcPdfDocument を初期化します。
    GcPdfDocument doc = new GcPdfDocument();

    // PDF ファイルをロードし、復号化オプションを false に設定します。
    doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });

    // メタデータが暗号化されているかどうかを確認し、暗号化されていない場合はメタデータを変更します。
    bool encryptMetadata = true;
    if (doc.Security.EncryptHandler is StandardSecurityHandlerRev4 ssh)
        encryptMetadata = ssh.EncryptMetadata;

    if (!encryptMetadata)
    {
        // メタデータが暗号化されません。
        Metadata m = doc.Metadata;
        Console.WriteLine("The document has not encrypted metadata:");
        Console.WriteLine($"CreatorTool: {m.CreatorTool}");
        Console.WriteLine($"CreateDate: {m.CreateDate}");

        // CreatorToolの値を変更します。
        m.CreatorTool = "New value of CreatorTool";

        doc.Save(@"MetaData.pdf");
    }
    else
    {
        Console.WriteLine("The document metadata is ENCRYPTED");
    }
}

ページ順序の変更

C#
コードのコピー
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    // GcPdfDocument を初期化します。
    GcPdfDocument doc = new GcPdfDocument();

    // PDF ファイルをロードし、復号化オプションを false に設定します。
    doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });

    // 最初のページと 2 番目のページを入れ替えます。
    doc.Pages.Swap(0, 1);

    // PDF ファイルを保存します。
    doc.Save("PageOrder.pdf");
}

CheckBoxField と RadioButtonField の値の変更

C#
コードのコピー
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    // GcPdfDocument を初期化します。
    GcPdfDocument doc = new GcPdfDocument();

    // PDF ファイルをロードし、復号化オプションを false に設定します。
    doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });

    // CheckBoxField の値を変更します。
    var cbf = (CheckBoxField)doc.AcroForm.Fields[0];
    cbf.Checked = true;

    // RadioButtonField の値を変更します。
    var rbf = (RadioButtonField)doc.AcroForm.Fields[1];
    var values = rbf.GetCheckedAppearanceStreamNames();
    rbf.Value = values[0];

    // PDF ファイルを保存します。
    doc.Save("FieldValue.pdf");
}

TextFieldと CombTextFieldの値の変更

C#
コードのコピー
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    // GcPdfDocument を初期化します。
    GcPdfDocument doc = new GcPdfDocument();

    // PDF ファイルをロードし、復号化オプションを false に設定します。
    doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });

    // CheckBoxField の値を変更します。
    var tf = (TextField)doc.AcroForm.Fields[2];
    tf.PdfValue = new PdfName("New Value");

    // CombTextField の値を変更します。
    var ctf = (CombTextField)doc.AcroForm.Fields[3];
    ctf.PdfValue = new PdfName("NEW");

    // AcroFormのNeedAppearancesエントリを設定します。
    doc.AcroForm.Set(PdfName.Std.NeedAppearances, PdfBool.True);

    // PDF ファイルを保存します。
    doc.Save("TextField.pdf");
}

統計の取得

C#
コードのコピー
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    // GcPdfDocument を初期化します。
    GcPdfDocument doc = new GcPdfDocument();

    // PDF ファイルをロードし、復号化オプションを false に設定します。
    doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });

    // ページ数とページのサイズを取得します。
    Console.WriteLine($"Page count: {doc.Pages.Count}");
    Console.WriteLine();
    foreach (Page page in doc.Pages)
    {
        var sz = page.GetRenderSize();
        Console.WriteLine($"Size of {page.Index} page: {sz.Width}x{sz.Height}");
    }
}
メモ:ライセンス キーなしで DioDocs for PDF を使用する場合、パスワードを指定せずにパスワードで保護された PDF を操作すると、多くの制限があります (たとえば、PDF を変更して保存しようとすると、ライセンスナグテキストが追加されるため失敗します)。30 日間のトライアルライセンスを取得するには、sales@grapecity.com にお問い合わせください。

先頭に戻る

DioDocs for PDF を使用してセキュリティを適用する方法については、DioDocs for PDF サンプルブラウザを参照してください。