Я пытаюсь прочитать файл .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 ПАДАЕТ ЧЕРЕЗ НЕСКОЛЬКО СЕКУНД: посмотрите на это суть
В чем моя проблема? Как я могу это исправить? Пожалуйста помоги!
CoInitialize
вызывается перед любым вызовомWIN32OLE.new
. Вы можете использовать скрипт «инициализатор» в Rails. - person Ben   schedule 28.08.2015