Как добавить в PDF только пароль пользователя без пароля владельца с помощью iText

Как добавить только пароль пользователя в файл pdf без добавления пароля владельца с помощью iText? Насколько я понимаю, это можно сделать, только добавив пароль пользователя вместе с паролем владельца.


person imgen    schedule 20.01.2013    source источник
comment
Как вы ожидаете, что PDF-файл с паролем пользователя, но без пароля владельца, будет вести себя? Любой, кто не идентифицирует себя по паролю, считается владельцем документа и, таким образом, вероятно, имеет больше прав, чем кто-либо, идентифицирующий себя по паролю пользователя?   -  person mkl    schedule 21.01.2013
comment
Это то, чего хотел мой заказчик, лично мне это не нравится.   -  person imgen    schedule 22.01.2013
comment
Попросите своего клиента предоставить образец PDF-файла с нужными ему настройками безопасности. Если он предоставит образец, осмотрите его. Я не удивлюсь, если в этом PDF-файле будут и пароль пользователя, и пароль владельца, но один из них будет либо паролем по умолчанию, либо случайным.   -  person mkl    schedule 22.01.2013
comment
Какой тогда пароль владельца по умолчанию? Я смущен   -  person imgen    schedule 22.01.2013
comment
Если вы ограничиваете разрешения с помощью зашифрованных разрешений, но не требуете, чтобы пользователь вводил пароль при открытии PDF-файла, PDF-файл фактически зашифровывается с использованием пароля пользователя по умолчанию, определенного в спецификации (и, следовательно, общеизвестного). Возможно, ваш клиент или его программное обеспечение также реализовали использование этого пароля по умолчанию для пароля владельца. Придется осматривать.   -  person mkl    schedule 22.01.2013
comment
В спецификации фактически говорится, что при вычислении соответствующих записей словаря шифрования: Если нет пароля владельца, используйте вместо него пароль пользователя (Алгоритм 3: вычисление значения O (пароль владельца) словаря шифрования) в ISO 32000-1 < / а>). Вы можете сделать это в iText, используя тот же пароль, что и у владельца, и в качестве пароля пользователя. @Bruno всегда полон удивления, эта спецификация.   -  person mkl    schedule 22.01.2013


Ответы (2)


Шифрование существующего PDF выполняется следующим образом:

public void encryptPdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.setEncryption(USER, OWNER,
    PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
    stamper.close();
    reader.close();
}

См. http://itextpdf.com/examples/iia.php?id=219

Если OWNER null, то будет сгенерирован случайный пароль владельца (который никто не знает). Может быть, это то, что имеет в виду ваш клиент. Как уже объяснялось в mkl, на самом деле нет смысла иметь PDF-файл с паролем ПОЛЬЗОВАТЕЛЯ, но без пароля ВЛАДЕЛЬЦА.

person Bruno Lowagie    schedule 22.01.2013
comment
Хорошо, честно, я думаю, мне придется принять это как ограничение iText. - person imgen; 22.01.2013
comment
Это не ограничение iText; это ограничение, присущее ISO-32000-1. Я почти уверен, что у Foxxit есть такое же ограничение; возможно, они используют стандартный пароль владельца (вы тоже можете это сделать). - person Bruno Lowagie; 22.01.2013
comment
Какой стандартный пароль владельца? Извините, я не специалист по PDF, так что просветите меня. - person imgen; 22.01.2013
comment
Возможно, Foxxit выбрал 32-символьный пароль, который поставляется с Foxxit, и, возможно, они всегда используют один и тот же пароль. - person Bruno Lowagie; 22.01.2013
comment
Проблема в том, что у меня нет этого пароля, думаю, мне придется использовать свой стандартный пароль и т. Д. :) - person imgen; 22.01.2013

Следующий код - это то, что вам нужно, чтобы добавить пароль владельца.

  JRPdfExporter exporter = new JRPdfExporter();       
  exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperprintobj);
  exporter.setParameter(JRExporterParameter.OUTPUT_FILE,new File(fileName));
  exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
  exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY, Boolean.TRUE);
  //exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD, "jasper");
  exporter.setParameter(JRPdfExporterParameter.OWNER_PASSWORD, "reports");
  exporter.setParameter(
    JRPdfExporterParameter.PERMISSIONS, 
    new Integer(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING)
    );
  exporter.exportReport(); // finally export as pdf

Используйте этот код в java, где вы создаете pdf.

person Nagarajan S R    schedule 22.01.2013
comment
добавление шифрования зависит от вас. но это функция безопасности, которую я рекомендую - person Nagarajan S R; 22.01.2013
comment
Я не добавляю пароль владельца, мой клиент хочет только добавить пароль пользователя. Он говорит, что определенное программное обеспечение, такое как foxit, может это делать, поэтому нам нужно его добавить. И я говорю о добавлении в существующие PDF-файлы, а не о создании нового. - person imgen; 22.01.2013