SecurityHandlers.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Pdf.Security;

namespace DsPdfWeb.Demos
{
    // 此示例演示了 Security.EncryptHandler 和 Security.DecryptHandler 的使用。
    // Security.DecryptHandler 允许您检查现有 PDF 的安全属性。
    // Security.EncryptHandler 允许您在保存 PDF 时指定安全属性。
    // GcDocs.Pdf 支持标准安全处理程序修订版 2、3、4 和 5(如 PDF 规范中所定义)。
    // 在此示例中,我们使用StandardSecurityHandlerRev4,它提供了最多的选项。
    public class SecurityHandlers
    {
        public int CreatePDF(Stream stream)
        {
            // 密码示例:
            const string ownerPassword = "I'm the owner";
            const string userPassword = "I'm a user";

            // 第 1 步:生成具有一些安全属性的文档:
            var doc0 = new GcPdfDocument();
            var rc0 = Common.Util.AddNote(
                "展示安全性:\n" +
                "",
                doc0.NewPage());

            // 创建 Rev4 安全处理程序:
            var ssh4 = new StandardSecurityHandlerRev4()
            {
                // 设置一些 Rev4 特定的属性:
                EncryptionAlgorithm = EncryptionAlgorithm.AES,
                EncryptStrings = true,
            };
            // StandardSecurityHandlerRev4 源自 StandardSecurityHandlerRev3,
            // 所以我们可以这样做以确保我们只触及 rev3 特定的属性
            // (演员阵容仅供说明,当然您不需要它来设置这些道具):
            if (ssh4 is StandardSecurityHandlerRev3 ssh3)
            {
                ssh3.EditingPermissions = EditingPermissions.AssembleDocument;
                ssh3.PrintingPermissions = PrintingPermissions.LowResolution;
            }
            // 但 StandardSecurityHandlerRev3 并非源自 StandardSecurityHandlerRev2,
            // 因为有些属性具有相似的含义但语法不同,所以:
            // if (ssh3 is StandardSecurityHandlerRev2 ssh2) { ... }
            // 不管用。

            // 设置一些密码:
            ssh4.OwnerPassword = ownerPassword;
            ssh4.UserPassword = userPassword;

            // 将我们创建的处理程序分配给文档,以便在保存 PDF 时使用它:
            doc0.Security.EncryptHandler = ssh4;

            // 将 PDF 保存在临时文件中,以便我们可以加载它:
            var fn = Path.GetTempFileName();
            doc0.Save(fn);

            // 步骤2:加载生成的PDf并检查其安全属性:
            var doc = new GcPdfDocument();
            using (var fs = File.OpenRead(fn))
            {
                // 加载文档需要用户密码:
                doc.Load(fs, userPassword);

                // 此时我们可以检查 doc.Security.DecryptHandler 是否存在,
                // 但没有 Security.EncryptHandler:
                if (doc.Security.EncryptHandler != null)
                    throw new Exception("This should not happen.");

                var dh = doc.Security.DecryptHandler;
                if (dh is StandardSecurityHandlerRev4 dh_ssh4)
                {
                    // 确保加载的权限是我们在步骤 1 中指定的:
                    Common.Util.AddNote(
                        string.Format("已加载 PDF 的 DecryptHandler 中的安全属性:\n" +
                            "",
                        dh_ssh4.EditingPermissions, dh_ssh4.PrintingPermissions),
                        doc.Pages[0],
                        new RectangleF(72, rc0.Bottom + 36, 72 * 6, 72 * 2));
                    // 这行不通,抱歉:
                    var noway = dh_ssh4.OwnerPassword;
                    if (noway != null)
                        throw new Exception("No way.");
                }
                else if (dh is StandardSecurityHandlerRev3 dh_ssh3)
                {
                    // 如果我们不知道我们有 Rev4 处理程序,我们会在此处添加代码,
                }
                else if (dh is StandardSecurityHandlerRev2 dh_ssh2)
                {
                    // ... 和这里,
                }
                else
                {
                    // ...并在这种情况下也做了一些事情。
                }

                // 保存新的 PDF - 但请注意,因为我们没有设置
                // Security.EncryptHandler,新保存的文档没有安全性!
                doc.Save(stream);
            }
            // 清理临时文件:
            File.Delete(fn);
            // 完毕:
            return doc.Pages.Count;
        }
    }
}