¿Generar o actualizar un PDF para incluir una marca de agua oculta y encriptada?

10

Antecedentes

Usando LaTeX para escribir un libro. Cuando un usuario compra el libro, el PDF se generará automáticamente.

Problema

El PDF debe tener una marca de agua que incluya el nombre de la persona y la información de contacto.

Pregunta

Qué software cumple con los siguientes criterios:

  • Aplica marcas de agua invisibles y encriptadas a un PDF
  • Fuente abierta
  • Plataforma independiente (Linux, Windows)
  • Rápido (marca un PDF de 200 páginas en menos de 1 segundo)
  • Procesamiento por lotes (exclusivamente controlado por línea de comandos)
  • Resistente al ataque de colusión
  • No frágil (p. Ej., PDF -> EPS -> PDF todavía contiene la marca de agua)
  • Bien documentado (muestra usos de ejemplo)

Ideas y recursos

Algunos pensamientos y hallazgos:

El problema con la PNL es que pueden introducirse errores gramaticales. El problema con la esteganografía es que las imágenes provienen de un caché de imágenes, por lo que recrear ese caché con imágenes con marcas de agua impartirá un retraso al generar el PDF (podría eliminar una imagen del caché, pero esa no es una solución elegante).

¡Gracias!

Dave Jarvis
fuente
Modifique un poco su descripción de los requisitos, de lo contrario no están claros. "marcas de agua indetectables" claramente no son lo que desea ... de lo contrario, ¿cómo las detectaría usted mismo si fuera necesario?
Kurt Pfeifle
No está claro cuál es exactamente el propósito de su sistema concebido: ¿Detectar si el PDF se pasa a otro usuario, aunque su licencia lo prohíba? ¿Detecta si el PDF está impreso en papel, aunque su licencia lo prohíbe? ¿Rastrea el camino de un PDF en particular a través de Internet y rastrea cuándo se abre? ¿O algo mas?
Kurt Pfeifle
@pipitas: si se lanza una versión registrada del PDF, sin permiso, a la naturaleza, me gustaría saber quién lo lanzó. Pero si las personas pueden ver que el PDF tiene una marca de agua, entonces la marca de agua se vuelve mucho más fácil de eludir.
Dave Jarvis

Respuestas:

6

Hice algo similar hace unos años. No cumplió con todos sus criterios "duros". Funcionó así:

  • Puse un área "cliqueable" de 2x2 puntos de tamaño apenas detectable en algún lugar aleatorio en uno de los bordes de una página PDF aleatoria. No es muy probable que se descubra por accidente (entre la carga de otros puntos de acceso que se pueden hacer clic en el PDF de todos modos ...).

  • Si hace clic en el enlace, lo llevará a una página web http://my.own.site/project/87245e386722ad77b4212dbec4f0e912, con algunas viñetas de "erratas" inventadas. (¿Mencioné que 87245e386722ad77b4212dbec4f0e912era el hash MD5 del nombre de la persona + datos de contacto que guardé almacenados en una tabla de DB? :-)

Obviamente, esto no protege contra la impresión + escaneo + ocultamiento o contra un ciclo de "refrying" de PDF. Y también se basa en cierto grado de "seguridad por oscuridad".

Así es como usa Ghostscript para agregar un punto de acceso en el que se puede hacer clic en la esquina inferior izquierda de la página 1 de random-in.pdf:

gs \
 -o random-out.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -c "[ /Rect [1 1 3 3]" \
 -c "  /Color [1 1 1]" \
 -c "  /Page 1" \
 -c "  /Action <</Subtype /URI" \
 -c "  /URI (http://my.own.site/87245e386722ad77b4212dbec4f0e912)>>" \
 -c "  /Subtype /Link" \
 -c "  /ANN pdfmark" \
 -f random-in.pdf

Para hacer que el área en la que se puede hacer clic sea más grande y visible, cambie los parámetros de la línea de comandos como este:

 [....]
 -c "[/Rect [1 1 50 50]" \
 -c "  /Color [1 0 0]" \
 [....]

Aún más simple sería generar y mantener un hash MD5 del PDF en su base de datos. Será uniq para cada PDF que cree, debido a los documentos UUID y CreationDate y ModDate dentro de sus metadatos. Por supuesto, esto también solo permite rastrear los PDF originales en su forma digital ...

