现在流行的搜索引擎 Lucene, Elasticsearch处理文件搜索时一般使用 tika,使用tika 处理文件正文搜索还好,但搜索结果显示正文等操作不是很方便,并且tika提取正文的速度比较慢。老版本还有很多外部依赖程序,安全性不好。

笔者给大家介绍一款调用方便,提取文件正文速度快,开发方便的组件供大家参考。

“Graccvs正文提取组件”全部用go语言实现,不依赖外部工具,效率高,安全性非常好。可以直接在操作系统上开发使用,不要求JAVA等其他环境支持,而且从设计上避免了环境依赖或者解析器框架带来的占用CPU过高和安全性问题。组件提取文本速度快,质量高,跨平台,支持多任务并发,开发简单成本低。提供多种语言接口及使用示例。

“Graccvs正文提取组件”支持很多文件格式:

A: pdf文件

B: office word文件 ".doc", ".odt", ".docx", ".dotm", ".docm"

C: wps文档 ".wps"

D: office excel文件 ".xls", ".xlsx", ".xlsm", ".xltm"

E: wps表格 ".et"

F: office powerPoint文件 ".ppt", ".pptx", ".potm", ".pptm", ".ppsm"

G: wps演示 ".dps"

H: 开放文档格式 ".ofd", 注:常见于“电子发票版式文件”

I: 富文本类型 ".rtf"

J: HTML页面文件  ".html", ".htm", ".mht", ".mhtml"

K: 邮件格式文件 ".eml", 注:默认提取前5个附件

L: 部分思维导图格式文件 ".emmx", "xmind", "gmind"

M: UTF8编码, Unicode编码, Ansi编码的文本文件,

".txt", ".c", ".h", ".cpp", ".m", ".asp", ".aspx", ".cs", ".pas",

".php", ".vb", ".bas", ".js", ".css", ".java", ".jsp", ".go",

".pl", ".perl", ".ps", ".py", ".python", ".sql", ".rs", ".dart"

注:可以在配置文件中增加纯文本文件后缀 

N: 帮助文件 “*.chm",注:此格式仅限Windows平台

O: 压缩文件 ".zip", 注:默认提取前5个文件

以下是 使用Eclipse开发工具,Java调用动态链接库示例:

调用过程:
1:创建JAVA工程。
2:工程导入调用DLL的扩展包Native(jna-jpms-5.9.0.jar 和 jna-platform-jpms-5.9.0.jar)。
3:拷贝 graccvs64.dll到工程中,LibGraccvs.java单元修改DLL位置(默认在exe输出位置)。
4:实现提取文件正文函数,点击这里查看DLL函数详细说明。
5:点击这里下载完整工程包,这里下载最新DLL文件。

主要代码单元 LibGraccvs.java (函数的定义):

