Есть ли у кого-нибудь представление о том, как установить пароль для существующего PDF-файла с помощью openpdf java lib? - PullRequest
0 голосов
/ 12 июля 2020

как установить пароль для существующего PDF с помощью OpenPdf java lib? Я пробовал использовать код ниже, но создается новый PDF-файл без содержимого

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class PasswordProtectedPDF {
  public static final String ENCRYPTED_PDF = "F://knpcode//result//OpenPDF//PP.pdf";
  // User and owner password
  final static String USER_PASSWORD = "user";
  final static String OWNER_PASSWORD = "owner";
  public static void main(String[] args) {
    try {
      Document doc = new Document();
      PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(ENCRYPTED_PDF));
      // set password, user permissions and encryption
      writer.setEncryption(USER_PASSWORD.getBytes(), OWNER_PASSWORD.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128); 
      doc.open();
 
     
      doc.close();
      writer.close();
    } catch (DocumentException | FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Чтобы добавить пароль к новому PDF-файлу, мы используем метод PdfWriter.setEncryption () .

PdfStamper API используется, когда нам нужно защитить существующий PDF . При создании экземпляра PdfStamper он принимает исходный файл как PdfReader и целевой файл как OutputStream. PdfStamper может добавлять дополнительный контент в PDF при записи в целевой файл. PdfStamper.setEncryption использует те же аргументы, что и PdfWriter.setEncryption при настройке шифрования для существующего PDF.

Обновили свой код, чтобы использовать PDFStamper вместо PDFWriter.


    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import com.lowagie.text.Paragraph;
    import com.lowagie.text.pdf.PdfStamper;
    
    public class PasswordProtectedPDF {
      // User and owner password
      final static String USER_PASSWORD = "user";
      final static String OWNER_PASSWORD = "owner";
      public static void main(String[] args) {
        try {
          File f = new File("F://knpcode//result//OpenPDF//ENCRYPTED_PP.pdf");
          FileOutputStream out = new FileOutputStream(f);
          PdfReader reader = new PdfReader("F://knpcode//result//OpenPDF//PP.pdf");
          PdfStamper stamper = new PdfStamper(reader, out);
          
          // set password, user permissions and encryption
          stamper.setEncryption(USER_PASSWORD.getBytes(), OWNER_PASSWORD.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);

          // Don't forget to add this line as no bytes are written to that output stream up until you close the PdfStamper instance. 
          stamper.close();

        } catch ( IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }

0 голосов
/ 13 июля 2020

Используя Google "java пример пароля openpdf" Я нашел этот веб-сайт: https://knpcode.com/java-programs/password-protected-pdf-using-openpdf-java/ с некоторой информацией по вашему вопросу.

Вот две программы-примеры (просто скопируйте / вставьте их, а не тест). Не забудьте включить Bouncy Castle в качестве поставщика безопасности.

Зашифровать («безопасный») PDF-файл:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class PasswordProtectedPDF {
  public static final String ENCRYPTED_PDF = "F://knpcode//result//OpenPDF//PP.pdf";
  // User and owner password
  final static String USER_PASSWORD = "user";
  final static String OWNER_PASSWORD = "owner";
  public static void main(String[] args) {
    try {
      Document doc = new Document();
      PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(ENCRYPTED_PDF));
      // set password, user permissions and encryption
      writer.setEncryption(USER_PASSWORD.getBytes(), OWNER_PASSWORD.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128); 
      doc.open();
      Paragraph para = new Paragraph("Password protected PDF where only content printing is permitted content can't be copied.");
      doc.add(para);
      doc.close();
      writer.close();
    } catch (DocumentException | FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

Чтение PDF-файла, защищенного паролем, с использованием OpenPDF:

import java.io.IOException;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.parser.PdfTextExtractor;

public class ReadPDF {
  // PDF to be read
  public static final String READ_PDF = "F://knpcode//result//OpenPDF//PP.pdf";
  final static String OWNER_PASSWORD = "owner";
  public static void main(String[] args) {
    PdfReader pdfreader = null;
    try {
      pdfreader = new PdfReader(READ_PDF, OWNER_PASSWORD.getBytes());
      // get pages in PDF
      int pages = pdfreader.getNumberOfPages();
      PdfTextExtractor pdfTextExtractor = new PdfTextExtractor(pdfreader);
      // Iterate through pages to read content
      for(int i = 1; i <= pages; i++) {
        // Extract content of each page
        String contentOfPage = pdfTextExtractor.getTextFromPage(i, true);
        System.out.println(contentOfPage );
      }         
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally {
      if(pdfreader != null) {
        pdfreader.close();
      }
    }   
  }
}
...