Générer ou mettre à jour un PDF pour inclure un filigrane caché crypté?

10

Contexte

Utiliser LaTeX pour écrire un livre. Lorsqu'un utilisateur achète le livre, le PDF est généré automatiquement.

Problème

Le PDF doit avoir un filigrane qui comprend le nom et les coordonnées de la personne.

Question

Quel logiciel répond aux critères suivants:

  • Applique des filigranes cryptés et invisibles à un PDF
  • Open source
  • Indépendant de la plateforme (Linux, Windows)
  • Rapide (marque un PDF de 200 pages en moins d'une seconde)
  • Traitement par lots (exclusivement piloté par ligne de commande)
  • Résistant aux collusions
  • Non fragile (par exemple, PDF -> EPS -> PDF contient toujours le filigrane)
  • Bien documenté (montre des exemples d'utilisation)

Idées et ressources

Quelques réflexions et conclusions:

Le problème avec la PNL est que des erreurs grammaticales peuvent être introduites. Le problème avec la stéganographie est que les images proviennent d'un cache d'images, et donc recréer ce cache avec des images filigranées donnera un retard lors de la génération du PDF (je pourrais simplement supprimer une image du cache, mais ce n'est pas une solution élégante).

Je vous remercie!

Dave Jarvis
la source
Veuillez modifier un peu votre description des exigences, sinon elles ne sont pas claires. les "filigranes indétectables" ne sont clairement pas ce que vous voulez ... sinon, comment les détecteriez-vous si vous en aviez besoin?
Kurt Pfeifle
On ne sait pas exactement quel est le but exact de votre système conçu: détecter si le PDF est transmis à un autre utilisateur, même si votre licence l'interdit? Détecter si le PDF est imprimé sur papier, même si votre licence l'interdit? Suivre le chemin d'un PDF particulier via Internet et suivre son ouverture? Ou autre chose?
Kurt Pfeifle
@pipitas: Si une version enregistrée du PDF est publiée, sans autorisation, dans la nature, je voudrais savoir qui l'a publiée. Mais si les gens peuvent voir que le PDF a un filigrane, alors le filigrane devient beaucoup plus facile à contourner.
Dave Jarvis

Réponses:

6

J'ai fait quelque chose de similaire il y a quelques années. Il ne répondait pas à tous vos critères "durs". Cela a fonctionné comme ceci:

  • J'ai placé une zone "cliquable" à peine détectable de taille 2x2 sur un endroit aléatoire à l'une des bordures d'une page PDF aléatoire. Il est peu probable qu'il soit découvert par accident (parmi la charge d'autres hotspots très évidemment cliquables qui étaient de toute façon dans le PDF ...).

  • Si vous cliquez sur le lien, il vous amènera à une page Web http://my.own.site/project/87245e386722ad77b4212dbec4f0e912, avec quelques puces "errata". (Ai-je mentionné qu'il 87245e386722ad77b4212dbec4f0e912s'agissait du hachage MD5 du nom de la personne + des données de contact que j'ai conservées dans une table DB? :-)

Évidemment, cela ne protège pas contre l'impression + la numérisation + la copie ou contre un cycle de "refrying" PDF. Et elle repose également sur un certain degré de «sécurité par l'obscurité».

Voici comment vous utilisez Ghostscript pour ajouter un tel point d'accès cliquable dans le coin inférieur gauche de la page 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

Pour agrandir et rendre visible la zone cliquable au-dessus des paramètres de ligne de commande comme ceci:

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

Encore plus simple serait de générer et de conserver un hachage MD5 du PDF dans votre base de données. Il sera uniq pour chaque PDF que vous créez, en raison des documents UUID et CreationDate et ModDate dans ses métadonnées. Bien sûr, cela ne permet également que de suivre les PDF originaux sous leur forme numérique ...

Kurt Pfeifle
la source
Avez-vous déjà trouvé un PDF dans la nature et l'avez-vous retracé en utilisant cette technique?
Dave Jarvis
@ Dave Jarvis: Oui, je l'ai fait, en quelque sorte ... Mais ce n'était pas une chose "sérieuse", je n'avais pas vraiment d'intérêt pour le suivi. Je l'ai fait uniquement comme preuve de concept et après environ 6 mois, j'ai éteint le serveur Web de "suivi". C'était pour un serveur PDF réseau, j'avais installé au sein de l'entreprise d'un client. Le "tracker" était similaire à celui décrit ci-dessus, mais utilisait une zone cliquable pleine page. Je viens de suivre le nombre de "hits" dans le fichier journal d'apache ....
Kurt Pfeifle
Bonne idée, mais notez que l'exécution de GhostScript sur un PDF comme celui-ci pourrait dégrader les images échantillonnées qu'il contient, car GhostScript ne prend pas en charge leur décompression (ce qui perd des informations à partir d'images compressées au format JPEG en entrée) et tend à appliquer une compression de style JPEG à toutes les images (même celles qu'il vient de décompresser) ...
SamB
@SamB: Je pense que vous pouvez ajouter -dJPEQ=100 -dQFActor=1.0à la ligne de commande Ghostscript pour vous assurer que vous conserverez 100% de la qualité JPEG existante. Mais non, je n'ai pas remarqué de dégradation de la qualité d'image dans mes fichiers si j'utilisais le paramètre générique de -dPDFSETTINGS=/prepresslors de la redistillation de fichiers PDF avec Ghostscript ....
Kurt Pfeifle
[suite] Et non, ce n'est pas seulement la compression JPEG qui est proposée pour les images de Ghostscript - vous pouvez utiliser -dColorImageFilter=/FlateEncode(qui est un ZIP sans perte) pour remplacer la valeur par défaut =/DCTEncode(qui est un JPEG avec perte) dans les anciennes versions GS. Depuis GS v7.21, la valeur par défaut est de =/FlateEncodetoute façon ... La même chose que pour la couleur est vraie pour -dGrayImageFilter=...( -dMonoImageFilter=...utilise /CCITTFaxEncodepar défaut.)
Kurt Pfeifle
1

Très difficile et je ne suis pas sûr que cela répondra à toutes vos questions.

Je ne suis pas sûr d'une solution tout-en-un qui puisse le faire ou randomiser.

Cependant, si j'étais chargé de cela, je penserais que le moyen le plus simple est de conserver le document dans un format intermédiaire tel que HTML formaté, ou similaire.

En utilisant un fichier CSS imprimé ou similaire, vous pouvez obtenir une mise en page identique au livre et utiliser un script quelconque pour randomiser l'image, le contenu ou quoi que ce soit et un composant PDF côté serveur qui assemble le document.

Ainsi donc - par exemple, lorsque quelqu'un achète le document, votre script d'achat peut choisir au hasard un numéro qui identifie un mécanisme de protection (par exemple, première image, deuxième image, texte quelque part, etc.), puis générer un lien de téléchargement unique.

Lorsque ce lien de téléchargement est appelé, il vérifie le numéro, effectue l'opération et le compile en pdf puis le télécharge sur le client.

Encore une fois, je sais que ce ne sera pas facile / simple, mais vous ne demandez pas quelque chose de facile et c'est la meilleure façon de penser.

William Hilsum
la source
@Dave Jarvis - Je comprends parfaitement ce que vous essayez de faire ... comme je l'ai dit, je ne suis pas sûr de la meilleure solution, mais ce que j'ai dit devrait au moins fonctionner ... loin d'être facile.
William Hilsum
@Dave Jarvis - Ce que j'essayais de dire / de faire passer, c'est que je n'ai jamais vu un moyen unique / facile de faire ce que vous voulez, mais en utilisant PHP / ASP.Net, il est plus facile d'écrire des scripts / d'appeler un tiers Composants. Je pense que si vous avez tout le document au format HTML correctement / exactement, il serait très facile d'utiliser un composant PDF pour convertir .... Par exemple, disons qu'il y a 100 pages et une image à la page 31, vous pourrait avoir les pages 1-30 en PDF et les pages 32-100 en PDF, la page 31 serait générée et formatée en html (selon le style du reste du livre), vous pouvez ensuite utiliser un 1/2
William Hilsum
composant pdf qui obtiendra le premier PDF, convertira la page html, récupérera le deuxième PDF et générera un nouveau pdf en le combinant. La page générée peut appeler des scripts, effectuer de la stéganographie (pas sûr du verbe!) Ou tout ce que vous voulez ... il y a beaucoup de composants pdf (gratuits et payants) - c'est un par exemple ... componentone.com/SuperProducts / PDF J'espère que cela rend un peu plus clair ce que j'essaie de faire passer - juste très difficile à expliquer. 2/2
William Hilsum
@Dave Jarvis - hein, pas exactement ... Comme je l'ai dit, très difficile à expliquer .... Certains composants PDF sont incroyables avec les styles CSS / impression. Par exemple, regardez Moodle. Il est possible de formater entièrement une page Web et de donner l'impression à un livre / suivre un style. Vous pouvez ensuite utiliser un composant PDF pour exporter / enregistrer EXACTEMENT comme à quoi il devrait ressembler au résultat final. Vous pouvez facilement générer l'image dont vous avez besoin et avoir le texte, et l'assembler (de manière transparente à l'utilisateur final) en un seul fichier PDF. Je mentionne simplement web / php / asp.net car je pense que c'est le moyen le plus simple d'obtenir ce que vous voulez.
William Hilsum
@Dave Jarvis: Je suppose que vous n'utilisez pas pdfTeX, alors? (Ou étiez-vous plus inquiet à l'idée que les utilisateurs effectuent la conversion pdf-> ps-> pdf et dégradent les exemples d'images dans le processus?). Quoi qu'il en soit, PS-> pdf conversion fait généralement des images Dégradé, car Ghostscript est pas assez intelligent pour conserver les images de style JPEG sous forme comprimée, et tend à appliquer automatiquement la compression de type JPEG à toutes les images qui se produisent dans l'entrée. (Apparemment, Distiller peut être chargé de laisser les images de style JPEG seules, mais est-ce que quelqu'un en a réellement?)
SamB