91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PDF加密的實現方法

發布時間:2021-07-09 17:38:47 來源:億速云 閱讀:320 作者:chen 欄目:大數據

本篇內容主要講解“PDF加密的實現方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PDF加密的實現方法”吧!

pdf加密實現

在工作中碰到需求是給pdf記性權限加密,區分打開,編輯、打印的權限,并且設置密碼,經過調研有兩種實現方式,但是這兩種方式均不能很好的兼容市面上大多數pdf軟件,并且限制了打印功能以后,幾乎很少有軟件能顯式的要求輸入打印密碼,表現均為打印按鈕被置灰,無法打印,只有在輸入ownerPassword(文件所有者權限)以后,才能夠打印,可以說是很傻了,當實在有這種打印需要輸入密碼界面的需求,請帶著你的刀去和產品重新討論需求

Adobe Acrobat DC

該軟件是市面上比較規范的pdf工具,該軟件詳細pdf權限控制界面如圖所示:

PDF加密的實現方法

從圖中可以看出:
這款工具有兩個密碼,分別為,用戶權限密碼(打開pdf需要)和所有者權限密碼(編輯等其他所有權限),經測試,所有者權限密碼可以進行查看,例如chrome等其他工具打開時均有輸入密碼的界面

N多個權限
1:允許打印


PDF加密的實現方法


2:允許更改


PDF加密的實現方法

以上總共這么多權限,下面就開始我們的實現


通過pdfbox實現

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;
	}
}

利用itext-pdf給pdf加密
<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加密的實現方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

pdf
AI

札达县| 房产| 南京市| 临夏市| 浠水县| 新野县| 庆安县| 城步| 若尔盖县| 锡林郭勒盟| 瑞安市| 资兴市| 南投县| 库伦旗| 通山县| 巨鹿县| 邻水| 东乌珠穆沁旗| 汤阴县| 白朗县| 井冈山市| 亚东县| 嘉禾县| 盱眙县| 陕西省| 大悟县| 磐安县| 巴楚县| 眉山市| 葵青区| 遵义县| 壶关县| 宁国市| 武威市| 衡山县| 安丘市| 新泰市| 班戈县| 阿荣旗| 抚松县| 沾益县|