【问题标题】:Extract Text From Word Doc Binary从 Word Doc 二进制文件中提取文本
【发布时间】:2012-05-06 22:36:52
【问题描述】:

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 互操作不是一个选项。这是针对服务器的,Microsoft 不建议在该环境中使用 Office 自动化。我们尝试过,但对于我们需要处理的文件量来说并不稳定。

【问题讨论】:

    标签: c# .net ms-office


    【解决方案1】:

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

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

    如果您有时间在用户看到 Word 文件之前对其进行预处理,则可以使用 Office 自动化将 Word 文件转换为 HTML,然后在服务器环境中轻松处理。

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

    【讨论】:

    • 谢谢,转换文件不是一个选项,因为文件无法更改。我会看看你提出的其他选择。那个 msdn 页面让它看起来很容易,但我什至无法读取第一个偏移量。
    • 在 Apose 网站上,他们列出了 ASP.NET 和 Win Forms,但没有列出 WPF。他们不支持WPF吗?看起来很奇怪,因为文件转换不是 UI。
    • 我认为这与 UI 无关。我在没有任何 UI 的类库中使用了 Apose。
    • 我越看越想用 C# 使这个提取工作,我知道我可能无法使它工作。它速度很快,并且包含所需的文本。该应用程序需要批量从 100K+ 文档中提取文本,然后对该文本进行一些专有分析,并将剔除 90% 以上。 iFilter 没有足够的结构来进行模式匹配。目前我们有一个前端 .exe 可以解析出文本,但速度很慢,而且有点击费用。
    • NPOI.HWPF 擅长从 Word 97-2003 中提取数据。你可以试试看。但是不支持写
    【解决方案2】:

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

    【讨论】:

    • 为了帮助澄清,word 文档的开头将是上面由 user3041596 提供的定义链接的复合标题。您在上面显示的值 0xcfd0 是复合头签名的一部分。解析此标头后,您可以找到 WordDataStream 开始的位置;这是 FIB 开始的地方,然后您可以在其中找到文本。
    【解决方案3】:

    对于这种情况,建议使用 Toxy。从 Toxy 1.4 开始,同时支持 doc 和 docx。您可以查看 toxy.codeplex.com 了解详细信息。 1.4 中对格式的支持不是很好,但我们会在 1.6 中改进它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多