NoPassAddAnnotation.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Annotations;

namespace DsPdfWeb.Demos
{
    // このサンプルでは、パスワードで保護されたPDFをパスワードを指定せずに読み込み、
    // PDFの最初のページに四角形注釈(ページを囲む赤い枠)を追加する方法を紹介しています。
    // 変更したPDFは保存後、パスワードを指定して再度読み込み、PDFビューワにて表示しています。
    public class NoPassAddAnnotation
    {
        public int CreatePDF(Stream stream)
        {
            using var fsSrc = File.OpenRead(Path.Combine("Resources", "PDFs", "Wetlands-password-user.pdf"));
            // パスワードで保護されたPDFをパスワードを指定せずに読み込めるようDecryptionOptionsを設定します。
            var dopt = new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false };
            var docSrc = new GcPdfDocument();
            docSrc.Load(fsSrc, dopt);

            // PDFの最初のページに四角形注釈を追加します。
            var page = docSrc.Pages[0];
            var pageSize = page.Size;
            var sa = new SquareAnnotation()
            {
                Page = page,
                Rect = new RectangleF(36, 36, pageSize.Width - 72, pageSize.Height - 72),
                Color = Color.Red,
            };
            // 注:UserNameはデフォルトで値が設定されるため、それを削除する必要があります。
            // そうしないと、文字列は暗号化できないため、ドキュメントの保存時に例外が発生します。
            sa.UserName = null;

            // デモサイト限定の処理:
            // 変更後のパスワードで保護されたドキュメントを一時ファイルに保存し、
            // それをパスワードを指定して再度読み込むことで、PDFビューワにて
            // パスワードを入力せずに表示できるようにします。
            var fn = Path.GetTempFileName();
            {
                docSrc.Save(fn);
                var doc = new GcPdfDocument();
                using var fs = File.OpenRead(fn);
                doc.Load(fs, "user");
                doc.Save(stream);
            }
            File.Delete(fn);
            return docSrc.Pages.Count;
        }
    }
}