我正在使用 VB9 (VS2008) 和 Lucene.NET 开发桌面搜索引擎。Lucene.NET 中的索引器仅接受原始文本数据,无法直接从 Microsoft Office(DOC、DOCX、PPT、PPTX)和 PDF 文档中提取原始文本。从此类文件中提取原始文本数据的最佳方法是什么?
3 回答
您可以像 Windows 桌面搜索一样使用实现 IFilter 接口的组件。
我这里只能谈 MS Office 文档。做这件事有很多种方法:
- 使用 COM 自动化
- 使用以更易于访问的格式输出文档的转换器
- 使用第三方库
- 使用微软的 OpenXML SDK
COM 自动化具有并不总是可靠的缺点,主要是因为应用程序往往会由于模式弹出对话框而挂起。
转换器可用于 Word。您可以查看 Microsoft 提供的 Text Converter SDK,它允许您在独立应用程序中使用 Word 附带的文档转换器。需要一些 C 编码,但由于您使用与 Office 相同的转换引擎,您将获得高保真结果。SDK 可以从http://support.microsoft.com/kb/111716获得。
对于使用第三方库的第三个选项,您可能需要查看 Apache POI 或 SourceForge 上的b2xtranslator 项目。后者提供了一个 C# 库,允许您从二进制 Word 文档中提取文本。PowerPoint 开发仍处于早期阶段,但文本提取应该已经开始工作。
最后一个选项是使用 Microsoft 的 OpenXML SDK。这可能是首选/最简单的方式。在 Google 上搜索示例。您还可以通过首先使用 Office 兼容包(从 Microsoft 下载和安装)转换二进制文档来处理二进制文档:
单词:
"C:\Program Files\Microsoft Office\Office12\wordconv.exe" -oice -nme <input file> <output file>
电子表格:
"C:\Program Files\Microsoft Office\Office12\excelcnv.exe" -oice <input file> <output file>
微软幻灯片软件:
"C:\Program Files\Microsoft Office\Office12\ppcnvcom.exe" -oice <input file> <output file>
对于 PDF,您可以使用我公司的具有文本提取功能的.NET PDF 阅读器组件。
这正是您为从 PDF 中提取文本而编写的代码:
public String ReadTextFromPages(Stream s)
{
using (PdfTextDocument doc = new PdfTextDocument(s))
{
PdfTextReader rdr = doc.GetPdfTextReader();
return rdr.ReadToEnd();
}
}