用ruby和win32ole读取MS Word .doc文件

时间:2014-06-04 09:22:41

标签: ruby-on-rails-4 doc ruby-1.9.3 win32ole

我正在尝试用ruby读取.doc文件,我使用win32ole库。

我的代码:


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运行时 - 我没有任何问题,它运行正常。 但是当我使用rails运行它时(例如在按钮点击后),偶尔(每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)

Aditionaly,这段代码成功读取了doc文件,但是在几秒之后RAILS崩溃了:  look at this gist

我的问题是什么?我该如何解决? 请帮助!

2 个答案:

答案 0 :(得分:2)

不知道rails c和rails之间的区别,所以我会给出一些随机的建议。

首先,每次在服务器上运行Word时,在网络服务器中运行它是个坏主意,那么如果多个用户同时开始使用它会发生什么呢?

您最好将.doc文件转换为其他格式,例如.rtf或.docx(批量转换?),然后使用其他不需要Word的宝石。

如果您保持这样,请考虑不要关闭单词(删除word.quit)buit只关闭文档本身,下次WIN32OLE.connect

在测试时,您最好保持可见字,以便您可以更好地了解正在发生的事情(错误?)。 我注意到你的路径使用正斜杠,而在这种情况下需要反斜杠,但由于你的代码在错误之前运行了几次,我认为这不是问题。

希望这有帮助。

答案 1 :(得分:1)

我将ruby从1.9.3升级到2.0.0。

现在rails没有崩溃,我对win23ole和阅读旧版MS Word文档没有任何问题。

我猜问题是内存使用 - 导致新的ruby(> 2.0.0)使用新的垃圾收集器。