• 首页
  • 栏目
  • CRM
  • C# 文件搜索过程中如何提取office文件,wps,pdf,html,eml等格式的文件正文

C# 文件搜索过程中如何提取office文件,wps,pdf,html,eml等格式的文件正文

  • 2022-01-16
  • Admin

在文件数据挖掘处理技术中,如何从文本数据中抽取有价值的信息和知识是一个重要的数据挖据分支,是机器学习、自然语言处理、数理统计的基础技术之一,是信息检索,机器学习,AI智能等高端技术的的底层技术支持之一。

本组件智能分析提取其他各种文件中文本,为自然语言信息检索,机器学习等高端技术提供底层支持的技术组件,是Lucene/CLucene, Elasticsearch, Sphinx等全文检索工具,OA, ERP, CRM,网盘,文件管理等其他系统提供文件摘要及搜索前置服务。同时也可以为安全网关,邮件内容监控,内网安全等系统提供文件搜索及监控服务底层技术支持。   

组件提供C#使用组件对大量文件进行文件内容的搜索,为Lucene.Net等提供底层技术支持。系统调用简单方便,效率高。

以下几个步骤即可:

1:  解压直接打开graccvsTest工程

2:  到官网下载graccvs64.dll保存到EXE执行程序所在文件夹下, DLL下载地址

3:  代码中从64行开始定义函数, 从258行是文件取正文示例, testToTextFile函数可以直接输入文件名称函数提取正文并保存为文本文件,  testToString输入rft, html, pdf等文件名称放回字符串. 示例中还提供直接下载HTTP文件并提取正文的方法,使用超级简单.

4: 免费版可以提取50%-80%的文本,基本够用了。

5:  可以下载完整工程包直接测试,   工程下载地址

