0

J'utilise Windows Web Server 2008 avec ruby, PDFCreator, Microsoft Office et OpenOffice pour convertir automatiquement des fichiers au format PDF. La configuration fonctionne bien pour les fichiers Microsoft Office, mais je n'ai pas réussi à le faire fonctionner automatiquement avec les fichiers OpenOffice (par exemple .sxw). PDFCreator est capable de convertir des fichiers .sxw sans problème quand je le fais manuellement mais jette l'erreur suivante quand je l'essaie avec mon script ruby ​​ci-dessous.PDFCreator avec des fichiers OpenOffice

Erreur: 1 Description: Le serveur ActiveX n'a ​​pas été démarré! Veuillez utiliser la fonction \ "cStart() \" pour démarrer le serveur 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 

Des idées?

Merci, Peder

Répondre

0

étrange. Maintenant ça marche!

1

Ce script appelle cIsPrintable et recherche dans le registre Windows une commande appelée "Imprimer".

Vous devez avoir installé quelque chose provoquant que cette commande soit créée dans le registre Windows et c'est pourquoi maintenant cela fonctionne.

Questions connexes