Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Word文档二进制文件中提取文本_C#_.net_Ms Office - Fatal编程技术网

C# 从Word文档二进制文件中提取文本

C# 从Word文档二进制文件中提取文本,c#,.net,ms-office,C#,.net,Ms Office,微软已经发布了Office文件的二进制规范。我需要从.Doc中提取文本。这一页似乎暗示从Doc中提取文本并不困难,但我不这么认为 这就是我目前所拥有的。 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 b

微软已经发布了Office文件的二进制规范。我需要从.Doc中提取文本。这一页似乎暗示从Doc中提取文本并不困难,但我不这么认为

这就是我目前所拥有的。 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));
    }
}
上面显示了大部分文本,但也显示了许多其他内容

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


办公室互操作不是一个选项。这是针对服务器的,Microsoft不建议在该环境中使用Office automation。我们尝试过,但对于需要处理的文档量来说,它并不稳定。

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

如果您确定,您还可以尝试将OpenOffice使用的Word文件从Java导入到C中,前提是您可以合理地满足其开源许可证的要求。锐化工具可用于帮助转换代码

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


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

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

如果您确定,您还可以尝试将OpenOffice使用的Word文件从Java导入到C中,前提是您可以合理地满足其开源许可证的要求。锐化工具可用于帮助转换代码

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


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

如果这仍然是事实,我也遇到了同样的问题。 MS二进制文件格式是word.doc、excel.xls、power point.ppt和所有旧版本的通用格式。您应该首先阅读二进制文件的FAT部分,从中提取WordDocument流,您可以像前面提到的那样读取它。
希望这能有所帮助。

如果这仍然是事实,我也遇到了同样的问题。 MS二进制文件格式是word.doc、excel.xls、power point.ppt和所有旧版本的通用格式。您应该首先阅读二进制文件的FAT部分,从中提取WordDocument流,您可以像前面提到的那样读取它。
希望这有帮助。

对于这种情况,建议使用Toxy。自Toxy 1.4以来,doc和docx都受支持。有关详细信息,请访问toxy.codeplex.com。格式在1.4中不太受支持,但我们将在1.6中对其进行改进。

对于这种情况,建议使用Toxy。自Toxy 1.4以来,doc和docx都受支持。有关详细信息,请访问toxy.codeplex.com。格式在1.4中不太受支持,但我们将在1.6中对其进行改进。

谢谢,转换文件不是一个选项,因为文件无法更改。我会看看你提出的其他选择。那个msdn页面看起来很简单,但我还是无法阅读第一个偏移量。在Apose网站上,他们列出了ASP.NET和Win表单,但没有WPF。他们不支持WPF吗?似乎很奇怪,因为文件转换不是UI。我不认为它与UI有任何关系。我在类库中使用过Apose,但没有任何UI。我看得越多,就越想让这个摘录在C中工作,我知道我可能无法让它工作。它很快,并且包含所需的文本。该应用程序需要批量从100K+文档中提取文本,然后对该文本进行一些专有分析,并剔除90%+。iFilter没有足够的结构进行模式匹配。目前,我们有一个前端.exe可以解析文本,但速度很慢,而且有点击收费。NPOI.HWPF擅长从Word 97-2003中提取数据。你可以试试。但是不支持写入。由于无法更改文件,因此无法转换文件。我会看看你提出的其他选择。那个msdn页面看起来很简单,但我还是无法阅读第一个偏移量。在Apose网站上,他们列出了ASP.NET和Win表单,但没有WPF。他们不支持WPF吗?看起来很奇怪
版本不是UI。我认为它和UI没有任何关系。我在类库中使用过Apose,但没有任何UI。我看得越多,就越想让这个摘录在C中工作,我知道我可能无法让它工作。它很快,并且包含所需的文本。该应用程序需要批量从100K+文档中提取文本,然后对该文本进行一些专有分析,并剔除90%+。iFilter没有足够的结构进行模式匹配。目前,我们有一个前端.exe可以解析文本,但速度很慢,而且有点击收费。NPOI.HWPF擅长从Word 97-2003中提取数据。你可以试试。但是不支持书写为了帮助澄清,word文档的开头将是上面由user3041596提供的链接定义的复合标题。上面显示的值0xcfd0是复合标头签名的一部分。一旦你解析了这个头,你就可以找到WordDataStream开始的位置;这就是FIB开始的地方,也就是你可以找到文本的地方。为了帮助澄清,word文档的开头将是上面由user3041596提供的链接定义的复合标题。上面显示的值0xcfd0是复合标头签名的一部分。一旦你解析了这个头,你就可以找到WordDataStream开始的位置;这就是小谎的开始,也就是你可以找到文本的地方。