Ifilter接口是Windows自带的文档解析的接口,Windows Search, SQL 检索, Share Point等使用的都是该接口,目前该接口在Win7 和 XP系统中都可使用。
Ifilter接口派生于Iunknow, 所以自带函数QueryInterface, AddEef, Release, 其主要使用以下几个函数:Init, GetChunk, GetText, Getvalue; 各函数具体情况见MSDN。
以下是实现解析的函数:
(源码来自http://ifilter.codeplex.com/, 源码其实比较简单的使用了ifilter接口的函数,直接使用源码会使得解析出来的中文标点符号出现错误,所以要去掉ValidUnicode()和CleanUpCharacters()函数.
(源码来自http://ifilter.codeplex.com/, 源码其实比较简单的使用了ifilter接口的函数,直接使用源码会使得解析出来的中文标点符号出现错误,所以要去掉ValidUnicode()和CleanUpCharacters()函数.
HRESULT CIfilter::ExtractText(BSTR fileName, long maxLength, BSTR * fileText)
{
//CoInitialize(NULL);
if (NULL == fileName)
return E_POINTER;
if (0 == ::SysStringLen(fileName))
return E_INVALIDARG;
if (NULL == fileText)
return E_POINTER;
*fileText = NULL;
HRESULT hr = E_UNEXPECTED;
try
{
CComPtr<IUnknown> spIUnk;
hr = LoadIFilter(fileName, NULL, reinterpret_cast<void**>(&spIUnk));
if(SUCCEEDED(hr))
{
CComQIPtr<IFilter> spIFilter = spIUnk;
if (spIFilter)
{
DWORD dwFlags = 0;
hr = spIFilter->Init(IFILTER_INIT_CANON_PARAGRAPHS |
IFILTER_INIT_CANON_HYPHENS |
IFILTER_INIT_CANON_SPACES |
IFILTER_INIT_APPLY_INDEX_ATTRIBUTES |
IFILTER_INIT_INDEXING_ONLY|
IFILTER_INIT_FILTER_OWNED_VALUE_OK ,
0, NULL,