Convertir PDF a SWF con AIR 2 beta

Introducción

Hola Amigos, acá comparto una la solución a un problema que tuve esta semana. Se trata de convertir un archivo PDF al formato flash SWF.

Aca un resumen de los problemas:

  1. No existe (al momento) una forma nativa dentro de AIR para convertir un archivo pdf a swf, entonces tuve que hacer la llamada al comando pdf2swf.exe (SWFTools) desde AIR
  2. La opcion de ejecutar comandos de linea solo esta disponible en Adobe AIR 2 Beta (al momento), entonces me anime a usar la versión beta

El código

import __AS3__.vec.Vector;

import flash.desktop.NativeProcess;
import flash.desktop.NativeProcessStartupInfo;
import flash.events.IOErrorEvent;
import flash.events.NativeProcessExitEvent;
import flash.events.ProgressEvent;
import flash.events.TimerEvent;
import flash.filesystem.File;
import flash.utils.Timer;

import mx.core.FlexGlobals;

public class PDF2SWFConverter
{
	private var command:String;
	private var finished:Boolean = false;
	private var error:Boolean = false;
	private var timer:Timer;
	
	public function PDF2SWFConverter(command:String)
	{
		this.command = command;	
	}
	
	public static function getInstance():PDF2SWFConverter{
		return new PDF2SWFConverter("/path/to/pdf2swf.exe");	
	} 
	
	public function convert(pdfPath:String, swfPath:String):Boolean {
		var nativeProcessStartupInfo:NativeProcessStartupInfo =  new NativeProcessStartupInfo();
		var commandFile:File = new File(command); 
		nativeProcessStartupInfo.executable = commandFile;
		var args:Vector. = new Vector.();
		args.push(pdfPath);
		args.push("-t");
		args.push("-T9");
		args.push("-o");
		args.push(swfPath);
		
		nativeProcessStartupInfo.arguments = args;
		var process:NativeProcess;

		timer = new Timer(1);

		process = new NativeProcess();
		process.start(nativeProcessStartupInfo);
		process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
		process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
		process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
		
		timer.addEventListener(TimerEvent.TIMER, myTimerHandler);

		this.finished = false;
		this.error = false;
		timer.start();

		return !error;
	}
	
	protected function onExit(event:NativeProcessExitEvent):void
	{
		this.finished = true;
	}
	
	public function onErrorData(event:ProgressEvent):void
	{
      		this.error = true;
          		this.finished = true; 
      	}
	
	public function onIOError(event:IOErrorEvent):void
      	{
      		this.error = true;
      		this.finished = true;
      	}
      
      	public function myTimerHandler(e:TimerEvent):void{
      		if(this.finished)
		{
			timer.stop();
		} 
	}
}

Convertir PDF a SWF

Para llamar desde Flex al comando pdf2swf.exe, usamos los objectos: NativeProcessStartupInfo y NativeProcess.

NativeProcessStartupInfo, nos permite definir la información inicial de la llamada (nombre de comando y parametros) a un comando de linea. Este objecto es usado como parámetro para el método start del objeto NativeProcess.

NativeProcess, nos permite realizar la llamada a un comando de linea. Cabe advertir que por motivos de seguridad, no es posible ejecutar archivos .bat.

También es necesario señalar que para ejecutar de comandos de linea la aplicacion AIR tiene que tener configurado el perfil de escritorio extendido. Para esto tenemos que añadir lo siguiente al app.xml de la aplicacion AIR:

extendedDesktop

Como llamar a PDF2SWFConverter

Para llamar al objecto basta con lo siguiente:

var converter:PDF2SWFConverter = PDF2SWFConverter.getInstance();
converter.convert("/path/to/doc.pdf","/path/to/new/doc.swf");

Esta clase es un wrapper (envoltura) para el comando, la ventaja es que uno puede llamar a la clase, ejecutar la conversión y continuar con la secuencia de instrucciones gracias a que se usa el el objeto Timer.

4 thoughts on “Convertir PDF a SWF con AIR 2 beta

  1. OGuzman

    Wow, esta excelente el ejemplo… Soy nuevo con fb4… no tendras el source para poder estudiarlo mas a fondo??? Saludos y gracias de antemano!

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *