PDF: Защита PDF документа
В этом разделе
VintaSoft PDF .NET Plug-in позволяет:
- Создать защищенный PDF документ, который защищен с помощью алгоритма ARC4 или AES
- Установить права доступа к PDF документу
- Открыть и прочитать защищенный PDF документ
- Редактировать и сохранять защищенный PDF документ
- Изменять параметры безопасности PDF документа
- Сконвертировать защищенный PDF документ в не защищенный PDF документ
Система шифрования 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