Resultados 1 al 4 de 4

Tema: [GUÍA - INFORMACIÓN] Cómo tratar PDF de forma automática

  1. #1
    El señor de los forillos
    Edad
    25
    Mensajes
    2,844

    Predeterminado [GUÍA - INFORMACIÓN] Cómo tratar PDF de forma automática

    Hola a todos.
    Recientemente me he encontrado en la tesitura de tener que imprimir unos ficheros PDF, la tarea no tendría la mayor relevancia de no
    ser porque cada fichero PDF tenía unas 245 páginas, y cada página era una diapositiva que contenía unas pocas líneas de información.

    De modo que lo que he querido hacer es unir la información para no tenerlo todo desperdigado por el documento.
    El usuario no friki cogería el fichero PDF, y copiaría cada diapositiva a un fichero de openoffice, y luego lo pasaría a PDF desde allí.
    Pero como las líneas de la diapositiva son muy cortas, si lo hacemos de esta guisa al final tenemos un bonito texto de líneas que ocupan un cuarto del ancho de la página, y muy largo.
    El objetivo es facilitar la lectura y ahorrar papel y tiempo, al final, para hacer las líneas mas coherentes, tienes que ir línea por
    línea juntándolo todo, borrando espacios, y todo de forma manual, tarea que al final te lleva unas 3 horas y media para mi caso de
    las 245 páginas (así a groso modo,es un proceso muy repetitivo, aburrido, y cargante)

    Pero como yo soy un vago que no quiero perder el tiempo de esta forma, me he puesto a buscar alguna alternativa, y buscando buscando,
    he encontrado pdftotext el nombre es ya de por si bastante explicativo con respecto a lo que hace esta aplicación que funciona
    por terminal de comandos.
    Coge un archivo PDF, y lo pasa a texto plano.
    el código a ejecutar sería:
    Código:
    pdftotext -layout fichero.pdf nuevo-fichero.txt
    NOTA: la opción -layout sirve para que el texto tenga estructura, de lo contrario, tendriámos todo el texto junto sin organizar.

    Una vez hecho esto, si echamos un vistazo al nuevo-fichero.txt con un editor de texto, nos quedamos maravillados al ver que ha
    quedado muy bien. ¡Perfecto!, pero no, no podía ser tan bonito, y ser real. Pues cogemos el texto tal cual, lo copiamos en un
    documento de texto de openoffice, lo guardamos, y, al abrirlo, de nuevo, ya vemos cosas raras: el texto de cada diapositiva, se
    ha guardado en páginas separadas
    , por lo que al final tenemos un fichero de la misma longitud en páginas que el original.
    Esta opción nos nos vale.

    De modo que nos ponemos a mirar mas opciones, y vemos que pdftotext tiene una opción que es -htmlmeta. Esta opción lo que hace
    introducir etiquetas html para general un fichero html (típico de las páginas web), por probar, ejecutamos:
    Código:
    pdftotext -layout -htmlmeta fichero.pdf fichero.html
    Le echamos un vistazo con un editor de texto, y vemos que ha quedado muy bien, con sus etiquetas html, bien ordenadito... parece que
    de momento va bien.
    Entonces nos decimos... si es un fichero html, nuestro navegador web lo abrirá sin problemas, y así es, abrimos nuestro navegador
    web, y vemos que el resultado es fantástico.
    Bien, vamos a ver si hay alguna forma de hacer un pdf con esto. Y la hay. Utilizaremos la herramienta htmldoc, así que nos
    ponemos manos a la obra:
    Código:
    htmldoc --webpage fichero.html -f nuevo.pdf
    ¡Bingo!, tras abrir el fichero nuevo.pdf, vemos el resultado es muy bueno... peeero, un momento, qué eso. Nos acercamos un poco y
    vemos que aunque estructuralmente está muy bien, aparecen símbolos raros por todas partes. Te desesperas, no si al final aún tienes
    que hacerlo a mano.
    Decides mirar el html con tu editor de textos... no se qué falla, si está perfecto.
    Decides mirar el html abierto con el navegador... vaya vaya vaya... el resultado es idéntico al mostrado por el pdf.

    Entonces caes... claro, es que el lenguaje html no acepta las vocales acentuadas, ni las eñes, ni ningún caracter hispano, entonces
    caes en la cuenta de que tienes que substituir, en el fichero html, todas las vocales acentuadas, y demás caracteres hispanos, abrir
    interrogaciones, exclamación, diéresis, eñes... por sus entidades html ¿Qué es una entidad html? Una identidad html es un
    código que se da para representar cierto símbolo en html, ese símbolo puede ser una a acentuada á, o cualquier otro caracter que
    exista.(no todos están representados por las entidades html, para ver una lista bastante completa, consulta
    este enlace).

    ¿De modo, que voy a tener que sustituir todos los caracteres hispanos por sus entidades html? y yo que no quería currar...
    Y no vamos a currar, en efecto, porque vamos a utilizar otra potentísima herramienta: sed. ¿Qué es sed y para qué sirve?. Sed
    es un editor flujo. ¿Editor de flu queeee?

    Para hacerlo lo mas fácil posible explicaré su funcionamiento de forma mundana. Sed lo que hace es coger texto (de dónde nosotros le
    digamos, en este caso de un fichero.html), y lo lee línea por línea, a cada línea, le aplica los cambios que nosotros le digamos que
    aplique. Entonces el resultado es impreso en la pantalla. Pero podemos desviar la salida del programa para que en lugar de que se
    imprima por pantalla, se imprima por ejemplo, en un nuevo-fichero.html.


    De modo que vamos a utilizar sed para cambiar todos los caracteres problemáticos por sus entidades html. Manos a la obra
    Lo primero, funcionamiento básico de sed para cambiar cosas.
    Por ejemplo, si queremos cambiar todas las apariciones de la palabra "papá" por la palabra "mamá" (a partir de ahora, a las palabras,
    las frases, las líneas de texto las vamos a llamar conjunto de caracteres) tendríamos que utilizar este comando:

    Código:
    sed -e 's/papá/mamá/g' mifichero > nuevoFichero
    explicación
    el modo -e indica que se van a ejecutar las opciones que se pongan a continuación
    s = es el comando de sustitución
    g = le dice a sed que lo haga de forma global

    NotaSed puede hacer muchas cosas a parte de lo aquí expuesto, puede borrar un conjunto de líneas, actuar sobre ciertas líneas,
    borrar solo las líneas que empiecen por cierto conjunto de caracteres... sed en combinación con las expresiones regulares es una de
    las herramientas que todo usuario de linux que se precie debería aprender aunque sea un poco, es increiblemente útil.

    Como se puede ver, el comando a ejecutar para cambiar un conjunto de caracteres por otro conjunto diferente es bastante largo, y
    nosotros en nuestro caso queremos hacer un único cambio, si no al menos 16 (5 vocales acentuadas minúsculas + 5 mayúsculas + ñ + Ñ +
    ¿ + ¡ + ü + Ü), pero además aconsejo sustituir las comillas de apertura de comillas dobles, así como su cierre, y las comillas
    simples con sus respectivas entidades html, con lo que en total hacen 19 cambios.

    Hay que tener en cuenta que se podría ejecutar todo en una única línea para aplicar de una única vez los cambios, pero quedaría una
    línea muy larga, y muy complicada de entender, otra opción es aplicar cada vez una sustitución generando ficheros auxiliares cada
    vez, lo que sería muy lento. Y la tercera opción, que es la que vamos a utilizar nosotros, es la de escribir cada uno de los comandos
    en un fichero separado, un comando por línea.

    Os voy a dejar una pequeña muestra de mi fichero:
    Código:
    ### Cambiando letras con acentos
    s/á/\á/g
    s/é/\é/g
    s/í/\í/g
    s/ó/\ó/g
    s/ú/\ú/g
    s/Á/\Á/g
    s/É/\É/g
    s/Í/\Í/g
    s/Ó/\Ó/g
    s/Ú/\Ú/g
    
    ### Poner eñes
    s/ñ/\ñ/g
    s/Ñ/\Ñ/g
    
    ### Poner diéresis
    s/ü/\ü/g
    s/Ü/\Ü/g
    NOTA Como se puede observar veis que antes de todos los "&" antepongo una "\", esto se debe a que sed entiende el ampersand
    como una variable que contiene una cadena de caracteres que se le pasa desde echo, o desde una salida de un programa ...
    con "\" lo que hacemos es decirle a sed, que no tome el "significado por defecto" de & y que lo tome como un caracter mas.

    Imaginemos que a nuestro fichero de comandos de sed lo hemos llamado "entidades-html", entonces ejecutaremos sed de esta forma:
    Código:
    sed -f entidades-html fichero.html > nuevo.html
    Notad que ahora en lugar de -e, hemos puesto -f.

    Si ahora echamos un vistazo con un editor de texto a nuevo.html, vamos a ver que se han hecho las modificaciones necesarias, y nos
    costará mas leerlo. No es lo mismo leer "administración" que: "administración" Eso será buena señal. Nos vamos ahora a ver el
    fichero nuevo.html con nuestro navegador web... y ahora vemos que el fichero tiene una estructura adecuada, y además, se lee sin
    problemas, pues el navegador hacer la traducción de forma correcta.
    Ahora que ya nos hemos asegurado que en el navegador web se ve bien, pasamos nuevo.html a pdf con htmldoc de la siguiente forma:
    Código:
    htmldoc --webpage nuevo.html -f final.pdf
    Y el resultado esta vez si que es válido, y es muy bueno, además conserva una muy buena estructura, sangrado...

    PARTE 2
    Lo anterior lo solucioné en muy poco tiempo, así leído en plan ladrillo suena mas largo, pero realmente no lo es.
    El problema viene con esto, al menos, a mi es lo que mas problemas me ha dado.

    En el caso de que nuestro documento PDF tenga símbolos, como guiones, puntos, asteriscos... al pasarlo a texto, y abrirlo con un
    editor de texto, como por ejemplo leafpad, nos vamos a encontrar con que esos símbolos son representados de forma extraña, en mi caso
    en forma de cuadrado con letras y números en su interior, si lo miramos con less fichero.html, nos encontraremos que nos lo reprsenta
    de esta guisa: <U+F0A7> y otros, como ^L o <U+F0D8> Si ignoramos todo eso, a la hora de pasarlo desde html a PDF nos vamos a
    encontrar con que el PDF sigue teniendo símbolos raros.
    ¿Y cómo quitamos algo que no somos capaces de escribir en el ordenador?

    En realidad si que podemos, esos símbolos raros son caracteres escritos con simbología unicode, si nos fijamos en los
    cuadraditos que nos muestra leafpad, vemos que dentro de los cuadrados hay unos números y unas letras.
    Pero mi consejo es que os fijéis mejor en lo que muestra less.
    Se puede escribir unicode, pero el programa que utilicemos para tal fin debe tener soporte unicode, de lo contrario será imposible.
    En mi caso, que utilizaba xterm, he tenido que instalar gnome-terminal pues xterm no tiene soporte para escribir unicode.

    Para representar el literal (cuando hablamos de literal, nos referimos al símbolo) en aplicaciones gtk, debemos pulsar ctrl +
    shift + u
    entonces nos aparecerá una u subrayada, a continuación introducimos el código que nos dé less, por ejemplo, si less
    mostraba <U+F0A7> haremos: ctrl + shift + u [espacio] f0a7 [espacio] y aparecerá el símbolo unicode, entonces ahora con sed,
    podemos utilizar también unicode como filtro para borrarlo, o sustituirlo por entidades html de los símbolos a los que representa el
    código unicode, o si no exite, por alguno que se le parezca.
    En mi caso, os voy a dejar una muestra de mi fichero de poner-entidades:
    (no se si se verá en el foro, estoy escribiendo el hilo primero con nano)
    Código:
    ### Poniéndo símbolos raros
    s//\&curren; /g
    s//\• /g
    s//\&raquo; /g
    s//\&#42; /g
    Una vez terminado todo, podemos pasar a pdf con htmldoc:
    Código:
    htmldoc --webpage final.html -f terminado.pdf
    Terminado. El resultado es extraordinariamente bueno, se mantiene un sangrado bastante decente, una colocación adecuada, y si tienes
    símbolos, igualmente queda mas lustroso.
    A mi me es muy útil, espero que le pueda valer a alguien.

    Por supuesto, todo esto, si lo hacemos en un script, nos permitirá compactar nuestros pdf's en un segundo.
    PD: Solo funciona con texto, las imágenes son ignoradas
    http://www.linuxware.es/ Una pequeña web linuxera con artículos y videotutoriales
    Si te aburres, si tienes alguna duda que requiera rápida solución....
    >>>Entra en la sala de chat de linux de N3D<<<


  2. #2

    Predeterminado Re: [GUÍA - INFORMACIÓN] Cómo tratar PDF de forma automática

    ¿Has probado pdftohtml o el pdf2oo? quizás sea más sencillo, échale un vistazo si puedes. ¿Para lo de los acentos pensaste usar iconv?

    [EDIT] Coño se me olvidaba felicitarte por el curro[/EDIT]

    Saludos

    Pd Si yo lo tuviera ya en txt como consigues en el primer paso, usaría LaTeX para hacer el pdf, soy un viciado del LaTeX, no tengo remedio
    "Azar es el nombre científico de la ignorancia."
    MUY IMPORTANTE Lee el REF Lee las normas|ESCANEOS Y MÁS ONLINE GRATUITOS|Protocolo de desinfección
    En este subforo hay una COMPARATIVA DE ANTIVIRUS Y CORTAFUEGOS, donde se discuten esos temas. Entra al CHAT

  3. #3

    Predeterminado Re: [GUÍA - INFORMACIÓN] Cómo tratar PDF de forma automática

    Gran Aporte.
     Imac 21,5" i3 3,3 Ghz 4GB RAM 1TB HDD 5670 512MB. Aciagos días

  4. #4

    Predeterminado Re: [GUÍA - INFORMACIÓN] Cómo tratar PDF de forma automática

    Me lo apunto, seguro que algún día me sirve.
    Cooler Master CM 690 II | MSI P67A-GD55 | Intel i5 2500k | Arctic Cooling Freezer 13 | Sapphire Radeon Hd 5850 Xtreme 1GB | Exceleram Rippler DDR3 1600 CL9 2x2GB| Samsung Spinpoint F3 | Corsair TX650.

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •