Чтение файла MS Word .doc с помощью ruby ​​и win32ole

Я пытаюсь прочитать файл .doc с рубином, я использую библиотеку win32ole.

IT мой код:


require 'win32ole'

class DocParser

  def initialize
    @content = ''
  end

  def read_file file_path
    begin
      word = WIN32OLE.connect( 'Word.Application' )
      doc  = word.activedocument
    rescue
      word = WIN32OLE.new( 'Word.Application' )
      doc  = word.documents.open( file_path )
    end
    word.visible = false
    doc.sentences.each{ |x| @content = @content + x.text }

    word.quit
    @content
  end
end

Я начинаю чтение документов с DocParser.new.read_file('path/file.doc')

Когда я запускаю это с помощью rails c - у меня нет никаких проблем, все работает нормально. Но когда я запускаю его с помощью рельсов (например, после нажатия кнопки), время от времени (каждые 3-4 раза) этот код вылетает с ошибкой:


WIN32OLERuntimeError (failed to create WIN32OLE object from `Word.Application'
    HRESULT error code:0x800401f0
      CoInitialize has not been called.):
  lib/file_parsers/doc_parser.rb:14:in `initialize'
  lib/file_parsers/doc_parser.rb:14:in `new'
  lib/file_parsers/doc_parser.rb:14:in `rescue in read_file'
  lib/file_parsers/doc_parser.rb:10:in `read_file'
  lib/search_engine.rb:10:in `block in search'
  lib/search_engine.rb:43:in `block in each_file_in'
  lib/search_engine.rb:42:in `each_file_in'
  lib/search_engine.rb:8:in `search'
  app/controllers/home_controller.rb:9:in `search'


  Rendered c:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.0ms)
  Rendered c:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (2.0ms)
  Rendered c:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (2.0ms)
  Rendered c:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb (56.0ms)

Кроме того, этот код успешно считывает файл документа, но RAILS ПАДАЕТ ЧЕРЕЗ НЕСКОЛЬКО СЕКУНД: посмотрите на это суть

В чем моя проблема? Как я могу это исправить? Пожалуйста помоги!


person bmalets    schedule 04.06.2014    source источник


Ответы (2)


Не знаю разницы между rails c и rails, поэтому дам случайный совет.

Во-первых, это плохая идея запускать это на веб-сервере каждый раз, когда Word запускается на сервере, так что произойдет, если несколько пользователей начнут использовать это одновременно?

Вам лучше сначала преобразовать файлы .doc в другой формат, например .rtf или .docx (пакетное преобразование?), а затем использовать другие драгоценные камни, которые не требуют самого Word.

Если вы оставите его таким, подумайте о том, чтобы не закрывать слово (удалить word.quit), а закрыть только сам документ, экземпляр будет выбран в следующий раз WIN32OLE.connect

Во время тестирования вам лучше держать слово видимым, чтобы вы могли лучше видеть, что происходит (ошибки?). Я заметил, что ваш путь использует прямую косую черту, в то время как в этом случае необходима обратная косая черта, но, поскольку ваш код запускается несколько раз до ошибки, я полагаю, что это не проблема.

Надеюсь это поможет.

person peter    schedule 04.06.2014

Я обновляю свой рубин с 1.9.3 до 2.0.0.

Теперь рельсы не падают, и у меня нет проблем с win23ole и чтением документов MS Word старой версии.

Я предполагаю, что проблема была в использовании памяти - потому что новый рубин (> 2.0.0) использует новый сборщик мусора.

person bmalets    schedule 04.06.2014