1

Microsoft は、Office ファイルのバイナリ仕様を公開しています。.Doc からテキストを抽出する必要があります。このページは、Doc からテキストを抽出することは難しくないことを暗示しているようですが、私は従いません。

MS 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));
    }
}

上記はほとんどのテキストを表示しますが、他の多くのものも表示します。

OpenXML 経由で docx を使用しています。セミフォーマットが必要なため、iFilter だけでは不十分です。テキストに対してアルゴリズムを実行して、興味のないドキュメントを選別します。ドキュメントの簡単なテキストにも使用されるため、ファイルをダウンロードするかどうかを決定したり、自動コーディングを行うことができます。

Office 相互運用はオプションではありません。これはサーバー用であり、Microsoft はその環境での Office オートメーションを推奨していません。試してみましたが、処理する必要があるドキュメントの量に対して安定していません。

4

3 に答える 3

2

NPOI は、標準の Word 97-2000 DOC ファイルの読み取りを非常に限定的にサポートしています。

決定した場合は、OpenOffice で使用される Word ファイルをインポートするために使用されるコードを Java から C# に変換することもできます (オープンソース ライセンスの要件を合理的に満たすことができる場合)。ツール Sharpen を使用してコードを変換できます。

ユーザーに表示される前に Word ファイルを前処理する時間があれば、Office オートメーションを使用して Word ファイルを HTML に変換できます。これは、サーバー環境で簡単に処理できます。

もう 1 つのオプションは、独自のリーダーを発明しようとするのではなく、代わりに Aspose Words (http://www.aspose.com/) のような商用ライブラリに投資することです。最終的には、それが最も安価で持続可能な選択肢になる可能性があります。

于 2012-05-06T23:31:47.613 に答える
1

これがまだ実際の場合、同じ問題が発生しました。MS バイナリ ファイル形式は、ワード (.doc)、エクセル (.xls)、パワー ポイント (.ppt)、およびすべての古いバージョンで共通です。最初にこれに従ってバイナリの FAT セクションを読み取る必要があります。そこから、既に述べたように読み取ることができる WordDocument ストリームを抽出します。お役に立てれば。

于 2014-04-09T05:56:36.670 に答える