DioDocs for PDF
デジタル署名
PDFビューワ > PDFの編集 > デジタル署名

デジタル署名とは、PDFドキュメントに暗号化された電子的な認証スタンプを押すことで、コンテンツの真正性を確保するものです。署名は、情報が署名者によって作成され、改ざんされていないことを証明します。PDFビューワでは、クライアント側の save メソッドにて指定できる、保存設定のオプションである SignatureInfo 型の sign パラメータを使用して、PDFドキュメントにデジタル署名を追加して、サーバーに保存することができます。なお、このメソッドは、PDFドキュメントにデジタル署名を追加するための署名設定を指定するだけであり、実際の署名処理はサーバー側で行われます。

クライアント側の save メソッドは、署名付きでPDFドキュメントを保存するリクエストをサーバーに送信します。サーバー側の署名は、VerifyAuthToken イベントと OnSign イベントの2つを使用して実装されています。VerifyAuthToken イベントは認証トークンを検証し、onSign イベントは証明書で署名を検証した後、PDFドキュメントに署名を追加します。

次のサンプルコードは、Startup.cs ファイルにイベントを追加し、イベントハンドラを定義することによって、サーバー側での署名処理を実装する方法を示しています。

コードのコピー
public class Startup {

    const int MAX_MESSAGE_SIZE = 268435456/*256MB*/;

    static Startup() {
        Licensing.AddLicenseKeys();
    }

    // PDF ビューワを構成します。
    public void Configuration(IAppBuilder app) {
        app.UseCors(CorsOptions.AllowAll);
        DsPdfViewerHub.Configure(app);
        DsPdfViewerController.Settings.VerifyToken += VerifyAuthToken;
        DsPdfViewerController.Settings.Sign += OnSign;

    }

    // PDF ビューワの初期化時に提供された認証トークンを検証します。
    private void VerifyAuthToken(object sender, VerifyTokenEventArgs e) {
        string token = e.Token;
        if (string.IsNullOrEmpty(token) || !token.StartsWith("support-api-demo")) {
            e.Reject = true;
        }
    }

    // サーバー側での PDF ドキュメントへの署名処理を実装します。
    private void OnSign(object sender, SignEventArgs e) {
        var signatureProperties = e.SignatureProperties;

        string projectRootPath = HttpContext.Current.Server.MapPath("~");
        string certificatePath = Path.Combine(projectRootPath, "assets/DsPdfTest.pfx");
        byte[] certificateBytes = File.ReadAllBytes(certificatePath);
        if (certificateBytes == null) {
            e.Reject = true;
            return;
        }
        X509Certificate2 certificate = new X509Certificate2(
            certificateBytes, "qq", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
        signatureProperties.SignatureBuilder = new GrapeCity.Documents.Pdf.Pkcs7SignatureBuilder()
        {
            CertificateChain = new X509Certificate2[] { certificate },
            HashAlgorithm = GrapeCity.Documents.Pdf.Security.OID.HashAlgorithms.SHA512,
                Format = GrapeCity.Documents.Pdf.Pkcs7SignatureBuilder.SignatureFormat.adbe_pkcs7_detached
        };

        string fontPath = Path.Combine(projectRootPath, "assets/arialuni.ttf");
        signatureProperties.SignatureAppearance = new SignatureAppearance
        {
            TextFormat = new TextFormat
            {
                Font = Font.FromFile(fontPath),
                    FontSize = 5.5f
            }
        };
    }

}

次のサンプルコードは、PDF ビューワにて、PDF ドキュメントにデジタル署名を追加する方法を示しています。

コードのコピー
// 署名の設定を指定します。
viewer.save(undefined, { sign: { signatureField: "従業員", signerName: "従業員名", location: locationName }, reload: true });

PDF ビューワでは、save メソッドにてオプションで指定できる saveMode パラメータを使用して、増分更新またはリニアライズ化して PDF ドキュメントを保存できます。

次のサンプルコードは、増分更新を使用して PDF ドキュメントを保存する方法を示しています。

コードのコピー
viewer.save("IncrementalUpdate.pdf", { saveMode: "IncrementalUpdate" });

デジタル署名を追加する方法の詳細については、「デジタル署名を使用してドキュメントに署名する」を参照してください。

署名情報の取得

PDFビューワでは、PDFドキュメントがデジタル署名されているかどうかを確認することができます。PDFドキュメント内で有効な署名に関するすべての情報を取得するには、クライアント側の getSignatureInfo メソッドを使用します。以下のサンプルコードは、getSignatureInfoメソッドを使用できるさまざまなシナリオを示しています。

次のサンプルコードは、署名されているかどうかにかかわらず、PDFドキュメント内の有効なすべての署名フィールドの配列を取得する方法を示しています。

コードのコピー
const signatureInfo = await viewer.getSignatureInfo();

次のサンプルコードは、PDF ドキュメントが署名されているかどうかを確認する方法を示しています。

コードのコピー
const signatureInfo = await DsPdfViewer.findControl("#viewer").getSignatureInfo();
console.log(signatureInfo.signed ?
    "このドキュメントはデジタル署名で署名されています。" : "このドキュメントには署名がありません。");

次のサンプルコードは、PDF ドキュメント内のすべての署名フィールドを反復処理する方法を示しています。

コードのコピー
const info = await DsPdfViewer.findControl("#viewer").getSignatureInfo();
for (const field of info.signatureFields) {
    console.log("フィールド '" + field.fieldName + "' は署名値があります:" + !!field.signatureValue);
}

次のサンプルコードは、PDF ドキュメント内のすべての署名に関する情報を表示する方法を示しています。

コードのコピー
var viewer = DsPdfViewer.findControl("#root");
const signatureInfo = await viewer.getSignatureInfo();
if (signatureInfo.signed) {
    let s = "";
    for (let i = 0; i < signatureInfo.signedByFields.length; i++) {
        const signedField = signatureInfo.signedByFields[i], signatureValue = signedField.signatureValue;
        const signerName = signatureValue.name, location = signatureValue.location,
            signDate = viewer.pdfStringToDate(signatureValue.modificationDate).toDateString();
        s += `${i + 1} ${signedField.fieldName} の署名情報… 署名者:${signerName}、場所:${location}、日付:${signDate}\n`;
    }
    alert("このドキュメントはデジタル署名で署名されています:\n" + s);
} else {
    alert("このドキュメントには署名がありません。");
}