Editar PDFs

El problema
Hace un par de meses me vi en la obligación de editar, que no de crear, PDFs.

Se trataba de poner un código aleatorio en un PDF y luego de concatenar todos los PDFs para mandarlos a imprimir. Además, luego tengo que ser capaz de leer ese código con el gocr.

Mi intención era generar los documentos con Open Office, para luego editarlos y pasarlos a PDF, pero la que se lió fue fina.

Al parecer bajarse el Open Office e instalarlo es mucho más difícil que bajarse el MSOffice, bajarse el crack para el MSOffice, bajarse el antispyware para el spyware que te ha metido el crack, bajarse el antivirus para el virus que te ha metido el antispyware e instalarlo todo. Luego el PC va lentísimo pero el usuario está encantado.
Y que conste que no lo digo en tono irónico ... realmente es más fácil para ellos.

La solución
Bueno, al tema, datos de entrada: un PDF.

Datos de salida: el mismo PDF con una cadena de texto añadida.

Lenguaje de programación: php.

No fui capaz de encontrar para php ninguna función libre que permitiera editar PDFs. Solo había para generarlos.
Así que tuve que recurrir a programas externos, mi ingenio ... y a mi memoria. Recordé que en Andago damos soporte a una aplicación de fax que modifica un PDF y le añade el número de teléfono y nombre del remitente.

Pasos
1.- Pasar el PDF a PS con pdf2ps pepe.pdf.
2.- Editar el PS y justo antes del comando showpage añadir las siguientes líneas:

/Helvetica findfont
12 scalefont
setfont
275 390 moveto
(Texto a anhadir) show

2.- Volver a pasar el PS a PDF con un ps2pdf pepe.ps pepe.transformado.pdf

Esta forma tiene unas cuantas pegas:
- El texto no puede llevar caracteres españoles como 'á' o 'ñ'.
- En el documento que se genera no se puede seleccionar el texto.
- El proceso es "lento de cojones" por las dos conversiones entre PDF y PS. Para realizar este proceso en folios de tamaño A3 se me tiraba unos dos segundos. Como tenía que generar unos 12000 PDFs ... una simple multiplicación nos da una idea de lo lento que se hacía el proceso. Pero bueno, el tiempo de CPU es más barato que mis horas de vida y me sirvió para salir del paso.

Usé el siguiente trozo de código en el que parto de una plantilla ($origen) y cuyo resultado guardaré en otro fichero ($destino):

<?php
   # Insertamos el texto que queremos con la fuente helvetica que es la que mejor ve el OCR
   $origen = fopen("$path_origen/instruccionesweb.$idioma.$tipo_encuesta.ps", 'r');
   if ($origen == null) return false;
   $destino = fopen("$path_destino/instruccionesweb.$idioma.$tipo_encuesta.$id_encuesta_txt.ps", 'w');
   if ($destino == null) return false;
     while ($line = fgets($origen) ) {
# $line = trim ($line);
     if (preg_match ('/^\s*showpage$/', $line)) {
       fwrite ($destino, "/Helvetica findfont\n");
       fwrite ($destino, "12 scalefont\n");
       fwrite ($destino, "setfont\n");
       fwrite ($destino, "275 390 moveto\n");
       fwrite ($destino, "($pwd_encuesta) show\n");
       fwrite ($destino, "280 300 moveto\n");
       fwrite ($destino, "($id_encuesta_txt) show\n");
       fwrite ($destino, "/Helvetica-Bold findfont\n");
       fwrite ($destino, "14 scalefont\n");
       fwrite ($destino, "setfont\n");
       fwrite ($destino, "65 730 moveto\n");
       fwrite ($destino, "($descripcion_colegio) show\n");
     }
      fwrite ($destino, $line);
   }
   # Pasamos el fichero a PDF
   echo ("Generando $path_destino/instruccionesweb.$idioma.$tipo_encuesta.$id_encuesta_txt.pdf\n");
   system ("ps2pdf $path_destino/instruccionesweb.$idioma.$tipo_encuesta.$id_encuesta_txt.ps $path_destino/instruccionesweb.$idioma.$tipo_encuesta.$id_encuesta_txt.pdf");
?>