SecurityHandlers.vb
'' 完毕:
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Security

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

        '' 第 1 步:生成具有一些安全属性的文档:
        Dim doc0 = New GcPdfDocument()
        Dim rc0 = Util.AddNote(
            "展示安全性:" + vbLf +
            "",
            doc0.NewPage())

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

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

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

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

        '' 步骤2:加载生成的PDf并检查其安全属性:
        Dim doc = New GcPdfDocument()
        Using fs As New FileStream(fn, FileMode.Open, FileAccess.Read)
            '' 加载文档需要用户密码:
            doc.Load(fs, userPassword)

            '' 此时我们可以检查 doc.Security.DecryptHandler 是否存在,
            '' 但没有 Security.EncryptHandler:
            If doc.Security.EncryptHandler IsNot Nothing Then
                Throw New Exception("This should not happen.")
            End If

            Dim dh = doc.Security.DecryptHandler
            If TypeOf dh Is StandardSecurityHandlerRev4 Then
                Dim dh_ssh4 = DirectCast(dh, StandardSecurityHandlerRev4)
                '' 确保加载的权限是我们在步骤 1 中指定的:
                Util.AddNote(
                    String.Format("已加载 PDF 的 DecryptHandler 中的安全属性:" + vbLf +
                        "",
                                  dh_ssh4.EditingPermissions, dh_ssh4.PrintingPermissions),
                    doc.Pages(0),
                    New RectangleF(72, rc0.Bottom + 36, 72 * 6, 72 * 2))
                '' 这行不通,抱歉:
                Dim noway = dh_ssh4.OwnerPassword
                If noway IsNot Nothing Then
                    Throw New Exception("No way.")
                End If

            ElseIf TypeOf dh Is StandardSecurityHandlerRev3 Then
                '' 如果我们不知道我们有 Rev4 处理程序,我们会在此处添加代码,
            ElseIf TypeOf dh Is StandardSecurityHandlerRev2 Then
                '' ... 和这里,
            Else
                '' ...并在这种情况下也做了一些事情。
            End If

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