Java實(shí)現(xiàn)PDF文件的分割與加密功能
由于``某些不可抗力原因,公司不允許使用itext系列的jar包,因此系統(tǒng)中使用的相關(guān)jar得替換成開(kāi)源的。經(jīng)比較和嘗試考慮使用org.apache.pdfbox來(lái)替換,同時(shí)修改系統(tǒng)中原有的方法,發(fā)現(xiàn)比itext系列稍顯簡(jiǎn)潔一點(diǎn),記錄如下:
加密文件
/** * 加密文件測(cè)試 * @from fhadmin.cn */ @Test public void encryptTest(){ try { String filePath = "D:\\test\\像李開(kāi)復(fù)一樣思考人生.pdf"; String password = "1234"; PDDocument document = PDDocument.load(new File(filePath)); StandardProtectionPolicy spp = new StandardProtectionPolicy(password, password,new AccessPermission()); document.protect(spp); String newFilePath = "D:\\test\\像李開(kāi)復(fù)一樣思考人生2.pdf"; document.save(newFilePath); document.close(); } catch (IOException e) { e.printStackTrace(); } }
切割文件
/** * 切割文件測(cè)試 * @from fhadmin.cn */ @Test public void extractTest(){ try { String newFilePath = "D:\\test\\像李開(kāi)復(fù)一樣思考人生2.pdf"; String password = "1234"; PDDocument document = PDDocument.load(new File(newFilePath), password);//帶密碼讀取 //從第一頁(yè)截取到第二頁(yè) PageExtractor pageExtractor = new PageExtractor(document, 1, 2); PDDocument extract = pageExtractor.extract(); extract.save("D:\\test\\像李開(kāi)復(fù)一樣思考人生free.pdf"); extract.close(); document.close(); } catch (IOException e) { e.printStackTrace(); } }
生成封面圖
/** * 切割文件測(cè)試 * @from fhadmin.cn */ @Test public void createCoverPicTest(){ try { String pdfPath = "D:\\test\\像李開(kāi)復(fù)一樣思考人生.pdf"; File file = new File(pdfPath); //order目錄 String orderPath = file.getParent(); //轉(zhuǎn)換后的img目錄 String bookName = file.getName().substring(0,file.getName().lastIndexOf(".")); String imgPath = orderPath + File.separator +bookName+".png"; log.debug("pdf封面圖生成成功:{}", imgPath); PDDocument pdDocument = PDDocument.load(new File(pdfPath)); PDFRenderer renderer = new PDFRenderer(pdDocument); /* 第二位參數(shù)越大轉(zhuǎn)換后越清晰,相對(duì)轉(zhuǎn)換速度越慢 */ BufferedImage image = renderer.renderImageWithDPI(0, 150); ImageIO.write(image, "png", new File(imgPath)); } catch (IOException e) { e.printStackTrace(); } }
總結(jié)一下,現(xiàn)在的工具都比較豐富了,不需要自己去造輪子,
step-1 去maven倉(cāng)庫(kù)檢索同類型的包,比較一下熱度和使用人數(shù)
step-2 下載對(duì)應(yīng)包的source源代碼,看一下框架整體結(jié)構(gòu),里面都有哪些package和類,不知道類是干什么的,可以看一下類上面的注釋,一般都是比較簡(jiǎn)單的英文
step-3 動(dòng)手寫(xiě)單元測(cè)試進(jìn)行驗(yàn)證。
到此這篇關(guān)于Java實(shí)現(xiàn)PDF文件的分割與加密功能的文章就介紹到這了,更多相關(guān)Java 文件分割 加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的操作方法
這篇文章主要介紹了SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03java 數(shù)據(jù)結(jié)構(gòu)與算法 (快速排序法)
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)與算法(快速排序法),,快速排序法是實(shí)踐中的一種快速的排序算法,在c++或?qū)ava基本類型的排序中特別有用,下面我們一起進(jìn)入文章學(xué)習(xí)更詳細(xì)的內(nèi)容吧,需要的朋友可以參考下2022-02-02Java中 this和super的用法與區(qū)別小結(jié)
在Java的學(xué)習(xí)與開(kāi)發(fā)者我們經(jīng)常遇到this和super關(guān)鍵字,本文主要介紹了Java中 this和super的用法與區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12java多線程并發(fā)中使用Lockers類將多線程共享資源鎖定
Lockers在多線程編程里面一個(gè)重要的概念是鎖定,如果一個(gè)資源是多個(gè)線程共享的,為了保證數(shù)據(jù)的完整性,在進(jìn)行事務(wù)性操作時(shí)需要將共享資源鎖定,這樣可以保證在做事務(wù)性操作時(shí)只有一個(gè)線程能對(duì)資源進(jìn)行操作,下面看一個(gè)示例2014-01-01Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解
這篇文章主要介紹了Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解,對(duì)象的克隆是指創(chuàng)建一個(gè)新的對(duì)象,且新的對(duì)象的狀態(tài)與原始對(duì)象的狀態(tài)相同,當(dāng)對(duì)克隆的新對(duì)象進(jìn)行修改時(shí),不會(huì)影響原始對(duì)象的狀態(tài),需要的朋友可以參考下2023-08-08SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Spring?boot?啟動(dòng)流程及外部化配置方法
平時(shí)我們開(kāi)發(fā)Spring boot 項(xiàng)目的時(shí)候,一個(gè)SpringBootApplication注解加一個(gè)main方法就可以啟動(dòng)服務(wù)器運(yùn)行起來(lái),那它到底是怎么運(yùn)行起來(lái)的呢?這篇文章主要介紹了Spring?boot?啟動(dòng)流程及外部化配置,需要的朋友可以參考下2022-12-12