Compilar pdf2swf con soporte para PDF protegidos
19 Apr 2010
Existe una herramienta maravillosa que hace la magia de convertir un PDF a SWF (Flash, para que nos entendamos). Si has usado la herramienta habrás comprobado que no funciona con documentos PDF protegidos dando este error:
FATAL PDF disallows copying
Pero gracias a que tenemos acceso al código fuente de la aplicación, podemos lo modificar para que se salta dicha comprobación. En concreto tenemos que editar el fichero lib/pdf/pdf.cc y comentar las líneas 136 y 137:
if(!pi->config_print && pi->nocopy) {msg("<fatal> PDF disallows copying");exit(0);}
if(pi->config_print && pi->noprint) {msg("<fatal> PDF disallows printing");exit(0);}}
La versión de GCC que viene por defecto en Lucid Lynx (GCC-4.4) no se lleva bien con el código fuente de SWFTools 0.9.0 por lo que tenemos que instalar una versión anterior:
$ sudo apt-get install build-essential gcc-4.3 g++-4.3
Adicionalmente hay que instalar unas librerías de desarrollo:
$ sudo apt-get install libungif4-dev libjpeg62-dev libfreetype6-dev
Y ya que estamos lo compilamos estático para que corra sin problemas en cualquier otro Linux.
$ CC=/usr/bin/gcc-4.3 CXX=/usr/bin/g++-4.3 LDFLAGS="-static" ./configure
Si quieres compilar para Windows, puedes hacerlo desde Linux usando MingW:
$ sudo apt-get install mingw32
Y luego compilar de esta forma:
$ ./configure --host=i686-pc-mingw32
Dará un error pq faltan librerías, como por ejemplo zlib. Para instalar estas librerías compiladas para Windows visita http://mxe.cc/.
Más información en: http://www.foolabs.com/xpdf/cracking.html
Actualización: En la versión 0.9.1 hay que modificar el fichero src/jpeg.c cambiando la línea
int jpeg_load_from_mem(unsigned char*_data, int size, unsigned char*dest, int width, int height)
por esta otra:
int jpeg_load_from_mem(unsigned char*_data, int size, unsigned char**dest, int *width, int *height)