package graccvsDLL;
//
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
//
public interface LibGraccvs extends Library {//默认64位系统,32位DLL或者接口最新DLL查看官网@SuppressWarnings("deprecation")LibGraccvs INSTANCE = (LibGraccvs) Native.loadLibrary("graccvs64.dll", LibGraccvs.class); //----------------------以下为函数说明----------------------// 加载DLL,设置动态库需要的临时文件夹,且对此文件夹要有读写权限void Load(Pointer tempDir); //注册软件: int Auth(Pointer corp, Pointer licText);// 提供文件正文,并保存到目标文件// inFilePtr输入文件地址, outFilePtr为TXT目标文件文件地址int ToTextFile(Pointer inFilePtr, Pointer outFilePtr);//其他一个文件的正文,返回UTF-8字符串指针//注意,调用此函数需要使用FreeString释放指针内存Pointer ToString(Pointer inFilePtr);//得到最后错误日志Pointer LastErr(); //释放ToString函数返回的指针内存void FreeString(Pointer ptr); // 提取Http/Https文件,返回字符串数据指针// url=Http/Https地址// fileExt=文件类型(比如:".pdf"),// timeout=超时设置,超过此数值系统终止下载文件。单位为毫秒,默认为0(等待文件下载直到完成)// httpParams=JSON格式header数据和cookie数据,默认为空 // 返回UTF-8编码字符串数据指针(此指针需要使用FreeString函数释放内存)Pointer HttpToString(Pointer url, Pointer fileExt, int timeout, Pointer httpParams);// 下载Http文件,并提取文本,保存到目标文件u// outfile为TXT目标文件文件地址,其他参数和HTTPTOSTRING参数相同int HttpToTextFile(Pointer url, Pointer fileExt, Pointer outfile, int timeout, Pointer httpParams);//---------------------异步批量处理相关函数---------------------// 文件提取异步任务, inFilePtr输入文件地址, outTxtFilePtr为TXT目标文件文件// 如果提取某个文件错误,则 结果文本的内容如下格式: @ErrCode:错误代码, ErrMessage:错误提示void AddTask(Pointer inFilePtr, Pointer outTxtFilePtr);// 异步提取Http文件任务,参数同 HttpToTextFile 函数void AddHttpTask(Pointer url, Pointer fileExt, Pointer outTxtFile, int timeout, Pointer httpParams);// 开始执行异步任务,返回值=1开始执行, 其他值未识别// =2 免费版不支持此功能,=3 没有可以执行的任务 ,=4 当前任务未完成int AsyncStart(); // 停止任务void AsyncStop(); // 一直等待,直到全部异步任务结束void AsyncWait(); // 得到执行异步任务的状态, =0 没开始, =1 正在处理中,=2 已中断, =99 处理完成int AsyncState();// 设置执行异步任务的并发数量(不大于软件授权数量),返回并发数量int AsyncMaxProcs(int num);//---------------------异步批量处理相关函数---------------------//程序结束前调用此函数,否则释放DLL会发生错误void Unload();
} 

主要代码单元 TestMain.java (提取文件正文测试):

package graccvsDLL;
//
import java.io.UnsupportedEncodingException;
import java.util.*;
import com.sun.jna.Memory;
import com.sun.jna.Pointer; //
public class TestMain {public enum DllErrCode { TFE_OK,TFE_UNKNOW,TFE_FILE_NOTEXIST,TFE_SAVE_ERROR,TFE_OUTSIZE,TFE_UNSUPPORTED ,TFE_ERROR_INTERFACE ,TFE_HTTP_ERR,TFE_HTTP_FILE_NULL ,TFE_LICENCE_ERR;} // 根据错误类型返回错误信息public static String codeText(DllErrCode code){ switch (code){case TFE_OK:return "ok";case TFE_UNKNOW:return "未知错误";case TFE_FILE_NOTEXIST:return "提取源文件不存在";case TFE_SAVE_ERROR:return "保存目标文件失败";case TFE_OUTSIZE:return "提取的源文件超出设置的大小范围"; case TFE_UNSUPPORTED:return "不支持的提取文件格式";case TFE_ERROR_INTERFACE:return "得到接口失败";case TFE_HTTP_ERR :return "HTTP下载文件失败";case TFE_HTTP_FILE_NULL :return "HTTP文件为空";case TFE_LICENCE_ERR:return "软件许可错误"; default:return "未知错误2";}}//字符串转指针public static Pointer getUtf8Pointer(String str){  try {byte[] data = str.getBytes("UTF-8");Pointer p = new Memory(data.length + 1);p.write(0, data, 0, data.length);p.setByte(data.length, (byte)0);return p;}catch (UnsupportedEncodingException e) {return null;}}//utf8指针转换为字符串public static String utf8pointerToString(Pointer p){  String str = p.getString(0);try {return new String(str.getBytes(), "UTF-8");  }catch (UnsupportedEncodingException e){return str;}}// ------------------------提取正文并保存为文本文件------------------------public static void testToTextFile(){  Pointer prtInFile = getUtf8Pointer("test\\graccvs文件正文提取接口.pdf"); Pointer prtOutFile = getUtf8Pointer("test\\grcv001.txt");   //int r = LibGraccvs.INSTANCE.ToTextFile(prtInFile, prtOutFile);  DllErrCode code = DllErrCode.values()[r];  if (code != DllErrCode.TFE_OK){// 得到错误方式1: 根据R值调用函数ErrText得到具体错误信息, 此方式速度快 String err = codeText(code);System.out.println("error from code:" + err); // 方式2:调用DLL函数,得到具体错误信息, 此方式错误信息更加准确Pointer p = LibGraccvs.INSTANCE.LastErr();String err2 = utf8pointerToString(p);System.out.println("error from dll lastErr:" + err2);}System.out.println("to text ok!");}// ------------------------提取正文,返回字符串指针------------------------public static void testToString(){  Pointer prtInFile = getUtf8Pointer("test\\简可信模板OCR识别工具帮助.docx");   Pointer prtOutStr = LibGraccvs.INSTANCE.ToString(prtInFile); try{String s = utf8pointerToString(prtOutStr);System.out.println(s);}finally{LibGraccvs.INSTANCE.FreeString(prtOutStr); //调用此函数释放字符串内存,否则会导致内存泄漏}}// ------------------------HTTP提取正文并保存为文本文件------------------------public static void testHttpToTextFile(){  Pointer prtUrl = getUtf8Pointer("https://www.gaya-soft.cn/dfs/v2/简可信模板OCR识别工具帮助.docx"); Pointer prtExt = getUtf8Pointer(".docx"); Pointer prtOutFile = getUtf8Pointer("test\\grcv002.txt");// 调用DLL函数得到文件正文int r = LibGraccvs.INSTANCE.HttpToTextFile(prtUrl, prtExt, prtOutFile, 0, null);DllErrCode code = DllErrCode.values()[r];//TFE_OK为提取完成,其他code调用codeText返回相同错误if (code != DllErrCode.TFE_OK){  System.out.println("error from code, " + codeText(code)); }else{ System.out.println("testHttpToTextFile end"); }}// ------------------------HTTP提取正文,返回字符串指针------------------------public static void testHttpToString(){ Pointer prtUrl = getUtf8Pointer("https://www.gaya-soft.cn/dfs/v2/graccvs文件正文提取接口.pdf"); Pointer prtExt = getUtf8Pointer(".pdf"); String  params = "{\"headers\":[{\"client_id\": \"g01x9\"}, {\"client_secret\": \"e23c89cc9fe\"}], \"cookies\":[{\"name\": \"ga\", \"value\": \"1020\", \"expires\":36000000, \"path\": \"/\"}]}";Pointer prtParams = getUtf8Pointer(params); int timeout = 60 * 1000; //超时设置,单位毫秒, 默认为0//Pointer prtOutStr = LibGraccvs.INSTANCE.HttpToString(prtUrl, prtExt, timeout, prtParams);try{ String s = utf8pointerToString(prtOutStr);System.out.println(s); }finally{LibGraccvs.INSTANCE.FreeString(prtOutStr); // 务必调用函数释放字符串内存}}// ---------------异步批量文件提取,适合多线程处理很多文件---------------// 文件提取任务 public static void asyncAddTask(){   // -----可以增加N个任务    Pointer prtInFile = getUtf8Pointer("test\\graccvs文件正文提取接口.pdf"); Pointer prtOutFile = getUtf8Pointer("test\\asyncOut001.txt"); LibGraccvs.INSTANCE.AddTask(prtInFile, prtOutFile); // 一个文件任务Pointer prtInFile2 = getUtf8Pointer("test\\Adobe Intro.ofd"); Pointer prtOutFile2 = getUtf8Pointer("test\\asyncOut002.txt"); LibGraccvs.INSTANCE.AddTask(prtInFile2, prtOutFile2); // 一个文件任务}// Http文件提取任务 public static void asyncAddHttpTask(){// 可以增加N个任务 Pointer prtUrl = getUtf8Pointer("https://www.gaya-soft.cn/dfs/v2/简可信模板OCR识别工具帮助.docx");Pointer prtExt = getUtf8Pointer(".docx"); Pointer prtOutFile = getUtf8Pointer("test\\asyncOut003.txt");  int timeout = 90 * 1000; //超时设置,单位毫秒, 默认为0LibGraccvs.INSTANCE.AddHttpTask(prtUrl, prtExt, prtOutFile, timeout, null);}// 方式1:开始任务,等待全部任务完成public static void asyncRun1(){  // 开始任务int r = LibGraccvs.INSTANCE.AsyncStart(); if (r == 1){  LibGraccvs.INSTANCE.AsyncWait(); // 等待任务全部结束System.out.println("方式1 -- 任务完成"); }else if (r == 2){System.out.println("免费版不支持此功能");}else if (r == 3){System.out.println("没有可以执行的任务");}else if (r == 4){System.out.println("当前任务未完成");}}// 方式2:判断执行情况,超时退出,主动结束任务public static void asyncRun2()  {// 开始任务boolean isOver = false;int r = LibGraccvs.INSTANCE.AsyncStart(); if (r == 1){Date startDt = new Date(); // 5分钟后结束任务while((new Date()).getTime() - startDt.getTime() < 5 * 60 * 1000){ // 判断任务情况, =0 没开始, =1 正在处理中,=2 已中断, =99 处理完成int x = LibGraccvs.INSTANCE.AsyncState();if (x == 1){try{Thread.sleep(500); }catch(InterruptedException e){ }}else if (x == 99){isOver = true; // 处理完成break;}else{break;}}//if (!isOver){LibGraccvs.INSTANCE.AsyncStop(); // 结束任务 }   System.out.println("方式2 -- 任务完成"); }else if (r == 2){System.out.println("免费版不支持此功能");}else if (r == 3){System.out.println("没有可以执行的任务");}else if (r == 4){System.out.println("当前任务未完成");}}public static void asyncTest(){//LibGraccvs.INSTANCE.AsyncMaxProcs(8); // 同时运行8个任务//asyncAddTask();     // 文件提取任务 asyncAddHttpTask(); // Http文件提取任务// 执行任务--方式1asyncRun1();// 执行任务--方式2asyncAddTask();asyncAddHttpTask();asyncRun2();}// ---------------异步批量文件提取,适合多线程处理很多文件---------------public static void main(String[] args) { Pointer prtPath = getUtf8Pointer("test");// 提取文本需要的临时文件夹,且对此文件夹要有读写权限LibGraccvs.INSTANCE.Load(prtPath);// 设置软件许可,免费版都为空Pointer corp = getUtf8Pointer("gaya-soft.cn");Pointer licTxt = getUtf8Pointer("");LibGraccvs.INSTANCE.Auth(corp, licTxt);// 提取正文并保存为文本文件testToTextFile(); //// 提取正文,返回字符串指针testToString();// 提取HTTP提取正文, 并保存为文本文件testHttpToTextFile();// 提取HTTP提取正文, 返回字符串指针testHttpToString();// 异步批量文件提取测试asyncTest();//LibGraccvs.INSTANCE.Unload();//String s2 = "over!";System.out.println(s2);}
}       