Kurt Pfeifle
fuente
¿Alguna vez encontró un PDF en la naturaleza y lo rastreó utilizando esta técnica?
Dave Jarvis
@Dave Jarvis: Sí, lo hice, en cierto modo ... Pero no fue una cosa "seria", no tenía ningún interés real en el seguimiento. Lo hice solo como prueba de concepto, y después de unos 6 meses apagué el servidor web de "seguimiento". Era para un servidor PDF de red, lo había configurado dentro de la empresa de un cliente. El "rastreador" era similar al descrito anteriormente, pero usaba un área de página completa en la que se podía hacer clic. Acabo de rastrear el número de "hits" en el archivo de registro de apache ...
Kurt Pfeifle
Buena idea, pero tenga en cuenta que ejecutar GhostScript en un PDF como ese podría degradar las imágenes muestreadas que contiene, ya que GhostScript no admite no descomprimirlas (lo que pierde información de las imágenes que fueron comprimidas en el estilo JPEG en la entrada) y tiende a aplicar compresión de estilo JPEG a todas las imágenes (incluso las que acaba de descomprimir) ...
SamB
@SamB: Creo que puede agregar -dJPEQ=100 -dQFActor=1.0a la línea de comandos de Ghostscript para asegurarse de que mantendrá el 100% de la calidad JPEG existente. Pero no, no me he dado cuenta de ninguna degradación de la calidad de imagen en mis archivos si utiliza la configuración genérica de -dPDFSETTINGS=/prepresscuando se re-destilación de los PDF con Ghostscript ....
Kurt Pfeifle
[cont.] Y no, no solo se ofrece compresión JPEG para imágenes de Ghostscript, puede usar -dColorImageFilter=/FlateEncode(que es ZIP sin pérdida) para anular el valor predeterminado =/DCTEncode(que es JPEG con pérdida) en versiones anteriores de GS. Desde GS v7.21 El valor predeterminado es =/FlateEncodede todos modos ... Lo mismo que para el color es cierto para -dGrayImageFilter=...( -dMonoImageFilter=...usos /CCITTFaxEncodede forma predeterminada.)
Kurt Pfeifle
1

Muy difícil y no estoy seguro de que esto responda a todas sus preguntas.

No estoy seguro de una solución todo en uno que pueda hacer esto, o aleatorizar.

Sin embargo, si se me encargara esto, pensaría que la forma más fácil es mantener el documento en un formato intermedio, como HTML formateado o similar.

Usando un archivo CSS de impresión o similar, puede hacer que el diseño sea idéntico al libro y usar un script de algún tipo para aleatorizar la imagen, el contenido o cualquier cosa y un componente PDF del lado del servidor que ensambla el documento.

entonces, por ejemplo, cuando alguien compra el documento, su script de compra puede elegir aleatoriamente un número que identifica un mecanismo de protección (por ejemplo, primera imagen, segunda imagen, texto en algún lugar, etc.), y luego generar un enlace de descarga único.

Cuando se llama a ese enlace de descarga, verifica el número, realiza la operación y compila en PDF y luego lo descarga al cliente.

Una vez más, sé que esto no será fácil / directo, pero no está pidiendo algo que sea fácil y esta es la mejor manera en que puedo pensar.

William Hilsum
fuente
@Dave Jarvis: entiendo completamente lo que estás tratando de hacer ... como dije, no estoy seguro de cuál es la mejor solución, pero lo que dije debería al menos funcionar ... lejos de ser fácil.
William Hilsum
@Dave Jarvis - Lo que estaba tratando de decir / transmitir es que nunca he visto una forma fácil de hacer lo que quiere, pero usando PHP / ASP.Net, es más fácil escribir scripts / llamar a terceros componentes. Creo que si tiene todo el documento en formato HTML correcto / exacto, sería muy fácil usar un componente PDF para convertir ... Por ejemplo, digamos que hay 100 páginas y una imagen en la página 31, usted podría tener las páginas 1-30 como PDF y las páginas 32-100 como PDF, la página 31 se generaría y formatearía en html (al estilo del resto del libro), luego puede usar un 1/2
William Hilsum
componente pdf que obtendrá el primer PDF, encubrirá la página html, obtendrá el segundo PDF y generará un nuevo PDF combinando todo. La página generada puede llamar guiones, puede realizar esteganografía (¡no estoy seguro del verbo!) O cualquier otra cosa que desee ... hay muchos componentes pdf (gratuitos y de pago), este es uno por ejemplo ... componentone.com/SuperProducts / PDF Espero que esto aclare un poco lo que estoy tratando de transmitir, pero es muy difícil de explicar. 2/2
William Hilsum
@Dave Jarvis - ehh, no exactamente ... Como dije, muy difícil de explicar ... Algunos componentes de PDF son increíbles junto con CSS / estilos de impresión. Por ejemplo, mira a Moodle. Es posible formatear completamente una página web y hacer que una impresión parezca un libro / seguir un estilo. Luego puede usar un componente PDF para exportar / guardar EXACTAMENTE, como debería verse en el resultado final. Puede generar fácilmente la imagen que necesita y tener el texto, y ensamblarlo (sin problemas para el usuario final) como un solo archivo PDF. Solo menciono web / php / asp.net, ya que creo que es la forma más fácil de llegar a lo que quieres.
William Hilsum
@Dave Jarvis: ¿Supongo que no estás usando pdfTeX, entonces? (¿O le preocupaba más que los usuarios realizaran conversión de pdf-> ps-> pdf y degradaran las imágenes de muestra en el proceso?). De todos modos, PS-> PDF conversión hace imágenes típicamente se degradan, ya que GhostScript no es lo suficientemente inteligente como para preservar las imágenes JPEG de estilo en forma comprimida, y tiende a aplicar automáticamente la compresión JPEG de estilo para alguna de las imágenes que se producen en la entrada. (Al parecer, Distiller puede recibir instrucciones para dejar solo imágenes de estilo JPEG, pero ¿alguien realmente tiene eso?)
SamB