miércoles, 2 de julio de 2008

Hace tiempo que no tocaba un tema de programación en este blog, pero surgio la necesidad de imprimir un documento que viene dentro de un archivo PDF que tenemos que obtener de otro lugar para en teoría llenarlo a mano una vez impreso pero debido al volumen de movimientos respectivos no lo queremos hacer manualmente. Otra cosa a considerar es que la aplicación debe correr en Windows XP, lo remarco porque para GNU/Linux hay algunas aplicaciones pequeñas que hacen el trabajo de manera eficiente, algunos editores de imagenes y otras en linea de comandos. En Windows las que encontre me las vendian y eran pantallas, cosa que no me sirve, en realidad yo necesitaba algo automatico que fuera manejado dentro de una aplicación más grande que necesita obtener como imagen el contenido del PDF para poder manipular la imagen... en fin por eso mejor desarrolle mi propio metodo.


Entonces manos a la obra. Mi parte aqui fue primeramente obtener la página del PDF como una imagen sin que esta sufriera deformaciones. Para lograr mi objetivo decidi usar el objeto COM del Acrobat Reader dentro de una aplicación .NET en el lenguaje C# porque es lo que manejo menos peor y estoy en Windows por motivos de trabajo aunque no pasa mucho tiempo para darme cuenta de lo poco viable de este modo. ¿Alternativas?


El segundo intento pasa por una googleada para documentarme al respecto en lugar de reinventar la rueda. Casi todo lo que encuentro son páginas tratando de venderme aplicaciones que hacen converciones de PDF a otras cosas desde ventanas... no me interesa. Por fin después de la busqueda llego a la conclución de que se puede usar ImageMagik + GhostScript para lograr mi objetivo.


ImageMagik es un potente editor de imagenes capaz de ser usado desde linea de comandos con versiones disponible para GNU/Linux, Mac, Windows y Unix... supongo que también ha de estar portado a BSD. Ademas de eso tiene clases y objetos preparados para su uso en diversos lenguajes de programación. La licencia es GPL y el código fuente esta disponible.


Por su parte ghostscript es un interprete de archivos postscript y PDF. En este caso es necesario para brindar a ImageMagick de compatibilidad con PDF. Esta aplicación permite visualizar e interpretar los archivos. GNU Ghostscript viene ya instalado en muchas distribuciones de Linux, si usas Windows vas a ocupar instalarlo tu mismo.


Consegui la DLL Interop.ImageMagickObject.dll, la agrego a las referencias de la aplicación para poder usar sus metodos en la conversión por medio de una instancia de la clase MagickImageClass. En este caso el metodo que me importa es el metodo CONVERT. Para esto use una función así:

public static bool convertirPDFenImagenes(string archivoOriginal)
{
ImageMagickObject.MagickImageClass imagen = new MagickImageClass();
object[] parametros = new object[8];
string archivoNuevo = string.Empty;
// %04d indica que las imagenes se van a llamar igual que el archivo
// original más un número secuencial 0001, 0002, 0003 y así
// sucesivamente. El 4 es la cantidad de digitos 0 que agregara.
archivoNuevo = archivoOriginal + "%04d.jpg;
// Parametros de conversión. Esta es la calidad que me sirve.
parametros[0] = "-density";
parametros[1] = "300";
parametros[2] = "-quality";
parametros[3] = "100";
parametros[4] = "-define";
parametros[5] = "pdf:use-cropbox=true";
parametros[6] = archivoOriginal;
parametros[7] = archivoNuevo;
try // Realizar la conversión.
{
imagen.Convert(ref parametros);
return true;
}
catch (Exception ex)
{
return false;
}
}

Al estar hecha en C# puede aplicarse por igual en Windows usando el NetFramework o Mono en Visual Studio o en Sharp Develop, o en Linux usando Mono + Mono Develop o cualquier editor de texto si prefieren, y tampoco es dificil traducirla a otros lenguajes de .NET o aun distintos si tienes la capacidad. Lo que más varia seria como referenciar al ImageMagick.


Esta función convierte todas las páginas del PDF en imagenes .jpg, pero puedes adaptarlo para otros tipos de imagen con solo cambiar la extención. Lo he probado para tif, gif y png también. Si no necesitas convertir todo el archivo PDF puedes agregar al archivo original unas [] con un rango dentro, por ejemplo archivo.pdf[4] o archivo.pdf[1-6] tomando en cuenta que la primera página es la cero, no la uno.


¿Y esto funciona? ¿Tiene una aplicación practica para mis lectores? Bueno, pues tal vez sí. Si gustan probar, en base al código fuente arriba mostrado hice otra aplicación menor para mi mismo que hace la conversión de manera sencilla y rapida desde una ventana simple en Windows. Cuando quieras convertir un PDF en imagenes sin pagar un peso ni tener marcas de agua sobre ellas y amenazas de cobros de licencia y esas cosas. Pueden descargarla desde nuestros servidores:


PDF2JPG.exe. Ejecutable, como es de .NET necesitas tener el NetFramework 1.1 o superior o MONO equivalente, aunque las Windows Forms podrian dar problemas.


Interop.ImageMagickObject.dll. Esta DLL es necesaria pues es el objeto que tiene las opcionesd de ImageMagick. Colocala junto al ejecutable.


También vas a necesitar tener ImageMagick y GhostScript. Puedes descargar los instaladores desde sus páginas oficiales arriba enlazadas. Por cierto, por cuestiones practicas laborales no puedo andar corriendo instaladores completos, así que para poner ImageMagick también esta esta opción. Descarga este paquete, el cual contiene una carpeta llamada ImageMagick, la cual debes ponerla en "Archivos de Programa" y luego ejecuta el ImageMagick_OK.reg para que agregue el ImageMagick al registro de Windows y lo puedas usar. Considera eso si quieres evitar la fatiga de ir al sitio de ImageMagick e instalarlo completo.

0 comentarios:

Publicar un comentario

Por favor trata de escribir bien, no te pido que no te falte ni un acento pero por favor evita escribir como metroflogger o facebookero. Este blog es un sitio decente. Gracias.

Subscribe to RSS Feed Follow me on Twitter!