JAVA文件搜索过程中如何得到各种文件内容(office文件,PDF,邮件,mht,思维导图等)相关推荐

  1. CV之IS:计算机视觉中图像分割(语义分割)最diao炸(完)天(整)的思维导图

    CV之IS:计算机视觉中图像分割(语义分割)最diao炸(完)天(整)的思维导图 导读:此语义导图为某大牛精心整理,感谢无私分享. 目录 语义分割思维导图(完整) 相关文章 CV之IS:计算机视觉之图 ...

  2. 面向过程(PO)和面向对象(OO)的区别(思维导图)

    面向对象: 是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙       某个事物在整个解决问题的步骤中的行为.(主要语言:c++,c#,java) 面向对象的程序设计 ...

  3. JavaScript 中的内存和性能、模拟事件(读书笔记思维导图)

    由于事件处理程序可以为现代 Web 应用程序提供交互能力,因此许多开发人员会不分青红皂白地向页面中添加大量的处理程序.在 JavaScript 中,添加到页面上的事件处理程序数量将直接关系到页面的整体 ...

  4. word中怎么做思维导图,思维导图怎么画

    谈及Word软件,你一定不会陌生,因为它已成为个人和企业电脑的标配软件,也是每一位电脑使用者必会的一款应用.我们时常需要使用Word处理文本相关的内容,比如文章编辑.排版和打印. 在软件中,我们可以添 ...

  5. 计算机思维在音乐中的应用,“思维导图”在音乐理论教育中的应用.doc

    精品文档,助力人生,欢迎关注小编! "思维导图"在音乐理论教育中的应用 摘要:随着教育改革的不断推进,素质教育被相关的教育人员重视起来.而"思维导图"的教学模式 ...

  6. java基础思维导图

    一.说在前头 最近看了一些文章的思维导图,发现思维导图真是个强大的工具.了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板. 思维导 ...

  7. 工作中必备技能---思维导图你会吗???给我10分钟让你精通思维导图!!!

    10分钟精通思维导图 问题一:同个技能,别人半小时学精,而你投入了大量金钱和时间却学不好,这公平吗? 答:当然不公平!  所以我们也要快! 问题二:真的只需要10分钟? 答:其实根本不用这么久! 问题 ...

  8. 解决使用Java logging文件记录日志过程中产生.lck文件和重复文件的问题

    问题描述 在使用Java logging的过程中,产生了许多.lck文件和带着后缀的重复文件.尝试使用记事本打开这两种文件,.lck文件为空,不同的重复文件中记录的是一条或者几条不同的log信息.而需 ...

  9. 理解Lucene索引与搜索过程中的核心类

    理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWriter ...

最新文章

  1. java后台的微信小程序支付的解决方案
  2. 7000 字精华总结,Pandas/Sklearn 进行机器学习之特征筛选,有效提升模型性能
  3. 2015年最值得学习的编程语言是?
  4. 2017 Vue.js 2快速入门指南
  5. 为什么大家看到不错的文章更愿意收藏而不是点赞?
  6. 美国大学生数学建模竞赛 细节问题(23条)汇总!!!
  7. 网站外链查询接近100%精确的方法
  8. 用代码的方式增加servlet mapping定义
  9. oracle批量联机,Oracle 12.2 使用联机重定义对表进行多处改变
  10. python 时间函数小总结
  11. 网络协议栈深入分析(三)--BSD socket和传输层sock
  12. idea 配置maven一直停留在loading archetype list
  13. 机械制图符号_?《机械制图》课程 试题库(中专)
  14. 电脑故障维修判断指导大全
  15. python朋友圈自动点赞_基于airtest的朋友圈自动点赞
  16. 茶叶文化网站设计与实现 HTML+CSS学生网页设计作业源码
  17. 小熊个人资料_TOP打野Xx小熊是谁 Xx小熊个人资料背景曝光实力超群
  18. HTML5网页设计常用标记-图像标记
  19. js-获取子节点--具体节点调用
  20. MultiCD: 构建多重引导 CD 映像

热门文章

  1. C语言数组 :用户输入一个数, 我要用这个数当数组的长度。怎么办呢
  2. linux usb 全向麦克风,推崇金典款的适合80平方中小会议室使用的USB有线会议阵列麦克风...
  3. 惠普暗影精灵ubuntu双系统安装(通用方法)
  4. classes in c++
  5. 山东 计算机专业,山东省内计算机专业大学排名?
  6. 抖音举起兴趣电商屠龙刀
  7. 查看linux文件生成时间,【linux】如何查看文件的创建、修改时间
  8. 经典排序算法-----归并排序(C语言实现)
  9. 大数据、java、python、区块链、人工智能发展前景
  10. 51/时钟周期、时钟频率、状态周期、机器周期