在文件数据挖掘处理技术中,如何从文本数据中抽取有价值的信息和知识是一个重要的数据挖据分支,是机器学习、自然语言处理、数理统计的基础技术之一,是信息检索,机器学习,AI智能等高端技术的的底层技术支持之一。
Graccvs组件智能分析提取其他各种文件中文本,为自然语言信息检索,机器学习等高端技术提供底层支持的技术组件,是Lucene/CLucene, Elasticsearch, Sphinx等全文检索工具,OA, ERP, CRM,网盘,文件管理等其他系统提供文件摘要及搜索前置服务。同时也可以为安全网关,邮件内容监控,内网安全等系统提供文件搜索及监控服务底层技术支持。
组件支持常见各种文件格式”.pdf", ".doc", ".odt", ".docx", ".dotm", ".docm", ".wps", ".xls", ".xlsx", ".xlsm", ".xltm", ".et", ".ppt", ".pptx", ".potm", ".pptm", ".ppsm", ".dps", ".ofd"(电子发票版式文件), ".rtf",".html", ".htm", ".mht", ".mhtml", ".eml", ".emmx", "xmind", "gmind", ".chm", ".zip" 等。组件速度快,效率高,调用非常简单。
Graccvs组件是以so格式动态链接库方式调用的,点击这里下载So动态链接库 ,函数详细说明和调用示例点击这里参考或者下载工程包。
调用过程:
1:安装JAVA,设置系统路径。
2:下载 Native 包(jna-jpms-5.9.0.jar 和 jna-platform-jpms-5.9.0.jar)或者使用示例包中的jar文件。
地址: https://github.com/java-native-access/jna。
注意:版本不同,包的名称不同,以下载后的包名称为准。
3:创建测试文件夹。
/lib, 保存jar包 jna-jpms-5.9.0.jar 和 jna-platform-jpms-5.9.0.jar。
/src,放源码 LibGraccvs.java,testMain.java。
4:拷贝 graccvs.so 到工程 执行文件输出位置,或者到操作系统 /usr/lib/ 文件夹下。
5、编译工程文件
javac -d . -sourcepath src -cp lib/jna-jpms-5.9.0.jar src/*
6、运行class 文件
java -cp .:lib/jna-jpms-5.9.0.jar graccvsTest/TestMain
主要代码单元 LibGraccvs.java (函数的定义):
package graccvsTest;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
public interface LibGraccvs extends Library {
@SuppressWarnings("deprecation")
LibGraccvs INSTANCE = (LibGraccvs) Native.loadLibrary("graccvs.so", LibGraccvs.class);
//----------------------以下为函数说明----------------------
// 加载DLL,设置动态库需要的临时文件夹,且对此文件夹要有读写权限
void Load(Pointer tempDir);
/*
注册软件:
方式1:输入参数,corp为公司名称licText为注册码
方式2:把授权文件grauth.lic保存到动态库相同文件夹,调用TAuth函数(corp, licText都为空)系统自动加载grauth.lic
返回值:
0:免费版本许可为空
1:许可正常
2:序列号(公司授权名称)错误
3:加密数据格式错误
4:许可过期
5:许可验证错误
6:无效的许可
7:未知错误
注1:如果注册失败,系统变为免费版本
注2:免费版也需要调用此函数,corp和licText都为空
*/
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数据,默认为空
/*
JSON格式如下:
{"headers":
[{名称1: 值1},{名称2: 值2},...],
"cookies":[
{"name": 名称(字符串), "value": 值(字符串), "expires": 有效期(整数,单位毫秒),
"path": 路径(字符串), "domain": 域名(字符串)},
{"name": 名称(字符串), "value": 值(字符串), "expires": 有效期(整数,单位毫秒),
"path": 路径(字符串), "domain": 域名(字符串)}
...
]}
例如:
{"headers":[{"client_id": "g01x9"}, {"client_secret": "e23c89cc9fe"}, {"client_index": 10092}],
"cookies":[{"name": "ga", "value": "1020", "expires":36000000, "path": "/hx/", "domain":"www.gaya-soft.cn"},
{"name": "xc3", "value": "10099", "expires":240000, "path": "", "domain":""}]}
*/
// 返回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();
// 设置执行异步任务的CPU数量(不大于软件授权数量),返回软件授权数量
int AsyncMaxProcs(int num);
//---------------------异步批量处理相关函数---------------------
//程序结束前调用此函数,否则释放DLL会发生错误
void Unload();
}
主要代码单元 TestMain.java (提取文件正文测试):
package graccvsTest;
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/out002.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; //超时设置,单位毫秒, 默认为0
LibGraccvs.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文件提取任务
// 执行任务--方式1
asyncRun1();
// 执行任务--方式2
asyncAddTask();
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("f5683cade1696ad3a1c1bd2a5a42a468fd5ae68c0a94bed8941213748c0fc894b984564d4bab0f4c687e0649ff965f0d9722aeab01e7652c9b323cdd0f78fcaa8bb9833ab6fbf27d4b051cc4958108c48a9fddc712fb84e782852821484dd77202bb5199b72de835b1132e9d955eb2a1a33a95de2e7b8a083bc94ed6fae4bcdfee41a23d2c08385bb9e71d79435eb4784eb0638a2f51ba75398638647dd264df78b8cb8843c3c29772423b15f9b16dc6da405532238c15319b7dfbc9c601076be0a0");
LibGraccvs.INSTANCE.Auth(corp, licTxt);
// 提取正文并保存为文本文件
testToTextFile(); //
// 提取正文,返回字符串指针
testToString();
// 提取HTTP提取正文, 并保存为文本文件
testHttpToTextFile();
// 提取HTTP提取正文, 返回字符串指针
testHttpToString();
// 异步批量文件提取测试
asyncTest();
//
LibGraccvs.INSTANCE.Unload();
//
String s2 = "over!";
System.out.println(s2);
}
}
工程文件: