2013-02-09 2 views
2

Я попробовал этот код, чтобы зашифровать мой PDF, так что пользователи не могут копировать содержимое из PDF (только для тестирования, я знаю, что есть что-то, как OCR'ing: р)Шифрование PDF с IText запретить копирование содержимого и печать

import java.io.FileOutputStream; 

import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfStamper; 
import com.itextpdf.text.pdf.PdfWriter; 

public class EncryptPDF { 

private static final String INPUT_FILENAME = "/tmp/test.pdf"; 
private static final String OUTPUT_FILENAME = "/tmp/test_encrypted.pdf"; 
private static final String USER_PASSWORD = ""; 
private static final String OWNER_PASSWORD = "foobar"; 

public static void main(String[] args) { 
    PdfReader reader = null; 
    FileOutputStream out = null; 
    PdfStamper stamper = null; 

    try { 
     // Define input 
     reader = new PdfReader(INPUT_FILENAME); 

     // Define output 
     out = new FileOutputStream(OUTPUT_FILENAME); 

     // Encrypt document 
     stamper = new PdfStamper(reader, out); 
     stamper.setEncryption(USER_PASSWORD.getBytes(), OWNER_PASSWORD.getBytes(), ~(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING), PdfWriter.STANDARD_ENCRYPTION_128); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
     if (stamper != null) { 
      try { 
       stamper.close(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
     if (out != null) { 
      try { 
       out.close(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

} 
} 

... Но когда я открываю PDF-файл, я все равно могу выбрать его содержимое. Я использую iText 5.0.2.

Любая идея о том, что я делаю неправильно?

+0

Просьба также предоставить предоставленный PDF-файл. – mkl

+0

Простое предоставление только разрешений, которые вы хотите разрешить, вместо того, чтобы отрицать права на совместное использование OR-ed, может это сделать. Почему вы используете там отрицание? –

+0

@mkl: это тот, который вы можете использовать: http://www.selab.isti.cnr.it/ws-mate/example.pdf –

ответ

1

Как уже упоминалось в моем комментарии к этому вопросу, запустив пример кода, как результаты в NullPointerException во stamper.close() --- что вполне естественно, так как вы сначала закрыть PdfReader, а затем в PdfStamper, но последний close() метод обращается к PdfReader (уже закрытой сейчас) для его работы.

Когда я запускаю свой код с порядком закрытия PdfReader и PdfWriter обращено, хотя, я получаю правильный результат файл с правами доступа в соответствии с требованиями:

document properties of protected PDF showing print and copy as disabled

PS: Я с использованием iText версии 5.3.5; если реверсирование порядка вызовов close() не поможет в вашем случае, вы можете обновить его с версии 5.0.2.

+0

Я не получал NPE с 5.0.2, но я получаю его с 5.3.5. Я все еще не могу зашифровать PDF из-за этой ошибки: Вызвано: java.lang.ClassNotFoundException: org.bouncycastle.asn1.ASN1Primitive. Я буду сегодня вечером Google для решения этой проблемы. –

+0

Какие JAR вы используете Bouncycastles? –

+1

Nevermind, получил его работу с: bcprov-jdk14-1.47.jar и bcprov-ext-jdk14-1.47.jar –

Смежные вопросы