PDFCreator с файлами OpenOffice - PullRequest
       32

PDFCreator с файлами OpenOffice

0 голосов
/ 21 июля 2010

Я использую Windows Web Server 2008 с ruby, PDFCreator, Microsoft Office и OpenOffice для автоматического преобразования файлов в PDF. Настройка работает нормально для файлов Microsoft Office, но я не смог заставить ее работать автоматически с файлами OpenOffice (например, .sxw). PDFCreator может конвертировать файлы .sxw без проблем, когда я делаю это вручную, но выдает следующую ошибку, когда я пытаюсь сделать это с помощью моего скрипта ruby, приведенного ниже.

Ошибка: 1 Описание: ActiveX-сервер не был запущен! Пожалуйста, используйте функцию \ "cStart () \", чтобы запустить ActiveX-сервер!

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

Есть идеи?

Спасибо, Педер

Ответы [ 2 ]

1 голос
/ 09 июля 2013

Этот сценарий вызывает cIsPrintable и ищет в реестре Windows команду «Печать».

Вы, должно быть, установили что-то, из-за чего эта команда была создана в реестре Windows, и поэтому теперь она работает.

0 голосов
/ 21 июля 2010

Странно. Теперь это работает!

...