2017-03-19 16 views
5

Rails 5を使用しています。Word文書(.doc)からテキストを取り出したい私はこのコードを使用していますWord文書からコンテンツを取得しようとすると「Ole :: Storage :: FormatError:OLE2署名が無効です」

text = nil 
    MSWordDoc::Extractor.load(file_location) do |ctl00_MainContent_List1_grdData| 
    text = contents.whole_contents 
    end 

私は以下のエラーが表示されます。私は私のGemfileにこの宝石を持っています

gem 'msworddoc-extractor' 

Word文書からコンテンツを取り出すには他に何が必要ですか? .docxファイルに同じコードを適用して.docファイルに適用するといいですね。

/Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/support.rb:201: warning: constant ::Fixnum is deprecated 
Ole::Storage::FormatError: OLE2 signature is invalid 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/storage/base.rb:378:in `validate!' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/storage/base.rb:370:in `initialize' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/storage/base.rb:112:in `new' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/storage/base.rb:112:in `load' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/storage/base.rb:79:in `initialize' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/storage/base.rb:85:in `new' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/ruby-ole-1.2.12/lib/ole/storage/base.rb:85:in `open' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/msworddoc-extractor-0.2.0/lib/msworddoc/extractor.rb:11:in `load' 
    from /Users/davea/Documents/workspace/myproject/app/services/msword_processor_service.rb:12:in `pre_process_data' 
    from /Users/davea/Documents/workspace/myproject/app/services/abstract_import_service.rb:88:in `process_race_data' 
    from (irb):2 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>' 
    from bin/rails:4:in `require' 
    from bin/rails:4:in `<main>' 

答えて

3

使用している宝石には、宝飾品ruby-oleが依存しています。あなたはin the codeそれを見ることができます。

ole = Ole::Storage.open(file) 

あなたのWord文書は、それが本当にruby-ole宝石によって開かれているインポートする場合。

# i have seen it pointed out that the first 4 bytes of hex, 
# 0xd0cf11e0, is supposed to spell out docfile. hmmm :) 
MAGIC = "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" # expected value of Header#magic 

これはCFBF header formatを参照:

raise FormatError, "OLE2 signature is invalid" unless magic == MAGIC 

MAGIClike thisになります.docファイルのヘッダを参照:それはファイルが適切な形式であることを検証することができない場合に逸品raise an exceptionますWord文書の場合:

BYTE _abSig[8];    // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 
          // 0x1a, 0xe1} for current version 

.docファイルが有効なWord文書でないか、ruby-ole gemでサポートされていない新しいバージョンのWordで作成されたものです。

いくつかの異なるWord文書で操作を再試行して、互換性のあるタイプを見つけて、元の文書をその形式で再保存してもう一度お試しになることをおすすめします。

+1

これはインターネットからダウンロードしたWord文書です。残念ながら、別の形式に文書を再保存することはできません。私は ".doc"ファイルを開くことができるRubyソリューションを見つける必要があります。この文書をWord 2010で開くことができます。 – Dave

+1

UNIX/Linuxでは 'file your.doc'のような' file'コマンドを使うことができます。ファイルタイプは 'Microsoft Word 2007 +'です。 'コンポジットドキュメントファイルV2ドキュメント、リトルエンディアン、Os:Windows、バージョン5.1、コードページ:1252 '。これは、ファイルの種類を判断するのに役立ちます。これはファイルヘッダーに対して同じ種類の "マジックテスト"を使用して、ファイルの種類を判別します。 – anothermh

+1

こんにちは、UNIXのコマンドが本当に私を助けてくれました。私はファイルを適切にダウンロードしたくないことを知りました。とにかく、あなたはMSの単語の解析についてはかなり良いと感じる場合、私は別のオープンtahtはおそらく1日roの賞金に行くでしょう - http://stackoverflow.com/questions/43077897/how-do-i-データを正確に出現させるデータを解析するファイルを解析する – Dave

関連する問題