2017-03-19 103 views
5

Używam Rails 5. Chcę uzyskać tekst z dokumentu programu Word (.doc), więc Korzystam z tego kodu:Pierwsze "Ole :: Storage :: FormatError: Podpis OLE2 jest nieprawidłowy" podczas próby pobrania zawartości z pliku Word doc

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

ale otrzymuję błąd poniżej. Mam ten klejnot w moim Gemfile

gem 'msworddoc-extractor' 

Co jeszcze muszę zrobić, aby uzyskać zawartość Spośród doc Word? Byłoby wspaniale, gdybym mógł zastosować ten sam kod do plików .docx, tak jak robię to do plików .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>' 

Odpowiedz

3

Klejnot, którego używasz, ma klejnot ruby-ole jako zależność. Można go zobaczyć in the code:

ole = Ole::Storage.open(file) 

Podczas importowania dokumentu programu Word jest to naprawdę jest otwierany przez ruby-ole gem. Że skarb będzie raise an exception jeśli nie może potwierdzić, że plik jest prawidłowy format:

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

MAGIC odnosi się do nagłówka pliku .doc, który powinien wyglądać like this:

# 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 

Odnosi się to do CFBF header format w przypadku dokumentów Word:

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

Albo Twoja .doc plik nie jest prawidłowym dokumentem programu Word lub został utworzony przez nowszą wersję programu Word, która nie jest obsługiwana przez klejnot ruby-ole.

Zalecam ponowienie operacji z kilkoma różnymi dokumentami Word w celu znalezienia zgodnego typu, a następnie ponowne zapisanie oryginalnego dokumentu w tym formacie, aby spróbować ponownie.

+1

To jest dokument Worda, który pobrałem z Internetu. Niestety nie jest to opcja ponownego zapisania dokumentu w innym formacie. Muszę znaleźć rozwiązanie Ruby, które może otworzyć plik ".doc". Mogę otworzyć ten dokument za pomocą programu Word 2010. – Dave

+1

W systemie UNIX/Linux można użyć polecenia 'file', np.' File your.doc', a następnie wypisze typ pliku: 'Microsoft Word 2007 +' lub 'Dokument dokumentu złożonego V2, Little Endian, Os: Windows, wersja 5.1, strona kodowa: 1252'. Może to pomóc w określeniu, jaki to jest plik. Używa tego samego rodzaju "testu magicznego" wobec nagłówka pliku, aby określić, jaki to plik. – anothermh

+1

Hi That Unix bardzo mi pomógł - wszystko mnie przekonało, że nie pobieram poprawnie pliku. W każdym razie jeśli czujesz się całkiem dobrze o parsowaniu słowa MS, mam inną otwartą taht pewnie pójdę na nagrodę w dniu ro, więc - http://stackoverflow.com/questions/43077897/how-do-i- parse-an-excel-file-that-will-give-me-data-exact-as-it-appear-visual – Dave

Powiązane problemy