我正在尝试用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
我的问题是什么?我该如何解决? 请帮助!
答案 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)使用新的垃圾收集器。