您好,登錄后才能下訂單哦!
本篇內容主要講解“PDF加密的實現方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PDF加密的實現方法”吧!
在工作中碰到需求是給pdf記性權限加密,區分打開,編輯、打印的權限,并且設置密碼,經過調研有兩種實現方式,但是這兩種方式均不能很好的兼容市面上大多數pdf軟件,并且限制了打印功能以后,幾乎很少有軟件能顯式的要求輸入打印密碼,表現均為打印按鈕被置灰,無法打印,只有在輸入ownerPassword(文件所有者權限)以后,才能夠打印,可以說是很傻了,當實在有這種打印需要輸入密碼界面的需求,請帶著你的刀去和產品重新討論需求
該軟件是市面上比較規范的pdf工具,該軟件詳細pdf權限控制界面如圖所示:
從圖中可以看出:
這款工具有兩個密碼,分別為,用戶權限密碼(打開pdf需要)和所有者權限密碼(編輯等其他所有權限),經測試,所有者權限密碼可以進行查看,例如chrome等其他工具打開時均有輸入密碼的界面
N多個權限
1:允許打印
2:允許更改
以上總共這么多權限,下面就開始我們的實現
pdfbox加密實現方式非常簡單,當然這個類的功能不止加密,還有很多實現,具體參考官方demo和api https://pdfbox.apache.org/docs/2.0.13/javadocs/
pom依賴
<!-- pdfbox 目前最新版本是2.0.16 --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.16</version> </dependency> <!-- --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.57</version> </dependency>
PDFEncryptUtils.java
/** * <p>對pdf進行權限控制</p> * @author Calvin * @date 2019/07/17 * @since v1.0 */ public class PDFEncryptUtils { /** * 加密 * @param fileName 文件名 * @param fileAuth 文件權限 * @throws Exception */ public static void encrypt(String fileName, FileAuth fileAuth) throws Exception { File file = new File(fileName); PDDocument document = PDDocument.load(file); AccessPermission permissions = new AccessPermission(); //此處簡單進行實現,具體還有很多個權限,此處只實現最常用的,打開,編輯,打印 //權限中默認都可以操作 permissions.setCanExtractContent(fileAuth.getOpen() != 1); permissions.setCanModify(fileAuth.getEdit() != 1); permissions.setCanPrint(fileAuth.getPrint() != 1); StandardProtectionPolicy policy = new StandardProtectionPolicy(fileAuth.getOwnerPassword(), fileAuth.getUserPassword(), permissions); SecurityHandler handler = new StandardSecurityHandler(policy); handler.prepareDocumentForEncryption(document); PDEncryption encryption = new PDEncryption(); encryption.setSecurityHandler(handler); document.setEncryptionDictionary(encryption); //保存原路徑 document.save(file.getPath()); } }
FileAuth.java
/** * <p> 用戶權限</p> * * @author Calvin * @date 2019/07/15 * @since v1.0 */ public class FileAuth { /** * 是否可以打開 */ private int open; /** * 是否可以編輯 */ private int edit; /** * 是否可以打印 */ private int print; /** * 所有者權限密碼 */ private String ownerPassword; /** * 用戶權限密碼 */ private String userPassword; public int getOpen() { return open; } public void setOpen(int open) { this.open = open; } public int getEdit() { return edit; } public void setEdit(int edit) { this.edit = edit; } public int getPrint() { return print; } public void setPrint(int print) { this.print = print; } public String getOwnerPassword() { return ownerPassword; } public void setOwnerPassword(String ownerPassword) { this.ownerPassword = ownerPassword; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } }
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.11</version> <!-- 最新版本是7.1.7--> </dependency> <!-- 這里貼一下 <dependency> <groupId>com.itextpdf</groupId> <artifactId>barcodes</artifactId> <version>7.1.7</version> <type>pom</type> </dependency> -->
PDFEncryptUtils.java
/** * 給pdf設置權限 * @param pdfStamper pdf文件 * @param fileAuth 文件權限密碼 * @throws IOException 文件異常 * @throws DocumentException */ public static void encrypt(PdfStamper pdfStamper, FileAuth fileAuth) throws DocumentException, IOException { pdfStamper.setEncryption(null, null, PdfWriter.ALLOW_COPY, true); pdfStamper.setEncryption(null, null, PdfWriter.ALLOW_DEGRADED_PRINTING, true); pdfStamper.setEncryption(null, null, PdfWriter.ALLOW_FILL_IN, true); pdfStamper.setEncryption(null, null, PdfWriter.ALLOW_MODIFY_ANNOTATIONS, true); pdfStamper.setEncryption(null, null, PdfWriter.ALLOW_MODIFY_CONTENTS, true); pdfStamper.setEncryption(null, null, PdfWriter.ALLOW_PRINTING, true); byte[] userpassword = fileAuth.getUserPassword().getBytes(); byte[] owenerpassword = fileAuth.getOwnerPassword().getBytes(); if(fileAuth.getOpen() == 1){ pdfStamper.setEncryption(userpassword, userpassword, PdfWriter.ALLOW_SCREENREADERS, false); } if(fileAuth.getEdit() == 1){ pdfStamper.setEncryption(userpassword, owenerpassword, PdfWriter.ALLOW_PRINTING, false); pdfStamper.setEncryption(userpassword, owenerpassword, PdfWriter.ALLOW_DEGRADED_PRINTING, false); } if(fileAuth.getPrint() == 1){ pdfStamper.setEncryption(userpassword, owenerpassword, PdfWriter.ALLOW_MODIFY_ANNOTATIONS, false); pdfStamper.setEncryption(userpassword, owenerpassword, PdfWriter.ALLOW_MODIFY_CONTENTS, false); pdfStamper.setEncryption(userpassword, owenerpassword, PdfWriter.ALLOW_FILL_IN, false); } pdfStamper.close(); }
Client調用
public static void main(String[] args) throws IOException, DocumentException, NoSuchFieldException, IllegalAccessException { PdfReader reader = new PdfReader("D:\\4028832b6c4af5e2016c4af694310044.pdf"); java.lang.reflect.Field f = reader.getClass().getDeclaredField("encrypted"); f.setAccessible(true); f.set(reader, false); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("D:\\test1.pdf")); FileAuth fileAuth = new FileAuth(); fileAuth.setEdit(1); fileAuth.setOpen(1); fileAuth.setPrint(1); fileAuth.setUserPassword("123456"); fileAuth.setOwnerPassword("654321"); encrypt(stamper, fileAuth); }
1:這兩種做法并不能兼容市面上所有的軟件,并且由一些pdf密碼破解工具,即可進行解密操作,安全的密碼,還是建議使用證書 2:如果限制了打印的權限,那么除非主動去獲取pdf的owner權限,不然打印的按鈕都是disabled,無法進行打印,并且沒有輸入打印密碼的地方
到此,相信大家對“PDF加密的實現方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。