Recientemente mi cliente me pidió ayuda para automatizar una serie de tareas con documentos PDF.

Por ejemplo se necesitaba combinar una serie de documentos PDF en un único fichero PDF.

Para trabajar con los documentos disponía de Adobe Acrobat Profesional.

 box_acrobat8_pro_112x112

Al disponer de la herramienta de Adobe pensé que podría resolver el problema utilizando el lenguaje scripting que incorpora.

Se trata de JavaScript con un API muy completo para acceder a los elementos del documento y acciones de la aplicación Adobe Acrobat. Se puede hacer de todoJ hasta invocar WebServives mediante SOAP(no llego a imaginarme como se podría emplear esta posibilidad).

Para buscar información y ejemplos sobre JavaScript de Acrobat  me sirvió de gran ayuda el site Acrobat Developer Center:

acrocentre

Para comenzar, busque la forma de añadir un nuevo menú al interface de Adobe Acrobat para invocar el proceso automatizado.

Para ello se coloque un fichero .js con el nuevo código en la carpeta:

C:\Program Files\Adobe\Acrobat 6.0\Acrobat\Javascripts

En mi caso coloque el fichero custom.js con el siguiente contenido:

//Añadir menu CUSTOM al menu FILE

app.addSubMenu({ cName: "Custom", cParent: "File", nPos: 0 })app.addMenuItem({ cName: "Combinar Ficheros", cParent: "Custom", cExec: "CombinarFicheros()"});

Como resultado al ejecutar la aplicación Adobe Acrobat aparecerá el nuevo submenú en el menú Archivo.

Ahora, después de un tiempo revisando los documentos del Developer Center añadí la función que combina documentos .pdf en un único documento pdf y además colocar en todas las páginas del nuevo documento el pie con numeración de las paginas.

A continuacion el fragmento de codigo:

function CombinarFicheros()

{

    //lista de ficheros

    var aPage=new Array("portada.pdf","01.pdf","02.pdf","03.pdf")

   //carpeta donde estan los ficheros   

    var sMainFolder="/c/man_out/"

    var oDoc = app.newDoc();

    for (c=0; c < aPage.length; c++)

    {

       oDoc.insertPages

       ({

          nPage: oDoc.numPages-1,

          cPath: sMainFolder+aPage [ c ],

        });       

    }

    oDoc.deletePages({nStart: 0, nEnd: 0});    

   

    //Ponemos pie de pagina

    var sNumPages=oDoc.numPages;   

    for (var p = 2; p < sNumPages; p++)

    {

        //calculamos la posicion del pie en funcion de las dimensiones de la pagina

        var inch = 72;

        var aRect=new Array()

        var aPRect = oDoc.getPageBox( {nPage: nPageIndex} );

        aRect[0] = aPRect[0]+ .5*inch;

        aRect[1] = aPRect[3]+.5*inch;

        aRect[2] = 580//numero

        aRect[3] = 5

        //cramos etiqueta de texto

        var f = oDoc.addField(sFieldName, "text", nPageIndex, aRect )

        f.readonly= true;

        f.alignment = "left";

        f.multiline = true;

        f.textColor = color.black;

        f.textFont = font.Helv;

        f.textSize = 12;

        f.value = "Página " + (p+1) + " de " + sNumPages;//Texto del pie           

    }

     oDoc.saveAs("/c/man_out/manual.pdf");

   

    }