从Word Doc二进制文件中提取文本

时间:2012-05-06 22:36:53

标签: c# .net ms-office

Microsoft已发布Office文件的二进制规范。我需要从.Doc中提取文本。这个页面似乎意味着从Doc中提取文本并不难,但我没有遵循。

MS Doc Extract

这是我到目前为止所做的 wIdent和wFib的值是错误的。请指出我正确的方向。

UInt16 wIdent; // (2 bytes): An unsigned integer that specifies that this is a Word Binary File. This value MUST be 0xA5EC.
UInt16 wFib;   // (2 bytes): An unsigned integer that specifies the version number of the file format used. Superseded by FibRgCswNew.nFibNew if it is present. This value SHOULD<13> be 0x00C1.

using (FileStream fs = File.OpenRead(fileName))
{
    UTF8Encoding utf8 = new UTF8Encoding(true);

    BinaryReader brFile = new BinaryReader(fs);

    wIdent = brFile.ReadUInt16();
    Debug.WriteLine(wIdent.ToString());
    Debug.WriteLine(String.Format("{0:x}", wIdent));  // cfd0  wrong value
    wFib = brFile.ReadUInt16();
    Debug.WriteLine(wFib.ToString());   //  57361  wrong value

    byte[] b = new byte[1024];

    while (brFile.Read(b, 0, b.Length) > 0)
    {
        Debug.WriteLine(utf8.GetString(b));
    }
}

上面显示了大部分文字,但也有很多其他内容。

我有通过OpenXML工作的docx。需要的不仅仅是iFilter,因为它需要半格式化。在文本上运行算法以剔除不感兴趣的文档。还用于文档的快速文本,以便他们决定是否要下载文件和自动编码。

Office Interop不是一个选项。这适用于服务器,Microsoft不建议在该环境中使用Office自动化。我们尝试过,它对于我们需要处理的文档量并不稳定。

3 个答案:

答案 0 :(得分:2)

NPOI对阅读标准Word 97-2000 DOC文件的支持非常有限。

如果您确定了,您还可以尝试将用于将OpenOffice使用的Word文件从Java导入C#的代码转换为(如果您可以合理地满足其开源许可证的要求)。 Sharpen工具可用于帮助转换代码。

如果您有足够的时间在用户看到之前预处理Word文件,您可以使用Office自动化将Word文件转换为HTML,这样就可以在服务器环境中处理。

另一种选择是尝试发明自己的读者,而是投资商业图书馆,如Aspose Words(http://www.aspose.com/)。最后,这可能是最便宜和最可持续的选择。​​

答案 1 :(得分:1)

如果这仍然是实际的,我遇到了同样的问题。 MS二进制文件格式对于单词(.doc),excel(.xls),power point(.ppt)和所有旧版本都是通用的。您应该首先按照this来读取二进制文件的FAT部分,然后从中提取您可以读取的WordDocument流,如您所述。 希望这会有所帮助。

答案 2 :(得分:1)

对于这种情况,建议使用Toxy。从Toxy 1.4开始,doc和docx都受支持。您可以访问toxy.codeplex.com了解详细信息。 1.4中不支持格式化,但我们将在1.6中对其进行改进。