Блокировка PDF от редактирования с помощью iTextSharp - PullRequest
9 голосов
/ 07 декабря 2011

Я создал C # -программу, использующую iTextSharp для чтения PDF, добавления социального DRM-контента и последующего сохранения файла.Как заблокировать этот новый PDF от дальнейшего редактирования?

Я хочу, чтобы пользователь мог просматривать файл без ввода пароля, и я не против операций выбора / копирования, но я не против возможности удалить социальную DRM.

1 Ответ

18 голосов
/ 07 декабря 2011

Зашифруйте ваш PDF документ. Простой HTTP Handler рабочий пример для начала работы:

<%@ WebHandler Language="C#" Class="lockPdf" %>
using System;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.pdf;

public class lockPdf : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    HttpServerUtility Server = context.Server;
    HttpResponse Response = context.Response;
    Response.ContentType = "application/pdf";
    using (Document document = new Document()) {
      PdfWriter writer = PdfWriter.GetInstance(
        document, Response.OutputStream
      );
      writer.SetEncryption(
// null user password => users can open document __without__ pasword
        null,
// owner password => required to __modify__ document/permissions        
        System.Text.Encoding.UTF8.GetBytes("ownerPassword"),
/*
 * bitwise or => see iText API for permission parameter:
 * http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfWriter.html
 */
        PdfWriter.ALLOW_PRINTING
            | PdfWriter.ALLOW_COPY
        , 
// encryption level also in documentation referenced above        
        PdfWriter.ENCRYPTION_AES_128
      );
      document.Open();
      document.Add(new Paragraph("hello world"));
    }
  }
  public bool IsReusable { get { return false; } }
}

Встроенные комментарии должны быть самоочевидными. См. Документацию PdfWriter .

.

Вы также можете зашифровать документ PDF, используя объект PdfReader, используя класс PdfEncryptor . Другими словами, вы также можете сделать что-то вроде этого (не проверено):

PdfReader reader = new PdfReader(INPUT_FILE);
using (MemoryStream ms = new MemoryStream()) {
  using (PdfStamper stamper = new PdfStamper(reader, ms)) {
    // add your content
  }
  using (FileStream fs = new FileStream(
    OUTPUT_FILE, FileMode.Create, FileAccess.ReadWrite))
  {
    PdfEncryptor.Encrypt(
      new PdfReader(ms.ToArray()),
      fs,
      null,
      System.Text.Encoding.UTF8.GetBytes("ownerPassword"),
      PdfWriter.ALLOW_PRINTING
          | PdfWriter.ALLOW_COPY,
      true
    );
  }  
}
...