VC语言文件正文分析器--支持格式常用文件格式
Graccvs文件正文提取开发组件支持各种文件提取正文,为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提供免费版本,以下是调用过程及代码,起来文件输入修改为要提取的文件名称和类型即可。
2:拷贝 graccvs64.dll到工程中, 默认在exe输出位置。
3:实现提取文件正文函数,详细参考工程文件。
4:系统提供组件调用方式说明,参数说明等详细资料。
5:具体使用请访问 Graccvs文件正文提取开发组件--在线帮助
代码头文件graccvs.h :
#include #include //----------------------以下为函数说明----------------------// 加载DLL,设置动态库需要的临时文件夹,且对此文件夹要有读写权限typedef void (*LOAD)(char *tempDir); //注册软件: 免费版也需要调用此函数,corp和licText都为空typedef int (*AUTH)(char *corp, char *licText); // 提供文件正文,并保存到目标文件// inFilePtr输入文件地址, outFilePtr为TXT目标文件文件地址typedef int (*TOTEXTFILE)(char *inFilePtr, char *outFilePtr); // 提供文件正文// inFilePtr输入文件地址, 返回UTF-8编码字符串数据指针(此指针需要使用FREESTRING函数释放内存)typedef char* (*TOSTRING)(char *inFilePtr); // 释放TOSTRING等函数的返回指针typedef void (*FREESTRING)(char *p); // 得到最后的错误信息typedef char* (*LASTERR)(); // 提取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函数释放内存)typedef char* (*HTTPTOSTRING)(char *url, char *fileExt, int timeout, char * // 下载Http文件,并提取文本,保存到目标文件u// outfile为TXT目标文件文件地址,其他参数和HTTPTOSTRING参数相同typedef int (*HTTPTOTEXTFILE)(char *url, char *fileExt, char *outfile, int timeout, char * //---------------------异步批量处理相关函数---------------------// 文件提取异步任务, Infile输入文件地址, Outfile为TXT目标文件文件// 如果提取某个文件错误,则 Outfile的内容如下格式: @ErrCode:错误代码, ErrMessage:错误提示typedef void (*ADDTASK)(char *inFilePtr, char * outTxtFilePtr); // 异步提取Http文件任务,参数同 HTTPTOTEXTFILE 函数typedef void (*ADDHTTPTASK)(char * url, char *fileExt, char *outTxtFile, int timeout, char * // 开始执行异步任务,返回值=1开始执行, 其他值未识别// =2 免费版不支持此功能,=3 没有可以执行的任务 ,=4 当前任务未完成typedef int (*ASYNCSTART)(); // 停止任务typedef void (*ASYNCSTOP)(); // 一直等待,直到全部异步任务结束typedef void (*ASYNCWAIT)(); // 得到执行异步任务的状态, =0 没开始, =1 正在处理中,=2 已中断, =99 处理完成typedef int (*ASYNCSTATE)(); // 设置执行异步任务的并发数量(不大于软件授权数量),返回并发数量typedef int (*ASYNCMAXPROCS)(int num); //---------------------异步批量处理相关函数--------------------- // 关闭动态库前调用此函数释放资源,否则关闭DLL会发生错误typedef void (*UNLOAD)(); typedef void(*SAVESN)(); //提取文本的错误类型enum GrErrCode{ TFE_OK = 0, TFE_UNKNOW = 1, TFE_FILE_NOTEXIST = 2, TFE_SAVE_ERROR = 3, TFE_OUTSIZE = 4, TFE_UNSUPPORTED = 5, TFE_ERROR_INTERFACE = 6, TFE_HTTP_ERR = 7, TFE_HTTP_FILE_NULL = 8, TFE_LICENCE_ERR = 9 };
提取正文CPP文件:
可以修改testToTextFile函数中的输入文件为需要处理的文件即可。
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。// #include #include #include #include #include #include #include "graccvs.h" using namespace std; void wcharToUtf8(const wchar_t *src, char *dest, int destSize){ int ik = WideCharToMultiByte(CP_UTF8, 0, src, (int)wcslen(src), dest, destSize, NULL, NULL); for (int i = ik; i < destSize; i++) { dest[i] = 0; }} wchar_t *utf8ToWchar(const char *src, int srcSize){ DWORD destSize = MultiByteToWideChar(CP_UTF8, 0, src, srcSize, NULL, 0); wchar_t * dest = new wchar_t[destSize]; wmemset(dest, 0, destSize); MultiByteToWideChar(CP_UTF8, 0, src, srcSize, dest, destSize); return dest;} // 根据错误类型返回错误信息const wchar_t *codeText(int code){ switch (code) { case TFE_OK: return L"ok"; case TFE_UNKNOW: return L"未知错误"; case TFE_FILE_NOTEXIST: return L"提取源文件不存在"; case TFE_SAVE_ERROR: return L"保存目标文件失败"; case TFE_OUTSIZE: return L"提取的源文件超出设置的大小范围"; case TFE_UNSUPPORTED: return L"不支持的提取文件格式"; case TFE_ERROR_INTERFACE: return L"得到接口失败"; case TFE_HTTP_ERR: return L"HTTP下载文件失败"; case TFE_HTTP_FILE_NULL: return L"HTTP文件为空"; case TFE_LICENCE_ERR: return L"软件许可错误"; default: return L"未知错误2"; }} // ------------------------提取正文并保存为文本文件------------------------void testToTextFile(HINSTANCE handle, LASTERR lastErr){ TOTEXTFILE toTextFile = (TOTEXTFILE)GetProcAddress(handle, "ToTextFile"); if (toTextFile == NULL) { return; } static char inFileName[255]; // 根据实际情况分配长度 wcharToUtf8(L"test\\graccvs文件正文提取接口.pdf", &inFileName[0], 255); static char outFileName[255]; wcharToUtf8(L"test\\out001.txt", &outFileName[0], 255); // 调用DLL函数得到文件正文 int code = toTextFile(&inFileName[0], &outFileName[0]); //TFE_OK为提取完成,其他code调用codeText返回相同错误 if (code != TFE_OK) { // 得到错误方式1: 根据R值调用函数ErrText得到具体错误信息, 此方式速度快 const wchar_t * e = codeText(code); wprintf(L"error from code: %s\n", e); // 方式2:调用DLL函数,得到具体错误信息, 此方式错误信息更加准确 char *p = (char*)lastErr(); wchar_t* err2 = utf8ToWchar(p, (int)strlen(p)); wprintf(L"error from dll: %ls\n", err2); delete(err2); } else { wprintf(L"testToTextFile end\n"); }} // ------------------------提取正文,返回字符串指针------------------------void testToString(HINSTANCE handle, FREESTRING freeString){ TOSTRING toString = (TOSTRING)GetProcAddress(handle, "ToString"); if (toString == NULL || freeString == NULL) { return; } static char inFileName2[255]; wcharToUtf8(L"test\\简可信模板OCR识别工具帮助.docx", &inFileName2[0], 255); char *p = toString(&inFileName2[0]); //返回UTF-8编码字符串 // 转 unicode编码 int count = (int)strlen(p); wchar_t* text = utf8ToWchar(p, count); wprintf(L"testToString= %s\n", text); delete(text); freeString(p); // 务必调用freeString函数释放字符串内存} // ------------------------HTTP提取正文并保存为文本文件------------------------void testHttpToTextFile(HINSTANCE handle){ HTTPTOTEXTFILE = (HTTPTOTEXTFILE)GetProcAddress(handle, "HttpToTextFile"); if (== NULL) { return; } static char rul[255], ext[6], outFile[128]; wcharToUtf8(L"&rul[0], 255); wcharToUtf8(L".docx", &ext[0], 6); wcharToUtf8(L"test\\out002.txt", &outFile[0], 128); // 调用DLL函数得到文件正文 int timeout = 0; //超时设置,单位毫秒, 默认为0 int code = &ext[0], &outFile[0], timeout, NULL); //TFE_OK为提取完成,其他code调用codeText返回相同错误 if (code != TFE_OK) { const wchar_t* e = codeText(code); wprintf(L"error from code: %s\n", e); } else { wprintf(L"testHttpToTextFile end\n"); }} // ------------------------HTTP提取正文,返回字符串指针------------------------void testHttpToString(HINSTANCE handle, FREESTRING freeString){ HTTPTOSTRING = (HTTPTOSTRING)GetProcAddress(handle, "HttpToString"); if (== NULL || freeString == NULL) { return; } static char rul[255], ext[6], params[512]; wcharToUtf8(L"&rul[0], 255); wcharToUtf8(L".pdf", &ext[0], 6); wcharToUtf8(L"{\"headers\":[{\"client_id\": \"g01x9\"}, {\"client_secret\": \"e23c89cc9fe\"}]}", ¶ms[0], 512); int timeout = 60 * 1000; //超时设置,单位毫秒 // char *p = &ext[0], timeout, ¶ms[0]); // 转 unicode编码 int count = (int)strlen(p); wchar_t* text = utf8ToWchar(p, count); wprintf(L"testHttpToString= %s\n", text); // freeString(p); // 务必调用freeString函数释放字符串内存} // ---------------异步批量文件提取,适合多线程处理很多文件---------------// 文件提取任务 void asyncAddTask(HINSTANCE handle){ ADDTASK addTask = (ADDTASK)GetProcAddress(handle, "AddTask"); if (addTask == NULL) { return; } // -----可以增加N个任务 static char inFn[255], inFn2[255], outFn[255], outFn2[255]; wcharToUtf8(L"test\\graccvs文件正文提取接口.pdf", &inFn[0], 255); wcharToUtf8(L"test\\asyncOut001.txt", &outFn[0], 255); addTask(&inFn[0], &outFn[0]); // 一个文件任务 wcharToUtf8(L"test\\Adobe Intro.ofd", &inFn2[0], 255); wcharToUtf8(L"test\\asyncOut002.txt", &outFn2[0], 255); addTask(&inFn2[0], &outFn2[0]); // 一个文件任务} // Http文件提取任务 void asyncAddHttpTask(HINSTANCE handle){ ADDHTTPTASK addHttpTask = (ADDHTTPTASK)GetProcAddress(handle, "AddHttpTask"); if (addHttpTask == NULL) { return; } // 可以增加N个任务 static char rul[255], ext[6], outFn[255]; wcharToUtf8(L"&rul[0], 255); wcharToUtf8(L".docx", &ext[0], 6); wcharToUtf8(L"test\\asyncOut003.txt", &outFn[0], 255); int timeout = 90 * 1000; //超时设置,单位毫秒, 默认为0 addHttpTask(&rul[0], &ext[0], &outFn[0], timeout, NULL);} // 方式1:开始任务,等待全部任务完成void asyncRun1(HINSTANCE handle, ASYNCSTART asyncStart){ ASYNCWAIT asyncWait = (ASYNCWAIT)GetProcAddress(handle, "AsyncWait"); if (asyncWait == NULL) { return; } // 开始任务 int r = asyncStart(); if (r == 1) { asyncWait(); // 等待任务全部结束 wprintf(L"方式1--任务完成\n"); } else if (r == 2) { wprintf(L"免费版不支持此功能\n"); } else if (r == 3) { wprintf(L"没有可以执行的任务\n"); } else if (r == 4) { wprintf(L"当前任务未完成\n"); }} // 方式2:判断执行情况,超时退出,主动结束任务void asyncRun2(HINSTANCE handle, ASYNCSTART asyncStart){ ASYNCSTOP asyncStop = (ASYNCSTOP)GetProcAddress(handle, "AsyncStop"); ASYNCSTATE asyncState = (ASYNCSTATE)GetProcAddress(handle, "AsyncState"); if (asyncStop == NULL || asyncState == NULL) { return; } // 开始任务 BOOL isOver = FALSE; int r = asyncStart(); if (r == 1) { //clock_t start_t = clock(); time_t start_tm; time(&start_tm); // 5分钟后结束任务 while (TRUE) { time_t n; time(&n); // 5分钟后中断 if (difftime(n, start_tm) > 5 * 60) { break; } // 判断任务情况, =0 没开始, =1 正在处理中,=2 已中断, =99 处理完成 int x = asyncState(); if (x == 1) { Sleep(500); } else if (x == 99) { isOver = TRUE; // 处理完成 break; } else { break; } } // if (!isOver) { asyncStop(); // 结束任务 } wprintf(L"方式2--任务完成\n"); } else if (r == 2) { wprintf(L"免费版不支持此功能\n"); } else if (r == 3) { wprintf(L"没有可以执行的任务\n"); } else if (r == 4) { wprintf(L"当前任务未完成\n"); }} void asyncTest(HINSTANCE handle){ ASYNCMAXPROCS asyncMaxProcs = (ASYNCMAXPROCS)GetProcAddress(handle, "AsyncMaxProcs"); ASYNCSTART asyncStart = (ASYNCSTART)GetProcAddress(handle, "AsyncStart"); // if (asyncMaxProcs == NULL || asyncStart == NULL) { return; } // asyncMaxProcs(8); // 同时运行8个任务 // asyncAddTask(handle); // 文件提取任务 asyncAddHttpTask(handle); // Http文件提取任务 // 执行任务--方式1 asyncRun1(handle, asyncStart); // 执行任务--方式2 asyncAddTask(handle); asyncAddHttpTask(handle); asyncRun2(handle, asyncStart);}// ---------------异步批量文件提取,适合多线程处理很多文件--------------- void saveSn(HINSTANCE handle){ SAVESN saveSn = (SAVESN)GetProcAddress(handle, "SaveSn"); saveSn();} int main(){ setlocale(LC_ALL, ""); //std::cout << "Hello World!\n"; wprintf(L"graccvs dll test\n"); // HINSTANCE handle = LoadLibraryA("graccvs64.dll"); //默认64位系统,32位DLL或者接口更新请到官网 if (handle <= 0) { return 0; } LOAD load = (LOAD)GetProcAddress(handle, "Load"); AUTH auth = (AUTH)GetProcAddress(handle, "Auth"); FREESTRING freeString = (FREESTRING)GetProcAddress(handle, "FreeString"); LASTERR lastErr = (LASTERR)GetProcAddress(handle, "LastErr"); UNLOAD unload = (UNLOAD)GetProcAddress(handle, "Unload"); if (load != NULL && auth != NULL && lastErr != NULL && unload != NULL) { // DLL加载,提取文本需要的临时文件夹,且对此文件夹要有读写权限 static char tempPath[128]; wcharToUtf8(L"test", &tempPath[0], 128); load(&tempPath[0]); wprintf(L"init over\n"); // 设置软件许可,免费版都为空 static char corp[128], licText[1024]; wcharToUtf8(L"Beij Gaya", &corp[0], 128); wcharToUtf8(L"", licText, 1024); //企业版这里设置授权文本 &licText[0] auth(&corp[0], &licText[0]); // 提取正文并保存为文本文件 testToTextFile(handle, lastErr); // 提取正文,返回字符串指针 testToString(handle, freeString); // 提取HTTP提取正文, 并保存为文本文件 testHttpToTextFile(handle); // 提取HTTP提取正文, 返回字符串指针 testHttpToString(handle, freeString); // 异步批量文件提取测试 asyncTest(handle); //调用此函数,卸载DLL参数,和load对应使用 unload(); } Sleep(800); FreeLibrary(handle); Sleep(200); wprintf(L"all over\n"); return 1; }
工程文件:
组件提供多种操作系统动态链接库
1)Windows平台: (32bit和64bit)
提供dll格式及GCC、VC、JAVA、C#、delphi调用示例。
2)Linux平台: (64bit)
内核版本4.x及以上, 中标麒麟7.0.0(64bit)及以上。
注:内核版本(64bit)2.6.23到4.0具体以实际情况为准。
提供so格式文件及GCC、JAVA调用示例,其他语言完善中。
3)Android平台:
提供aar格式文件及Android Studio调用示例
4)苹果ios平台:
提供xcframework格式文件及xcode+objective-c调用示例
具体参考相关说明
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~