带有 OpenOffice 文件的 PDFCreator
我使用带有 ruby、PDFCreator、Microsoft Office 和 OpenOffice 的 Windows Web Server 2008 自动将文件转换为 PDF。该设置适用于 Microsoft Office 文件,但我无法让它自动处理 OpenOffice 文件(例如 .sxw)。当我手动执行此操作时,PDFCreator 能够毫无问题地转换 .sxw 文件,但当我使用下面的 ruby 脚本尝试它时,会抛出以下错误。
错误:1 说明:ActiveX 服务器尚未启动!请使用函数“cStart()”来启动ActiveX-Server!
def convert( filename, data )
require 'win32ole'
dirpath = File.join( '/', 'files' )
filepath = File.join( dirpath, filename )
puts filepath
filepath_out = File.join( dirpath, 'output.pdf' )
begin
File.open( filepath, 'wb+' ) { |f| f.write( data ) }
puts File.exists?( filepath ).inspect
pdfcreator = WIN32OLE.new( 'PDFCreator.clsPDFCreator' )
event = WIN32OLE_EVENT.new( pdfcreator )
event.on_event( 'eReady' ) do
File.open( filepath_out, 'rb' ) { |f| update_attribute( :data_converted, f.read ) }
$printed = true
end
event.on_event( 'eError' ) do
pdfcreator.cClose()
raise 'error'
end
if !pdfcreator.cIsPrintable( filepath )
raise 'error'
end
pdfcreator.cStart( '/NoProcessingAtStartup' )
pdfcreator.setproperty( 'cOption', 'UseAutosave', 1 )
pdfcreator.setproperty( 'cOption', 'UseAutosaveDirectory', 1 )
pdfcreator.setproperty( 'cOption', 'AutosaveFormat', 0 )
pdfcreator.setproperty( 'cDefaultprinter', 'PDFCreator' )
pdfcreator.cClearCache()
pdfcreator.setproperty( 'cPrinterStop', false )
pdfcreator.setproperty( 'cOption', 'AutosaveDirectory', File.dirname( filepath_out ) )
pdfcreator.setproperty( 'cOption', 'AutosaveFilename', File.basename( filepath_out ) )
$printed = false
pdfcreator.cPrintfile( "C:\\files" + File.basename( filepath ) )
started_at = Time.new
loop {
pdfcreator.cOption( 'UseAutosave' ) # noop to get ready event
break if $printed
if ( Time.new - started_at )>TIMEOUT
raise 'timeout'
end
sleep 0.5
}
rescue => e
raise e
ensure
begin
pdfcreator.cClearCache()
pdfcreator.cClose()
rescue
end
begin
File.delete( filepath ) if File.exists?( filepath )
File.delete( filepath_out ) if File.exists?( filepath_out )
rescue
end
end
有什么想法吗?
谢谢, 佩德
I use a Windows Web Server 2008 with ruby, PDFCreator, Microsoft Office, and OpenOffice to convert files to PDF automatically. The setup works ok for Microsoft Office files but I have not been able to get it to work automatically with OpenOffice files (e.g. .sxw). PDFCreator is able to convert .sxw files without problem when I do it manually but throws the following error when I try it with my ruby script below.
Error: 1 Description: The ActiveX-Server has not been started! Please use function \"cStart()\" to start the ActiveX-Server!
def convert( filename, data )
require 'win32ole'
dirpath = File.join( '/', 'files' )
filepath = File.join( dirpath, filename )
puts filepath
filepath_out = File.join( dirpath, 'output.pdf' )
begin
File.open( filepath, 'wb+' ) { |f| f.write( data ) }
puts File.exists?( filepath ).inspect
pdfcreator = WIN32OLE.new( 'PDFCreator.clsPDFCreator' )
event = WIN32OLE_EVENT.new( pdfcreator )
event.on_event( 'eReady' ) do
File.open( filepath_out, 'rb' ) { |f| update_attribute( :data_converted, f.read ) }
$printed = true
end
event.on_event( 'eError' ) do
pdfcreator.cClose()
raise 'error'
end
if !pdfcreator.cIsPrintable( filepath )
raise 'error'
end
pdfcreator.cStart( '/NoProcessingAtStartup' )
pdfcreator.setproperty( 'cOption', 'UseAutosave', 1 )
pdfcreator.setproperty( 'cOption', 'UseAutosaveDirectory', 1 )
pdfcreator.setproperty( 'cOption', 'AutosaveFormat', 0 )
pdfcreator.setproperty( 'cDefaultprinter', 'PDFCreator' )
pdfcreator.cClearCache()
pdfcreator.setproperty( 'cPrinterStop', false )
pdfcreator.setproperty( 'cOption', 'AutosaveDirectory', File.dirname( filepath_out ) )
pdfcreator.setproperty( 'cOption', 'AutosaveFilename', File.basename( filepath_out ) )
$printed = false
pdfcreator.cPrintfile( "C:\\files" + File.basename( filepath ) )
started_at = Time.new
loop {
pdfcreator.cOption( 'UseAutosave' ) # noop to get ready event
break if $printed
if ( Time.new - started_at )>TIMEOUT
raise 'timeout'
end
sleep 0.5
}
rescue => e
raise e
ensure
begin
pdfcreator.cClearCache()
pdfcreator.cClose()
rescue
end
begin
File.delete( filepath ) if File.exists?( filepath )
File.delete( filepath_out ) if File.exists?( filepath_out )
rescue
end
end
Any ideas?
Thanks,
Peder
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
该脚本调用
cIsPrintable
并在 Windows 注册表中搜索名为“Print”的命令。您必须安装了某些东西,才会在 Windows 注册表中创建此命令,这就是它现在可以工作的原因。
This script calls to
cIsPrintable
and that searches in Windows Registry for a command called "Print".You must have installed something causing this command be created in windows registry and that's why now it works.
奇怪的。现在它正在工作!
Strange. Now it is working!