0 Replies Latest reply on Jan 18, 2012 3:44 AM by Gabo86110

    Organizar páginas de un documento PDF

    Gabo86110

      Hola estoy tratando de organizar las páginas de un archivo PDF usando javascript pero he tenido algunos problemas.

       

      Se trata de documentos muy grandes, de mas de 1000 páginas. Actualmente el procso se hace de forma manual, localizando las paginas en un listado y llevandolas a la posisión que le corresponde arrastrandolas en las miniaturas.

       

      Cada págian en el documento pdf, salvo algunas excepciones, esta formada por una cabezara que contiene sólo 4 lineas de texto y el resto de la página contiene imagenes.

       

      La idea es que a partir de esas cuatro lineas que se encuentran en la cabecera se pueda localizar la pagina correcta a partir de una base de datos y posteriormente colocarla en la posisión que le corresponde.

       

      Hasta ahora he podido implementar un codigo en javascript en adobe acrobat 9, el codigo me permite conectar con una base de datos y de forma busque cada uno de los registros a partir del nombre (la primera linea) de cada página.

       

      He hecho varias correcciones tratando de usar la documentación de adobe "developer_guide" y "api_reference", donde sugieren una forma de mover páginas en un documento pdf, sin embargo en cada una me encuentro con que el programa se cuelga, funciona con pocas páginas pero no cuando hago las pruebas con documentos tan grandes.

       

      En el codigo que anexo he logrado que no se cuelgue al menos hasta 150 registros pero tengo otro problema, el archivo crece brutalmente de tamaño de 90 M se fue a casi 5 G.

       

      Espero alguien me pueda ayudar.

       

      No soy muy limpio haciendo codigos espero no cause mucha confución, aún tiene muchos errores (espero no sean muy duros en las criticas jiji)

       

      Despues de todo el rolloaclaro que se me ocurrio que era una buena forma de hacer esto pero si existe otro programa o lenguje que alguien conosca y que tenga el mismo resultado es vienvenida la propuesta.

       

      Saludos.

       

      //**************************************************************

      //**************************************************************

      //**************  ORGANIZADOR DE PDFs  **************

       

      var titulo;
      var numPalabras;
      var numLetras;
      var tituloPartido;
      var numCadenaTitulo;
      var numCadenaPalabras;
      var numPaginaPdf;
      var cadenaTitulo;
      var tituloPdf;
      var pagInicioBusqueda;
      var tituloEncontrado;
      var i;
      var p;


      pagInicioBusqueda = 2;

      //Variables de la base de datos

      var stitulo

       

       


      //**********************************
      //Función para mover hojas
      //**********************************

      function moverPagina(p, destino){



              if (p<destino)
      destino=destino-2;

              if (p>destino)
              destino = destino - 1;

       

      // copiar las paginas en el documento temporal
      this.insertPages({
                      nPage: destino,
        cPath: this.path,
        nStart: p,
        nEnd: p

      });

      // Borrar las pásginas del documento original
      this.deletePages({nStart: p+1, nEnd: p+1});


      }


      function buscaYAcomoda(bdTitulo){

      titulo = bdTitulo;

      //Contar el numero de letras

      numLetras = titulo.length;

      //Partir titulo

      tituloPartido = titulo.split(" ");

      //Contar el numero de palabras

      numPalabras = tituloPartido.length;

      //Imprimir numero de palabras y letras

      console.println("\n" + numLetras);
      console.println("\n" + numPalabras);

      //Tratamiento de titulo

      if (numLetras > 31){

      numCadenaLetras = numLetras;
      numCadenaPalabras = numPalabras;


      while (numCadenaLetras > 31){
        numCadenaPalabras = numCadenaPalabras - 1;
        cadenaTitulo = tituloPartido[0];
        for(i = 1; i <= numCadenaPalabras; i++){
         cadenaTitulo = cadenaTitulo + " " + tituloPartido[i];
        } 
        numCadenaLetras = cadenaTitulo.length;
        console.println(cadenaTitulo);
        console.println(numCadenaPalabras);

      }
      }
      else{
      numCadenaLetras = numLetras;
      numCadenaPalabras = numPalabras - 1;

      //Quitamos todos los espacios al fina del titulo

      while (tituloPartido[numCadenaPalabras] == ""){

        numCadenaPalabras = numCadenaPalabras - 1;
        cadenaTitulo = tituloPartido[0];
        for(i = 1; i <= numCadenaPalabras; i++){
         cadenaTitulo = cadenaTitulo + " " + tituloPartido[i];
        } 
        numCadenaLetras = cadenaTitulo.length;
        console.println(cadenaTitulo);
        console.println(numCadenaPalabras);

      }

      }


      //+++++++++++++++++++++++++++++++++++++++++++
      //+++++++++++++++++++++++++++++++++++++++++++

      //Buscar titulo y devolver la pagina

      //Asignar las variables a ocupar
      tituloPdf = "";
      tituloEncontrado = 0;

       

      p=pagInicioBusqueda -1;//inicia en la pagina anterios porque en la primera instrucción se le suma uno

      while (p < this.numPages-1){

      while (tituloPdf != cadenaTitulo && p < this.numPages){
        p++;

        if (p != this.numPages){

         tituloPdf = this.getPageNthWord (p, 0);
         //Creamos la cadena de la hoja para comparar
         for (i=1; i<=numCadenaPalabras; i++){
          tituloPdf = tituloPdf + " " + this.getPageNthWord (p, i);
         }
         //console.println(tituloPdf);
        }
        if (tituloPdf != cadenaTitulo && tituloEncontrado == 1) break;
      }
      if (tituloPdf == cadenaTitulo && p != this.numPages){
        numPaginaPdf = p;
        console.println("Esta en la página " + (numPaginaPdf+1));
        tituloEncontrado = 1;
        //Regorre las páginas
        moverPagina(numPaginaPdf, pagInicioBusqueda);
        pagInicioBusqueda++;
        tituloPdf="";
      }
      else{
        if (tituloEncontrado == 0){
         console.println("Este titulo no exsiste en este documento: ");
         console.println(tituloPdf);
         tituloEncontrado = 0;
        }
        else{
         p = this.numPages;
        }
      }

      console.println(this.numPages);

      }

       


      }

      //******************************************************
      //******************************************************
      //Incorporar la conexión a la base de datos
      //******************************************************
      //******************************************************


      // Obtain a list of accessible databases:
      var databaseList = ADBC.getDataSourceList();

      // Search the DataSourceInfo objects for the "bd_pdf" database:
      if (databaseList != null) {
           var DB = "";
           for (var i=0; i<databaseList.length; i++)
                if (databaseList[i].name == "bd_pdf") {
                     DB = databaseList[i].name;
                     break;
                }

      }


      if (DB != "") {
           // Connect to the database and obtain a Connection object:
           var myConnection = ADBC.newConnection(DB.name);
      }

       

      // Obtain the array of TableInfo objects representing the database tables:
      var tableArray = myConnection.getTableList();

       

      // Print the name and description of each table to the console:
      for (var i=0; i<tableArray.length; i++) {
           console.println("Table Name: " + tableArray[i].name);
           console.println("Table Description: " + tableArray[i].description);
      }

       

      // Obtain the array of ColumnInfo objects representing the Sales table:
      var columnArray = myConnection.getColumnList("Periodicos");

      myStatement = myConnection.newStatement();

       

      // Create the SQL statement:
      var SQLStatement = 'Select * from \"Periodicos\"';

      // Execute the SQL statement:
      myStatement.execute(SQLStatement);

       

      //Bucle de busqueda

      for (var bd = 1; bd <= 30; bd++){

      // Make the next row (the first row in this case) available:
      myStatement.nextRow();

       

      // Obtain the information contained in the first row (a Row object):
      var firstRow = myStatement.getRow();

      titulo = firstRow.Title.value
      buscaYAcomoda(titulo);


      }


      //Cerramos la conexión
      myConnection.close();