在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(); } } } }