批量比较两个PDF文档(PDFUtil,通过文本或者图像进行比较)第一篇
之前寫過一些關(guān)于PDF的文章:
- Python圖片裁剪的兩種方式——Pillow和OpenCV
- Java+PDFBox將PDF轉(zhuǎn)成圖片
- 【PyMuPDF和pdf2image】Python將PDF轉(zhuǎn)成圖片
在我的項(xiàng)目中,我需要比較大量的PDF文檔,確認(rèn)兩份PDF文檔是否一致,如果僅僅憑借著手動(dòng)去逐一比較,可能很快就陣亡了。另外也有一些軟件可以輔助的去對(duì)比,但依然是手動(dòng)。
在找不到任何比較好用的工具來比較PDF文檔的前提下,而且不希望只是進(jìn)行簡(jiǎn)單的文本進(jìn)行比較,而是想要尋找一些基于圖像對(duì)PDF進(jìn)行比較,找到之間的像素差異的方法。
所以我創(chuàng)建了一個(gè)簡(jiǎn)單的Java庫(基于apache-pdf-box – Apache License, Version 2.0),可以通過文本/圖像(Text/Image)模式比較指定的PDF文檔,并且高亮差異;從PDF文檔中提取圖像,并將圖像另存為。
Maven 依賴:
使用時(shí)應(yīng)該包含下面的POM依賴項(xiàng):
ZIP下載地址:
taguru-pdf-utility-v1.1.zip (17288 downloads)
Github:
想要獲取源碼包請(qǐng)點(diǎn)擊這里
使用說明:
1、獲取PDF頁數(shù)
import com.testautomationguru.utility.PDFUtil;PDFUtil pdfUtil = new PDFUtil(); pdfUtil.getPageCount("c:/sample.pdf"); //返回PDF的頁數(shù)2、以純文本的方式獲取頁面內(nèi)容
//以Text返回PDF的內(nèi)容 - 所有頁 pdfUtil.getText("c:/sample.pdf"); // 以Text返回PDF第2頁的內(nèi)容 pdfUtil.getText("c:/sample.pdf",2); // 以Text返回PDF第5~8頁的內(nèi)容 pdfUtil.getText("c:/sample.pdf", 5, 8);3、從PDF中提取附加圖像
//設(shè)置我們需要存儲(chǔ)圖像的路徑 pdfUtil.setImageDestinationPath("c:/imgpath"); pdfUtil.extractImages("c:/sample.pdf");// 從PDF的第3頁中提取并保存內(nèi)容 pdfUtil.extractImages("c:/sample.pdf", 3);// 從PDF的第2頁中提取并保存內(nèi)容 pdfUtil.extractImages("c:/sample.pdf", 2, 2);4、將PDF頁面存儲(chǔ)為圖像
//設(shè)置我們需要存儲(chǔ)圖像的路徑pdfUtil.setImageDestinationPath("c:/imgpath");pdfUtil.savePdfAsImage("c:/sample.pdf");5、以文本模式比較PDF文件(速度更快-但不比較PDF中的格式、圖像等)
String file1="c:/files/doc1.pdf"; String file1="c:/files/doc2.pdf";// 比較PDF文檔并返回 True or False // 兩個(gè)PDF完全一樣返回True, 不一樣返回False pdfUtil.compare(file1, file2);// 僅比較第3頁 pdfUtil.compare(file1, file2, 3, 3);// 比較第1~5頁 pdfUtil.compare(file1, file2, 1, 5);6、在文本模式下排除某些文本再對(duì)PDF文件進(jìn)行比較
String file1="c:/files/doc1.pdf"; String file1="c:/files/doc2.pdf";//對(duì)比之前刪除有可能的文本內(nèi)容 pdfutil.excludeText("1998", "testautomation");//使用正則表達(dá)式,在比較之前刪除指定內(nèi)容 // \\d+ 在比較之前刪除PDF中的所有數(shù)字 \\d+是數(shù)字的正則表達(dá)式 pdfutil.excludeText("\\d+");// 比較PDF文檔并返回一個(gè)布爾值 // True表示相同; false 表示不一樣. pdfUtil.compare(file1, file2);// 僅比較第3頁 pdfUtil.compare(file1, file2, 3, 3);// 比較第1~5頁 pdfUtil.compare(file1, file2, 1, 5);7、以視圖模式比較PDF文件(較慢–對(duì)PDF文檔進(jìn)行像素逐一比較 – 高亮PDF差異并將結(jié)果存儲(chǔ)為圖像)
String file1="c:/files/doc1.pdf"; String file1="c:/files/doc2.pdf";// 比較PDF文檔并返回一個(gè)布爾值 // 兩個(gè)PDF完全一樣返回True, 不一樣返回False // 默認(rèn)是 CompareMode.TEXT_MODE pdfUtil.setCompareMode(CompareMode.VISUAL_MODE); pdfUtil.compare(file1, file2);// 單獨(dú)對(duì)比第3頁 pdfUtil.compare(file1, file2, 3, 3);// 對(duì)比PDF第1~5頁 pdfUtil.compare(file1, file2, 1, 5);//需要的話,可以將不同的地方高亮并以圖像存儲(chǔ)到你的本地 pdfUtil.highlightPdfDifference(true); pdfUtil.setImageDestinationPath("c:/imgpath"); pdfUtil.compare(file1, file2);樣例:
比如我有下面這樣的兩個(gè)PDF文檔。
使用PDFUtility比較之后會(huì)給出結(jié)果,如下圖,默認(rèn)情況下使用洋紅色(Magenta)高亮差異的區(qū)域,顏色可以更改。
后續(xù)將會(huì)繼續(xù)實(shí)現(xiàn)的功能:
- 在視圖模式VISUAL_MODE下比較PDF文件時(shí),忽略某些區(qū)域。
- 在視圖模式VISUAL_MODE下比較PDF文件時(shí),根據(jù)一定的閾值/靈敏度返回 true / false。
總結(jié)
以上是生活随笔為你收集整理的批量比较两个PDF文档(PDFUtil,通过文本或者图像进行比较)第一篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能优化:使用距离平方而不是距离
- 下一篇: 主成分分析的步骤