从PDF中提取指定内容的文本(需要去重)
程序员文章站
2022-07-05 10:57:15
我们有时候会遇到一个非常大的PDF文件需要处理,里面内容很多(页码达到几万数量级)比如代码扫漏平台(奇安信代码卫士)出的扫漏报告,我这里有一个项目扫漏之后的报告居然有46946页之多。而从这份文档里找出类似于下图代码缺陷的爆发行文字,数量少的话或许还行,如果一个漏洞上达几千个缺陷,这个文档无论如何让人读起来也是非常枯燥与费劲的,那么有没有办法从这浩瀚的文档中提出自己想要的漏洞代码爆发行呢(比如提出指定范围页码的爆发行文档即可,然后提取内容输出到txt中)上图这个缺陷提示有1387之多,实.....
我们有时候会遇到一个非常大的PDF文件需要处理,里面内容很多(页码达到几万数量级)比如代码扫漏平台(奇安信代码卫士)出的扫漏报告,我这里有一个项目扫漏之后的报告居然有46946页之多。
而从这份文档里找出类似于下图代码缺陷的爆发行文字,数量少的话或许还行,如果一个漏洞上达几千个缺陷,这个文档无论如何让人读起来也是非常枯燥与费劲的,那么有没有办法从这浩瀚的文档中提出自己想要的漏洞代码爆发行呢(比如提出指定范围页码的爆发行文档即可,然后提取内容输出到txt中)
上图这个缺陷提示有1387之多,实际上这里的数量其实是不准确的,有很多是重复的。
本例用到了pdf组件 Free Spire.PDF 下方提供的jar包的官方下载地址
在使用以下代码前,你需要下载Free Spire.PDF for JAVA包并解压缩,然后从lib文件夹下,导入Spire.Pdf.jar包和Spire.Common.jar包到你的Java应用程序中:(更正:以前的旧版本有2个jar包,现在的新版本糅合到一个jar包了)
下面提供代码进行提取
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class Extract_Text {
public static void main(String[] args) {
//创建PdfDocument实例
PdfDocument doc = new PdfDocument();
//加载PDF文件
doc.loadFromFile("E:\\workspace-cppims2\\test.pdf");
StringBuilder sb = new StringBuilder();
PdfPageBase page;
//遍历PDF页面,获取文本
System.out.println("doc.getPages().getCount():"+doc.getPages().getCount());
String [] arr = null;
String [] temp = null;
String tmp = "";
Map<String,String> map = new HashMap<String,String>();
//输入需要抽取的pdf文件页码范围1682
for (int i = 16748; i < 18935; i++) {
page = doc.getPages().get(i);
// sb.append(page.extractText(true));
// System.out.println(page.extractText(true));
arr = page.extractText(true).split("\n");
for(int j = 0 ; j < arr.length;j++) {
// System.out.println("=="+arr[j]);
if(arr[j].indexOf("爆发行:")!= -1) {
arr[j] = arr[j].substring(21);
// sb.append(arr[j]);
System.out.println("page=="+i+"=="+arr[j]);
temp = arr[j].split(";");
if(map.get(temp[0]) == null) {
map.put(temp[0], temp[1]);
}else {
if(map.get(temp[0]).indexOf(temp[1]) == -1){
tmp = map.get(temp[0])+" "+temp[1];
map.put(temp[0], tmp);
}
}
}
}
}
Iterator<Entry<String,String>> iter = map.entrySet().iterator();
System.out.println("*********循环输出开始***********");
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
System.out.println(key+" =="+val);
sb.append(key).append("=").append(val);
}
System.out.println("**********循环输出结束**********");
FileWriter writer;
try {
//将文本写入文本文件
writer = new FileWriter("E:\\workspace-cppims2\\ExtractText_弱验证.txt");
writer.write(sb.toString());
writer.flush();
System.out.println("文件生成");
} catch (IOException e) {
e.printStackTrace();
}
doc.close();
System.exit(0);
}
}
比如我们需要提取 文档中一类代码缺陷 “跨站脚本:弱验证” 页码范围 16748 ~18935
反映到代码中便是
main方法运行一下
在指定的路径找到生成的txt文件
然后打开文件,可以看到指定页码内的爆发行已经提取到txt中了
一共只有142行内容,是因为程序进行了去重操作,把原文档中重复的爆发行进行了合并
把复杂且冗余的PDF转成简单的文件,然后程序员们可以安心的改漏洞了。。。。
代码可以直接复用,拿走不谢!
本文地址:https://blog.csdn.net/lixinyao5281/article/details/107387786