多平台统一管理软件接口,如何实现多平台统一管理软件接口
289
2022-10-18
Linux + JAVA得到各种格式的文件内容(office文件,PDF,邮件,html,zip等)
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(等待文件下载直到完成) // /* 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":"gaya-soft.cn"}, {"name": "xc3", "value": "10099", "expires":240000, "path": "", "domain":""}]} */ // 返回UTF-8编码字符串数据指针(此指针需要使用FreeString函数释放内存) Pointer HttpToString(Pointer url, Pointer fileExt, int timeout, Pointer // 下载Http文件,并提取文本,保存到目标文件u // outfile为TXT目标文件文件地址,其他参数和HTTPTOSTRING参数相同 int HttpToTextFile(Pointer url, Pointer fileExt, Pointer outfile, int timeout, Pointer //---------------------异步批量处理相关函数--------------------- // 文件提取异步任务, inFilePtr输入文件地址, outTxtFilePtr为TXT目标文件文件 // 如果提取某个文件错误,则 结果文本的内容如下格式: @ErrCode:错误代码, ErrMessage:错误提示 void AddTask(Pointer inFilePtr, Pointer outTxtFilePtr); // 异步提取Http文件任务,参数同 HttpToTextFile 函数 void AddHttpTask(Pointer url, Pointer fileExt, Pointer outTxtFile, int timeout, Pointer // 开始执行异步任务,返回值=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(" 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(" 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(" 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); }}
工程文件:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~