VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    PDF: Защита PDF документа
    В этом разделе
    VintaSoft PDF .NET Plug-in позволяет:

    Система шифрования PDF документа

    Класс EncryptionSystem предназначен для хранения всех необходимых параметров cистемы шифрования. Класс содержит следующие параметры:
    Экземпляр класса EncryptionSystem может быть создан с помощью конструктора:

    Подробную информацию о параметрах шифрования, разнице между паролем пользователя и паролем владельца можно найти в разделах PDF спецификации: 3.5.Encryption, 3.5.2.Standard Security Handler.


    Создание защищенного PDF документа

    Новый зашищенный PDF документ может быть создан с помощью одного из следующих конструкторов класса PdfDocument:
    Вот C#/VB.NET код, который демонстрирует, как создать новый защищенный PDF документ.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class CreateEncryptedPdfDocument
        {
            public static void CreateDocument(string filename, string userPassword, string ownerPassword)
            {
                // specifies user access permissions
                Vintasoft.Imaging.Pdf.Security.UserAccessPermissions userPermissions = 
                    Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInHighResolution | 
                    Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInLowResolution;
                // create encryption system
                Vintasoft.Imaging.Pdf.Security.EncryptionSystem documentEncryption =
                    new Vintasoft.Imaging.Pdf.Security.EncryptionSystem(
                        Vintasoft.Imaging.Pdf.Security.EncryptionAlgorithm.RC4, 40, 
                        userPassword, ownerPassword, userPermissions);
                // create document
                using (Vintasoft.Imaging.Pdf.PdfDocument document = 
                    new Vintasoft.Imaging.Pdf.PdfDocument(
                        Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14, documentEncryption))
                {
                    // add empty page
                    Vintasoft.Imaging.Pdf.Tree.PdfPage page = 
                        document.Pages.Add(Vintasoft.Imaging.PaperSizeKind.A4);
                    // draw text on page
                    using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics g = page.GetGraphics())
                    {
                        Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont font = document.FontManager.GetStandardFont(
                            Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesBold);
                        System.Drawing.PointF location = new System.Drawing.PointF(0, page.MediaBox.Height / 2);
                        string text = document.EncryptionSystem.ToString();
                        g.DrawString(text, font, 16, 
                            new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black), location);
                    }
                    // save document
                    document.SaveChanges(filename);
                }
            }
        }
    }
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class CreateEncryptedPdfDocument
            Public Shared Sub CreateDocument(filename As String, userPassword As String, ownerPassword As String)
                ' specifies user access permissions
                Dim userPermissions As Vintasoft.Imaging.Pdf.Security.UserAccessPermissions = Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInHighResolution Or Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInLowResolution
                ' create encryption system
                Dim documentEncryption As New Vintasoft.Imaging.Pdf.Security.EncryptionSystem(Vintasoft.Imaging.Pdf.Security.EncryptionAlgorithm.RC4, 40, userPassword, ownerPassword, userPermissions)
                ' create document
                Using document As New Vintasoft.Imaging.Pdf.PdfDocument(Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14, documentEncryption)
                    ' add empty page
                    Dim page As Vintasoft.Imaging.Pdf.Tree.PdfPage = document.Pages.Add(Vintasoft.Imaging.PaperSizeKind.A4)
                    ' draw text on page
                    Using g As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = page.GetGraphics()
                        Dim font As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont = document.FontManager.GetStandardFont(Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesBold)
                        Dim location As New System.Drawing.PointF(0, page.MediaBox.Height / 2)
                        Dim text As String = document.EncryptionSystem.ToString()
                        g.DrawString(text, font, 16, New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black), location)
                    End Using
                    ' save document
                    document.SaveChanges(filename)
                End Using
            End Sub
        End Class
    End Namespace
    
    


    Загрузка защищенного PDF документа

    Защищенный PDF документ можно загрузить двумя способами:
    Вот C#/VB.NET код, который демонстрирует, как загрузить PDF документ, используя класс ImageCollection.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class OpenUsingImageCollection
        {
            public static void AddPdfDocumentToImageCollection(
                string filename, Vintasoft.Imaging.ImageCollection images)
            {
                Vintasoft.Imaging.Pdf.PdfDocumentController.AuthenticateRequest += 
                    new System.EventHandler<Vintasoft.Imaging.Pdf.PdfDocumentEventArgs>(PdfDocumentController_AuthenticateRequest);
                images.Add(filename);
            }
    
            static void PdfDocumentController_AuthenticateRequest(
                object sender, Vintasoft.Imaging.Pdf.PdfDocumentEventArgs e)
            {
                Vintasoft.Imaging.Pdf.PdfDocument document = e.Document;
                while (true)
                {
                    System.Console.Write("Enter password: ");
                    // get password string
                    string password = System.Console.ReadLine();
                    // performs authentication
                    Vintasoft.Imaging.Pdf.Security.AuthorizationResult authorization = 
                        document.Authenticate(password);
                    // check authorization result
                    if (authorization == 
                        Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword)
                    {
                        System.Console.WriteLine("The password is incorrect.");
                    }
                    else
                    {
                        System.Console.WriteLine(authorization.ToString());
                        return;
                    }
                }
            }
        }
    }
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class OpenUsingImageCollection
            Public Shared Sub AddPdfDocumentToImageCollection(filename As String, images As Vintasoft.Imaging.ImageCollection)
                AddHandler Vintasoft.Imaging.Pdf.PdfDocumentController.AuthenticateRequest, New System.EventHandler(Of Vintasoft.Imaging.Pdf.PdfDocumentEventArgs)(AddressOf PdfDocumentController_AuthenticateRequest)
                images.Add(filename)
            End Sub
    
            Private Shared Sub PdfDocumentController_AuthenticateRequest(sender As Object, e As Vintasoft.Imaging.Pdf.PdfDocumentEventArgs)
                Dim document As Vintasoft.Imaging.Pdf.PdfDocument = e.Document
                While True
                    System.Console.Write("Enter password: ")
                    ' get password string
                    Dim password As String = System.Console.ReadLine()
                    ' performs authentication
                    Dim authorization As Vintasoft.Imaging.Pdf.Security.AuthorizationResult = document.Authenticate(password)
                    ' check authorization result
                    If authorization = Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword Then
                        System.Console.WriteLine("The password is incorrect.")
                    Else
                        System.Console.WriteLine(authorization.ToString())
                        Return
                    End If
                End While
            End Sub
        End Class
    End Namespace
    
    


    Вот C#/VB.NET код, который демонстрирует, как загрузить PDF документ, используя класс PdfDocument, для случая, когда заранее известно, что PDF документ защищен.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class OpenEncryptedPdfDocument
        {
            public static Vintasoft.Imaging.Pdf.PdfDocument Open(string filename)
            {
                Vintasoft.Imaging.Pdf.PdfDocument document = 
                    new Vintasoft.Imaging.Pdf.PdfDocument(filename);
                while (true)
                {
                    System.Console.Write("Enter password: ");
                    // get password string
                    string password = System.Console.ReadLine();
                    // performs authentication
                    Vintasoft.Imaging.Pdf.Security.AuthorizationResult authorization = 
                        document.Authenticate(password);
                    // check authorization result
                    if (authorization == 
                        Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword)
                    {
                        System.Console.WriteLine("The password is incorrect.");
                    }
                    else
                    {
                        System.Console.WriteLine(authorization.ToString());
                        break;
                    }
                }
                return document;
            }
        }
    }
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class OpenEncryptedPdfDocument
            Public Shared Function Open(filename As String) As Vintasoft.Imaging.Pdf.PdfDocument
                Dim document As New Vintasoft.Imaging.Pdf.PdfDocument(filename)
                While True
                    System.Console.Write("Enter password: ")
                    ' get password string
                    Dim password As String = System.Console.ReadLine()
                    ' performs authentication
                    Dim authorization As Vintasoft.Imaging.Pdf.Security.AuthorizationResult = document.Authenticate(password)
                    ' check authorization result
                    If authorization = Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword Then
                        System.Console.WriteLine("The password is incorrect.")
                    Else
                        System.Console.WriteLine(authorization.ToString())
                        Exit While
                    End If
                End While
                Return document
            End Function
        End Class
    End Namespace
    
    


    Вот C#/VB.NET код, который демонстрирует, как загрузить PDF документ, используя класс PdfDocument, для случая, когда заранее не известно, что PDF документ защищен.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class OpenPdfDocument
        {
            public static Vintasoft.Imaging.Pdf.PdfDocument Open(string filename)
            {
                Vintasoft.Imaging.Pdf.PdfDocument document = 
                    new Vintasoft.Imaging.Pdf.PdfDocument(filename);
                if (document.IsEncrypted)
                {
                    while (true)
                    {
                        System.Console.Write("Enter password: ");
                        // get password string
                        string password = System.Console.ReadLine();
                        // performs authentication
                        Vintasoft.Imaging.Pdf.Security.AuthorizationResult authorization = 
                            document.Authenticate(password);
                        // check authorization result
                        if (authorization == Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword)
                        {
                            System.Console.WriteLine("The password is incorrect.");
                        }
                        else
                        {
                            System.Console.WriteLine(authorization.ToString());
                            break;
                        }
                    }
                }
                return document;
            }
        }
    }
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class OpenPdfDocument
            Public Shared Function Open(filename As String) As Vintasoft.Imaging.Pdf.PdfDocument
                Dim document As New Vintasoft.Imaging.Pdf.PdfDocument(filename)
                If document.IsEncrypted Then
                    While True
                        System.Console.Write("Enter password: ")
                        ' get password string
                        Dim password As String = System.Console.ReadLine()
                        ' performs authentication
                        Dim authorization As Vintasoft.Imaging.Pdf.Security.AuthorizationResult = document.Authenticate(password)
                        ' check authorization result
                        If authorization = Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword Then
                            System.Console.WriteLine("The password is incorrect.")
                        Else
                            System.Console.WriteLine(authorization.ToString())
                            Exit While
                        End If
                    End While
                End If
                Return document
            End Function
        End Class
    End Namespace
    
    


    Защита существующего PDF документа

    Для защиты существующего PDF документа его необходимо упаковать с помощью системы шифрования. Это можно сделать с помощью одного из следующих методов PdfDocument.Pack:
    Вот C#/VB.NET код, который демонстрирует, как защитить существующий PDF документ.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class EncryptExistingPdfDocument
        {
            public static void Encrypt(string filename, string userPassword, string ownerPassword)
            {
                // specifies user access permissions
                Vintasoft.Imaging.Pdf.Security.UserAccessPermissions userPermissions =
                    Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInHighResolution |
                    Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInLowResolution;
                // create encryption system
                Vintasoft.Imaging.Pdf.Security.EncryptionSystem documentEncryption =
                    new Vintasoft.Imaging.Pdf.Security.EncryptionSystem(
                        Vintasoft.Imaging.Pdf.Security.EncryptionAlgorithm.RC4, 40, 
                        userPassword, ownerPassword, userPermissions);
                // open PDF document
                using (Vintasoft.Imaging.Pdf.PdfDocument document =
                    new Vintasoft.Imaging.Pdf.PdfDocument(filename))
                {
                    // encrypt PDF document
                    document.Pack(Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14, documentEncryption);
                }
            }
        }
    }
    
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class EncryptExistingPdfDocument
            Public Shared Sub Encrypt(filename As String, userPassword As String, ownerPassword As String)
                ' specifies user access permissions
                Dim userPermissions As Vintasoft.Imaging.Pdf.Security.UserAccessPermissions = Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInHighResolution Or Vintasoft.Imaging.Pdf.Security.UserAccessPermissions.PrintDocumentInLowResolution
                ' create encryption system
                Dim documentEncryption As New Vintasoft.Imaging.Pdf.Security.EncryptionSystem(Vintasoft.Imaging.Pdf.Security.EncryptionAlgorithm.RC4, 40, userPassword, ownerPassword, userPermissions)
                ' open PDF document
                Using document As New Vintasoft.Imaging.Pdf.PdfDocument(filename)
                    ' encrypt PDF document
                    document.Pack(Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14, documentEncryption)
                End Using
            End Sub
        End Class
    End Namespace
    
    


    Расшифровка существующего защищенного PDF документа

    Для расшифровки существующего защищенного PDF документа документ должен быть упакован без использования системы шифрования.

    Вот C#/VB.NET код, который демонстрирует, как сконвертировать существующий защищенный PDF документ в не защищенный PDF документ.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class DecryptPdfDocument
        {
            public static void Decrypt(string filename, string password)
            {
                // open document
                using (Vintasoft.Imaging.Pdf.PdfDocument document = 
                    new Vintasoft.Imaging.Pdf.PdfDocument(filename))
                {
                    // authenticate
                    if (document.Authenticate(password) == Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword)
                        throw new System.Exception("Incorrect password.");
                    // decrypt document
                    Vintasoft.Imaging.Pdf.Security.EncryptionSystem newEncryption = null;
                    document.Pack(document.Format, newEncryption);
                }
            }
        }
    }
    
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class DecryptPdfDocument
            Public Shared Sub Decrypt(filename As String, password As String)
                ' open document
                Using document As New Vintasoft.Imaging.Pdf.PdfDocument(filename)
                    ' authenticate
                    If document.Authenticate(password) = Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword Then
                        Throw New System.Exception("Incorrect password.")
                    End If
                    ' decrypt document
                    Dim newEncryption As Vintasoft.Imaging.Pdf.Security.EncryptionSystem = Nothing
                    document.Pack(document.Format, newEncryption)
                End Using
            End Sub
        End Class
    End Namespace
    
    


    Изменение параметров безопасности и прав доступа к PDF документу

    Для изменения параметров безопасности PDF документа (тип шифрования, пароль, права доступа) документ должен быть упакован с помощью системы шифрования. Это можно сделать с помощью одного из следующих методов PdfDocument.Pack:
    Вот C#/VB.NET код, который демонстрирует, как изменить параметры разрешения доступа пользователя к PDF документу.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class ChangeUserAccessPermissions
        {
            public static void Change(string filename, 
                string userPassword, string ownerPassword, 
                Vintasoft.Imaging.Pdf.Security.UserAccessPermissions newUserPermissions)
            {
                using(Vintasoft.Imaging.Pdf.PdfDocument document = 
                    new Vintasoft.Imaging.Pdf.PdfDocument(filename))
                {
                    if (document.IsEncrypted)
                    {
                        document.Authenticate(ownerPassword);
                        if (document.AuthorizationResult == Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword)
                            document.Authenticate(userPassword);
                        if (document.AuthorizationResult == Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword)
                            throw new System.Exception("Incorrect password.");
                    }
                    Vintasoft.Imaging.Pdf.Security.EncryptionSystem newEnctyptionSystem = 
                        new Vintasoft.Imaging.Pdf.Security.EncryptionSystem(
                            Vintasoft.Imaging.Pdf.Security.EncryptionAlgorithm.RC4, 
                            40, userPassword, ownerPassword, newUserPermissions);
                    document.Pack(document.Format, newEnctyptionSystem);
                }
            }
        }
    }
    
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class ChangeUserAccessPermissions
            Public Shared Sub Change(filename As String, userPassword As String, ownerPassword As String, newUserPermissions As Vintasoft.Imaging.Pdf.Security.UserAccessPermissions)
                Using document As New Vintasoft.Imaging.Pdf.PdfDocument(filename)
                    If document.IsEncrypted Then
                        document.Authenticate(ownerPassword)
                        If document.AuthorizationResult = Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword Then
                            document.Authenticate(userPassword)
                        End If
                        If document.AuthorizationResult = Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword Then
                            Throw New System.Exception("Incorrect password.")
                        End If
                    End If
                    Dim newEnctyptionSystem As New Vintasoft.Imaging.Pdf.Security.EncryptionSystem(Vintasoft.Imaging.Pdf.Security.EncryptionAlgorithm.RC4, 40, userPassword, ownerPassword, newUserPermissions)
                    document.Pack(document.Format, newEnctyptionSystem)
                End Using
            End Sub
        End Class
    End Namespace
    
    


    Редактирование и сохранение защищенного PDF документа

    Защищенный PDF документ можно сохранить с помощью методов PdfDocument.Save и PdfDocument.SaveChanges.

    Вот C#/VB.NET код, который демонстрирует, как добавить страницу в существующий защищенный PDF документ.
    namespace UserGuide.Programming.Pdf.Encryption
    {
        class AddPageToEncryptedPdfDocument
        {
            public static void AddPage(string documentFilename, string newPageImageFilename)
            {
                // open PDF document
                using (Vintasoft.Imaging.Pdf.PdfDocument document = Open(documentFilename))
                {
                    // add page
                    using (Vintasoft.Imaging.VintasoftImage image = 
                        new Vintasoft.Imaging.VintasoftImage(newPageImageFilename))
                        document.Pages.Add(image);
                    // save changes
                    document.SaveChanges();
                }
            }
    
            private static Vintasoft.Imaging.Pdf.PdfDocument Open(string filename)
            {
                Vintasoft.Imaging.Pdf.PdfDocument document = 
                    new Vintasoft.Imaging.Pdf.PdfDocument(filename);
                if (document.IsEncrypted)
                {
                    while (true)
                    {
                        System.Console.Write("Enter password: ");
                        // get password string
                        string password = System.Console.ReadLine();
                        // performs authentication
                        Vintasoft.Imaging.Pdf.Security.AuthorizationResult authorization = 
                            document.Authenticate(password);
                        // check authorization result
                        if (authorization == Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword)
                        {
                            System.Console.WriteLine("The password is incorrect.");
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                return document;
            }
    
        }
    }
    
    Namespace UserGuide.Programming.Pdf.Encryption
        Class AddPageToEncryptedPdfDocument
            Public Shared Sub AddPage(documentFilename As String, newPageImageFilename As String)
                ' open PDF document
                Using document As Vintasoft.Imaging.Pdf.PdfDocument = Open(documentFilename)
                    ' add page
                    Using image As New Vintasoft.Imaging.VintasoftImage(newPageImageFilename)
                        document.Pages.Add(image)
                    End Using
                    ' save changes
                    document.SaveChanges()
                End Using
            End Sub
    
            Private Shared Function Open(filename As String) As Vintasoft.Imaging.Pdf.PdfDocument
                Dim document As New Vintasoft.Imaging.Pdf.PdfDocument(filename)
                If document.IsEncrypted Then
                    While True
                        System.Console.Write("Enter password: ")
                        ' get password string
                        Dim password As String = System.Console.ReadLine()
                        ' performs authentication
                        Dim authorization As Vintasoft.Imaging.Pdf.Security.AuthorizationResult = document.Authenticate(password)
                        ' check authorization result
                        If authorization = Vintasoft.Imaging.Pdf.Security.AuthorizationResult.IncorrectPassword Then
                            System.Console.WriteLine("The password is incorrect.")
                        Else
                            Exit While
                        End If
                    End While
                End If
                Return document
            End Function
    
        End Class
    End Namespace