在Java中使用OpenPDF进行密码保护的PDF

时间:2020-01-09 10:35:35  来源:igfitidea点击:

在本文中,我们将介绍如何使用OpenPDF库在Java中创建受密码保护的PDF,以及如何使用OpenPDF在Java中读取加密的PDF。

OpenPDF是具有LGPL和MPL许可证的开源软件。要了解有关OpenPDF库和PDF示例的更多信息,请查看此文章。使用OpenPDF教程在Java中生成PDF。

使用OpenPDF进行密码保护的PDF

为了创建加密的PDF,需要执行以下步骤。

  • 获取PDFWriter的实例。
  • 使用PDFWriter的setEncryption()方法设置用户和所有者的密码,打开权限和加密类型。
  • 用户和所有者密码可以为null或者为空。
  • 文档的打开权限可以是AllowPrinting,AllowModifyContents,AllowCopy,AllowModifyAnnotations,AllowFillIn,AllowScreenReaders,AllowAssembly和AllowDegradedPrinting。可以通过对权限进行合并来组合权限。
  • 加密类型可以是STANDARD_ENCRYPTION_40,STANDARD_ENCRYPTION_128或者ENCRYPTION_AES128中的一种。可以选择对DO_NOT_ENCRYPT_METADATA进行或者运算,以明文形式输出元数据。
  • 为了加密PDF,我们还需要Bouncy Castle Provider。 Bouncy Castle Crypto软件包是密码算法的Java实现。 Maven依赖对于相同的是
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.61</version>
</dependency>

使用OpenPDF Java程序加密的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://theitroad//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();
    }
  }
}

使用OpenPDF读取受密码保护的PDF

要读取受密码保护的PDF,我们需要在创建PDFReader实例时将所有者密码作为字节数组传递。

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://theitroad//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();
      }
    }	
  }
}