2017-03-19 3 views
5

레일 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' 

다른 내가 워드 문서 밖으로 콘텐츠를하려면 어떻게해야합니까? .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 보석에서 지원하지 않는 최신 버전의 Word에서 작성한 것입니다.

여러 다른 Word 문서로 작업을 다시 시도하여 호환 가능한 유형을 찾은 다음 원본 문서를 해당 형식으로 다시 저장하여 다시 시도하는 것이 좋습니다.

+1

이것은 인터넷에서 다운로드 한 워드 문서입니다. 슬프게도 문서를 다른 형식으로 다시 저장하는 것은 옵션이 아닙니다. ".doc"파일을 열 수있는 Ruby 솔루션을 찾아야합니다. 이 문서를 Word 2010에서 열 수 있습니다. – Dave

+1

UNIX/Linux에서는'file your.doc'와 같은'file' 명령을 사용할 수 있습니다. 그러면 파일 형식이 출력됩니다 :'Microsoft Word 2007 +'또는 'Composite Document File V2 Document, Little Endian, Os : Windows, Version 5.1, Code page : 1252'를 참조하십시오. 어떤 파일인지 판단하는 데 도움이 될 수 있습니다. 이것은 파일 헤더에 대해 같은 종류의 "마법 테스트"를 사용하여 파일 유형을 판별합니다. – anothermh

+1

안녕하세요, 유닉스 명령이 정말로 저를 도와 주셨습니다. 파일을 제대로 다운로드하지 않을 것 같았습니다. 어쨌든 MS 워드 파싱에 대해 꽤 좋은 생각이 든다면, 또 하나의 오픈 타트가 아마 하루 ro의 현상금에 갈 것입니다. - http://stackoverflow.com/questions/43077897/how-do-i- 데이터를 정확히 파싱하는 시각적 효과를 제공하는 파싱 - 액셀 파일 – Dave