miércoles, 13 de mayo de 2009

Proteger archivos PostScript de ser convertidos a PDF

Si alguna vez has usado formularios PDF rellenables, probablemente hayas notado que no puedes guardar una copia del formulario una vez que ha sido llenado. Siendo astuto, probablemente intentaste imprimir el formulario desde un archivo (PostScript) y luego usar ps2pdf para convertirlo a PDF. Pero eso tampoco funciono, por que ghostscript te da un error diciendo que el archivo no configurable. Este articulo muestra como proteger tu propio PostScript usando la misma técnica.

El código PostScript que protege esos archivo PostScript es el siguiente:

%ADOBeginClientInjection: DocumentSetup Start "No Re-Distill"
%% Removing the following eleven lines is illegal, subject to the
Digital Copyright Act of 1998.
mark currentfile eexec
54dc5232e897cbaaa7584b7da7c23a6c59e7451851159cdbf40334cc2600
30036a856fabb196b3ddab71514d79106c969797b119ae4379c5ac9b7318
33471fc81a8e4b87bac59f7003cddaebea2a741c4e80818b4b136660994b
18a85d6b60e3c6b57cc0815fe834bc82704ac2caf0b6e228ce1b2218c8c7
67e87aef6db14cd38dda844c855b4e9c46d510cab8fdaa521d67cbb83ee1
af966cc79653b9aca2a5f91f908bbd3f06ecc0c940097ec77e210e6184dc
2f5777aacfc6907d43f1edb490a2a89c9af5b90ff126c0c3c5da9ae99f59
d47040be1c0336205bf3c6169b1b01cd78f922ec384cd0fcab955c0c20de
000000000000000000000000000000000000000000000000000000000000
cleartomark
%ADOEndClientInjection: DocumentSetup Start "No Re-Distill"

Entonces todo lo que tienes que hacer para proteger tu archivo PostScript para que no sea convertido a PDF es insertar este código en el PostScript despues de las lineas %BeginSetup o %EndProlog del PostScript. El siguiente código hace eso para el PostScript a través de la linea de comando:

#!/bin/bash

if [[ $# -ne 1 ]]; then
echo "Usage: $0 PSFILE"
exit 1
fi
psfile=$1

nl='
'
protect='
\%ADOBeginClientInjection: DocumentSetup Start "No Re-Distill"
\%\% Removing the following eleven lines is illegal, subject to
the Digital Copyright Act of 1998.
mark currentfile eexec
54dc5232e897cbaaa7584b7da7c23a6c59e7451851159cdbf40334cc2600
30036a856fabb196b3ddab71514d79106c969797b119ae4379c5ac9b7318
33471fc81a8e4b87bac59f7003cddaebea2a741c4e80818b4b136660994b
18a85d6b60e3c6b57cc0815fe834bc82704ac2caf0b6e228ce1b2218c8c7
67e87aef6db14cd38dda844c855b4e9c46d510cab8fdaa521d67cbb83ee1
af966cc79653b9aca2a5f91f908bbd3f06ecc0c940097ec77e210e6184dc
2f5777aacfc6907d43f1edb490a2a89c9af5b90ff126c0c3c5da9ae99f59
d47040be1c0336205bf3c6169b1b01cd78f922ec384cd0fcab955c0c20de
000000000000000000000000000000000000000000000000000000000000
cleartomark
\%ADOEndClientInjection: DocumentSetup Start "No Re-Distill"
'
protect="${protect//$nl/\\n}"

if grep --silent '^%%BeginSetup' $psfile; then
sed -e "/\%\%BeginSetup/a\\$protect" $1
else
sed -e "/\%\%EndProlog/a\\$protect" $1
fi

Para probarlo toma un archivo PostScript desprotegido y conviértelo a un PostScript protegido y luego trata de convertirlo a PDF:

$ ps2pdf unprotected.ps
$ sh prps.sh unprotected.ps >protected.ps
$ ps2pdf protected.ps
This PostScript file was created from an encrypted PDF file.
Redistilling encrypted PDF is not permitted.
Error: /undefined in --eexec--
Operand stack:
--nostringval-- --dict:98/200(L)-- quit
Execution stack:
%interp_exit .runexec2 --nostringval-- ...
Dictionary stack:
--dict:1169/3371(ro)(G)-- --dict:0/20(G)-- ...
Current allocation mode is local
Last OS error: 2
GPL Ghostscript 8.62: Unrecoverable error, exit code 1

Como puedes ver, puedes convertir unprotected.ps a PDF sin problemas, pero una vez que se ha agregado el código de protección super secreto y creado protected.ps ya no puedes convertirlo a PDF.

Fuente.

No hay comentarios: