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;
}
}
}