前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >批量比较两个PDF文档(PDFUtil通过文本/者图像进行比较)

批量比较两个PDF文档(PDFUtil通过文本/者图像进行比较)

作者头像
软测小生
发布2020-11-10 10:46:33
2.7K1
发布2020-11-10 10:46:33
举报
文章被收录于专栏:软测小生软测小生

之前写过一些关于PDF的文章:

前言:

在我的项目中,我需要比较大量的PDF文档,确认两份PDF文档是否一致,如果仅仅凭借着手动去逐一比较,可能很快就阵亡了。另外也有一些软件可以辅助的去对比,但依然是手动。

在找不到任何比较好用的工具来比较PDF文档的前提下,而且不希望只是进行简单的文本进行比较,而是想要寻找一些基于图像对PDF进行比较,找到之间的像素差异的方法。

所以我创建了一个简单的Java库(基于apache-pdf-box – Apache License, Version 2.0),可以通过文本/图像(Text/Image)模式比较指定的PDF文档,并且高亮差异;从PDF文档中提取图像,并将图像另存为。

项目Maven 依赖:

使用时应该包含下面的POM依赖项:

代码语言:javascript
复制
<dependency>
   <groupId>com.testautomationguru.pdfutil</groupId>
   <artifactId>pdf-util</artifactId>
   <version>0.0.1</version>
</dependency>

ZIP下载地址:

taguru-pdf-utility-v1.1.zip (17288 downloads)

Github: 想要获取源码包请点击这里(https://github.com/vinsguru/pdf-util)

使用说明:

1、获取PDF页数

代码语言:javascript
复制
import com.testautomationguru.utility.PDFUtil;

PDFUtil pdfUtil = new PDFUtil();
pdfUtil.getPageCount("c:/sample.pdf"); //返回PDF的页数

2、以纯文本的方式获取页面内容

代码语言:javascript
复制
//以Text返回PDF的内容 - 所有页
pdfUtil.getText("c:/sample.pdf"); 

// 以Text返回PDF第2页的内容
pdfUtil.getText("c:/sample.pdf",2); 

// 以Text返回PDF第5~8页的内容
pdfUtil.getText("c:/sample.pdf", 5, 8);

3、从PDF中提取附加图像

代码语言:javascript
复制
//设置我们需要存储图像的路径
pdfUtil.setImageDestinationPath("c:/imgpath");
pdfUtil.extractImages("c:/sample.pdf");

// 从PDF的第3页中提取并保存内容
pdfUtil.extractImages("c:/sample.pdf", 3);

// 从PDF的第2页中提取并保存内容
pdfUtil.extractImages("c:/sample.pdf", 2, 2);

4、将PDF页面存储为图像

代码语言:javascript
复制
//设置我们需要存储图像的路径
 pdfUtil.setImageDestinationPath("c:/imgpath");
 pdfUtil.savePdfAsImage("c:/sample.pdf");

5、以文本模式比较PDF文件(速度更快-但不比较PDF中的格式、图像等)

代码语言:javascript
复制
String file1="c:/files/doc1.pdf";
String file1="c:/files/doc2.pdf";

// 比较PDF文档并返回 True or False
// 两个PDF完全一样返回True, 不一样返回False
pdfUtil.compare(file1, file2);

// 仅比较第3页
pdfUtil.compare(file1, file2, 3, 3);

// 比较第1~5页
pdfUtil.compare(file1, file2, 1, 5);

6、在文本模式下排除某些文本再对PDF文件进行比较

代码语言:javascript
复制
String file1="c:/files/doc1.pdf";
String file1="c:/files/doc2.pdf";

//对比之前删除有可能的文本内容
pdfutil.excludeText("1998", "testautomation");

//使用正则表达式,在比较之前删除指定内容
// \\d+ 在比较之前删除PDF中的所有数字 \\d+是数字的正则表达式
pdfutil.excludeText("\\d+");

// 比较PDF文档并返回一个布尔值
// True表示相同;false 表示不一样.
pdfUtil.compare(file1, file2);

// 仅比较第3页
pdfUtil.compare(file1, file2, 3, 3);

// 比较第1~5页
pdfUtil.compare(file1, file2, 1, 5);

7、以视图模式比较PDF文件(较慢--对PDF文档进行像素逐一比较 -- 高亮PDF差异并将结果存储为图像)

代码语言:javascript
复制
String file1="c:/files/doc1.pdf";
String file1="c:/files/doc2.pdf";

// 比较PDF文档并返回一个布尔值
// 两个PDF完全一样返回True, 不一样返回False
// 默认是 CompareMode.TEXT_MODE
pdfUtil.setCompareMode(CompareMode.VISUAL_MODE);
pdfUtil.compare(file1, file2);

// 单独对比第3页
pdfUtil.compare(file1, file2, 3, 3);

// 对比PDF第1~5页
pdfUtil.compare(file1, file2, 1, 5);

//需要的话,可以将不同的地方高亮并以图像存储到你的本地
pdfUtil.highlightPdfDifference(true);
pdfUtil.setImageDestinationPath("c:/imgpath");
pdfUtil.compare(file1, file2);

样例:

比如我有下面这样的两个PDF文档。

使用PDFUtility比较之后会给出结果,如下图,默认情况下使用洋红色(Magenta)高亮差异的区域,颜色可以更改。

比较结果

后续将会继续实现的功能:

  • 在视图模式VISUAL_MODE下比较PDF文件时,忽略某些区域。
  • 在视图模式VISUAL_MODE下比较PDF文件时,根据一定的阈值/灵敏度返回 true / false。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软测小生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档