6:  以下是代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. using System.Threading;
  6. namespace graccvsTest
  7. {
  8. public class DllInvoke
  9. {
  10. [DllImport("kernel32.dll")]
  11. private extern static IntPtr LoadLibrary(string path);
  12. [DllImport("kernel32.dll")]
  13. private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
  14. [DllImport("kernel32.dll")]
  15. private extern static bool FreeLibrary(IntPtr lib);
  16. private IntPtr hLib;
  17. public DllInvoke(String DLLPath)
  18. {
  19. hLib = LoadLibrary(DLLPath);
  20. }
  21. ~DllInvoke()
  22. {
  23. if (hLib != null)
  24. {
  25. FreeLibrary(hLib);
  26. }
  27. }
  28. public Delegate Invoke(string APIName, Type t)
  29. {
  30. if (hLib != null)
  31. {
  32. IntPtr api = GetProcAddress(hLib, APIName);
  33. return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
  34. }
  35. else
  36. {
  37. return null;
  38. }
  39. }
  40. }
  41. class Program
  42. {
  43. //--------------------------------函数定义--------------------------------
  44. // 加载DLL,设置动态库需要的临时文件夹,且对此文件夹要有读写权限
  45. public delegate void LOAD(IntPtr tempPathPtr);
  46. /*
  47. 注册软件:
  48. 方式1:输入参数,corp为公司名称licText为注册码
  49. 方式2:把授权文件grauth.lic保存到动态库相同文件夹,调用TAuth函数(corp, licText都为空)系统自动加载grauth.lic
  50. 返回值:
  51. 0:免费版本许可为空
  52. 1:许可正常
  53. 2:序列号(公司授权名称)错误
  54. 3:加密数据格式错误
  55. 4:许可过期
  56. 5:许可验证错误
  57. 6:无效的许可
  58. 7:未知错误
  59. 注1:如果注册失败,系统变为免费版本
  60. 注2:免费版也需要调用此函数,corp和licText都为空
  61. */
  62. public delegate Int32 AUTH(IntPtr corp, IntPtr licText);
  63. // 提供文件正文,并保存到目标文件
  64. // inFilePtr输入文件指针, outFilePtr为TXT目标文件文件指针
  65. public delegate Int32 TOTEXTFILE(IntPtr inFilePtr, IntPtr outFilePtr);
  66. // 提供文件正文
  67. // inFilePtr输入文件指针, 返回UTF-8编码字符串数据指针(此指针需要使用FREESTRING函数释放内存)
  68. public delegate IntPtr TOSTRING(IntPtr inFilePtr);
  69. // 释放TOSTRING等函数的返回指针
  70. public delegate void FREESTRING(IntPtr p);
  71. // 得到最后的错误信息
  72. public delegate IntPtr LASTERR();
  73. // 提取Http/Https文件,返回字符串数据指针
  74. // url=Http/Https地址
  75. // fileExt=文件类型(比如:".pdf"),
  76. // timeout=超时设置,超过此数值系统终止下载文件。单位为毫秒,默认为0(等待文件下载直到完成)
  77. // httpParams=JSON格式header数据和cookie数据,默认为空
  78. /*
  79. JSON格式如下:
  80. {"headers":
  81. [{名称1: 值1},{名称2: 值2},...],
  82. "cookies":[
  83. {"name": 名称(字符串), "value": 值(字符串), "expires": 有效期(整数,单位毫秒),
  84. "path": 路径(字符串), "domain": 域名(字符串)},
  85. {"name": 名称(字符串), "value": 值(字符串), "expires": 有效期(整数,单位毫秒),
  86. "path": 路径(字符串), "domain": 域名(字符串)}
  87. ...
  88. ]}
  89. 例如:
  90. {"headers":[{"client_id": "g01x9"}, {"client_secret": "e23c89cc9fe"}, {"client_index": 10092}],
  91. "cookies":[{"name": "ga", "value": "1020", "expires":36000000, "path": "/hx/", "domain":"www.gaya-soft.cn"},
  92. {"name": "xc3", "value": "10099", "expires":240000, "path": "", "domain":""}]}
  93. */
  94. // 返回UTF-8编码字符串数据指针(此指针需要使用FREESTRING函数释放内存)
  95. public delegate IntPtr HTTPTOSTRING(IntPtr url, IntPtr fileExt, Int32 timeout, IntPtr httpParams);
  96. // 下载Http文件,并提取文本,保存到目标文件u
  97. // outfile为TXT目标文件文件指针,其他参数和HTTPTOSTRING参数相同
  98. public delegate Int32 HTTPTOTEXTFILE(IntPtr url, IntPtr fileExt, IntPtr outfile, Int32 timeout, IntPtr httpParams);
  99. //---------------------异步批量处理相关函数---------------------
  100. // 文件提取异步任务, Infile输入文件地址, Outfile为TXT目标文件文件
  101. // 如果提取某个文件错误,则 Outfile的内容如下格式: @ErrCode:错误代码, ErrMessage:错误提示
  102. public delegate void ADDTASK(IntPtr inFilePtr, IntPtr outTxtFilePtr);
  103. // 异步提取Http文件任务,参数同 HTTPTOTEXTFILE 函数
  104. public delegate void ADDHTTPTASK(IntPtr url, IntPtr fileExt, IntPtr outTxtFile, Int32 timeout, IntPtr httpParams);
  105. // 开始执行异步任务,返回值=1开始执行, 其他值未识别
  106. // =2 免费版不支持此功能,=3 没有可以执行的任务 ,=4 当前任务未完成
  107. public delegate Int32 ASYNCSTART();
  108. // 停止任务
  109. public delegate void ASYNCSTOP();
  110. // 一直等待,直到全部异步任务结束
  111. public delegate void ASYNCWAIT();
  112. // 得到执行异步任务的状态, =0 没开始, =1 正在处理中,=2 已中断, =99 处理完成
  113. public delegate Int32 ASYNCSTATE();
  114. // 设置执行异步任务的CPU数量(不大于软件授权数量),返回软件授权数量
  115. public delegate Int32 ASYNCMAXPROCS(Int32 num);
  116. //---------------------异步批量处理相关函数---------------------
  117. // 关闭动态库前调用此函数释放资源,否则关闭DLL会发生错误
  118. public delegate void UNLOAD();
  119. //--------------------------------以上为函数定义--------------------------------
  120. //--------------------------------函数变量--------------------------------
  121. static private DllInvoke dll;
  122. static private LOAD load;
  123. static private AUTH auth;
  124. static private LASTERR lastErr;
  125. static private FREESTRING freeString;
  126. static private TOTEXTFILE toTextFile;
  127. static private TOSTRING toString;
  128. static private HTTPTOSTRING httpToString;
  129. static private HTTPTOTEXTFILE httpToTextFile;
  130. static private ADDTASK addTask;
  131. static private ADDHTTPTASK addHttpTask;
  132. static private ASYNCSTART asyncStart;
  133. static private ASYNCSTOP asyncStop;
  134. static private ASYNCWAIT asyncWait;
  135. static private ASYNCSTATE asyncState;
  136. static private ASYNCMAXPROCS asyncMaxProcs;
  137. static private UNLOAD unload;
  138. //--------------------------------函数变量--------------------------------
  139. static public bool loadAllFun()
  140. {
  141. load = (LOAD)dll.Invoke("Load", typeof(LOAD));
  142. auth = (AUTH)dll.Invoke("Auth", typeof(AUTH));
  143. lastErr = (LASTERR)dll.Invoke("LastErr", typeof(LASTERR));
  144. freeString = (FREESTRING)dll.Invoke("FreeString", typeof(FREESTRING));
  145. toString = (TOSTRING)dll.Invoke("ToString", typeof(TOSTRING));
  146. toTextFile = (TOTEXTFILE)dll.Invoke("ToTextFile", typeof(TOTEXTFILE));
  147. httpToString = (HTTPTOSTRING)dll.Invoke("HttpToString", typeof(HTTPTOSTRING));
  148. httpToTextFile = (HTTPTOTEXTFILE)dll.Invoke("HttpToTextFile", typeof(HTTPTOTEXTFILE));
  149. addTask = (ADDTASK)dll.Invoke("AddTask", typeof(ADDTASK));
  150. addHttpTask = (ADDHTTPTASK)dll.Invoke("AddHttpTask", typeof(ADDHTTPTASK));
  151. asyncStart = (ASYNCSTART)dll.Invoke("AsyncStart", typeof(ASYNCSTART));
  152. asyncStop = (ASYNCSTOP)dll.Invoke("AsyncStop", typeof(ASYNCSTOP));
  153. asyncWait = (ASYNCWAIT)dll.Invoke("AsyncWait", typeof(ASYNCWAIT));
  154. asyncState = (ASYNCSTATE)dll.Invoke("AsyncState", typeof(ASYNCSTATE));
  155. asyncMaxProcs = (ASYNCMAXPROCS)dll.Invoke("AsyncMaxProcs", typeof(ASYNCMAXPROCS));
  156. unload = (UNLOAD)dll.Invoke("Unload", typeof(UNLOAD));
  157. if(load ==null || unload == null )
  158. {
  159. return false;
  160. }
  161. else
  162. {
  163. return true;
  164. }
  165. }
  166. public enum DllErrCode
  167. {
  168. TFE_OK = 0,
  169. TFE_UNKNOW = 1,
  170. TFE_FILE_NOTEXIST = 2,
  171. TFE_SAVE_ERROR = 3,
  172. TFE_OUTSIZE = 4,
  173. TFE_UNSUPPORTED = 5,
  174. TFE_ERROR_INTERFACE = 6,
  175. TFE_HTTP_ERR = 7,
  176. TFE_HTTP_FILE_NULL = 8,
  177. TFE_LICENCE_ERR = 9
  178. }
  179. // 根据错误类型返回错误信息
  180. public static string codeText(Int32 code)
  181. {
  182. switch ((DllErrCode)code)
  183. {
  184. case DllErrCode.TFE_OK:
  185. return "ok";
  186. case DllErrCode.TFE_UNKNOW:
  187. return "未知错误";
  188. case DllErrCode.TFE_FILE_NOTEXIST:
  189. return "提取源文件不存在";
  190. case DllErrCode.TFE_SAVE_ERROR:
  191. return "保存目标文件失败";
  192. case DllErrCode.TFE_OUTSIZE:
  193. return "提取的源文件超出设置的大小范围";
  194. case DllErrCode.TFE_UNSUPPORTED:
  195. return "不支持的提取文件格式";
  196. case DllErrCode.TFE_ERROR_INTERFACE:
  197. return "得到接口失败";
  198. case DllErrCode.TFE_HTTP_ERR:
  199. return "HTTP下载文件失败";
  200. case DllErrCode.TFE_HTTP_FILE_NULL:
  201. return "HTTP文件为空";
  202. case DllErrCode.TFE_LICENCE_ERR:
  203. return "软件许可错误";
  204. default:
  205. return "未知错误2";
  206. }
  207. }
  208. //转换为byte[] 为指针,输入byte[]可以避免忘记释放导致的问题
  209. static IntPtr stringToUtf8Pointer(byte[] bts)
  210. {  
  211. return Marshal.UnsafeAddrOfPinnedArrayElement(bts, 0);
  212. }
  213. //utf8指针转换为字符串
  214. static string utf8PointerToString(IntPtr p)
  215. 原文:https://blog.csdn.net/kkyy2021/article/details/122525852

联系站长

QQ:769220720

Copyright © SibooSoft All right reserved 津ICP备19011444号