Ein PDF generieren oder aktualisieren, um ein verschlüsseltes, verstecktes Wasserzeichen aufzunehmen?

10

Hintergrund

Mit LaTeX ein Buch schreiben. Wenn ein Benutzer das Buch kauft, wird das PDF automatisch generiert.

Problem

Das PDF sollte ein Wasserzeichen enthalten, das den Namen und die Kontaktinformationen der Person enthält.

Frage

Welche Software erfüllt die folgenden Kriterien:

  • Wendet verschlüsselte, unsichtbare Wasserzeichen auf ein PDF an
  • Open Source
  • Plattformunabhängig (Linux, Windows)
  • Schnell (markiert ein 200-seitiges PDF in weniger als 1 Sekunde)
  • Stapelverarbeitung (ausschließlich befehlszeilengesteuert)
  • Kollusionsangriffsresistent
  • Nicht zerbrechlich (z. B. PDF -> EPS -> PDF enthält weiterhin das Wasserzeichen)
  • Gut dokumentiert (zeigt Beispielverwendungen)

Ideen & Ressourcen

Einige Gedanken und Erkenntnisse:

Das Problem mit NLP ist, dass grammatikalische Fehler eingeführt werden können. Das Problem bei der Steganografie besteht darin, dass die Bilder aus einem Bildcache stammen. Wenn Sie diesen Cache also mit Bildern mit Wasserzeichen neu erstellen, verzögert sich die Erstellung der PDF-Datei (ich könnte nur ein Bild aus dem Cache löschen, aber das ist keine elegante Lösung).

Vielen Dank!

Dave Jarvis
quelle
Bitte ändern Sie Ihre Beschreibung der Anforderungen ein wenig, da sie sonst unklar sind. "nicht nachweisbare Wasserzeichen" sind eindeutig nicht das, was Sie wollen ... wie würden Sie sie sonst selbst erkennen, wenn Sie es müssten?
Kurt Pfeifle
Es ist ein bisschen unklar, was genau der Zweck Ihres konzipierten Systems ist: Ermitteln Sie, ob die PDF-Datei an einen anderen Benutzer weitergegeben wird, obwohl Ihre Lizenz dies verbietet? Erkennen Sie, ob das PDF auf Papier gedruckt ist, obwohl Ihre Lizenz dies verbietet? Verfolgen Sie den Weg eines bestimmten PDF über das Internet und verfolgen Sie, wann es geöffnet wird? Oder etwas anderes?
Kurt Pfeifle
@pipitas: Wenn eine registrierte Version des PDF ohne Erlaubnis in freier Wildbahn veröffentlicht wird, würde ich gerne wissen, wer es veröffentlicht hat. Wenn die Leute jedoch sehen können, dass das PDF ein Wasserzeichen enthält, lässt sich das Wasserzeichen viel einfacher umgehen.
Dave Jarvis

Antworten:

6

Ich habe vor ein paar Jahren etwas Ähnliches gemacht. Es hat nicht alle Ihre "harten" Kriterien erfüllt. Es hat so funktioniert:

  • Ich habe einen kaum erkennbaren, anklickbaren Bereich mit einer Größe von 2 x 2 Punkten an einer zufälligen Stelle an einem der Ränder einer zufälligen PDF-Seite platziert. Es ist nicht sehr wahrscheinlich, dass es zufällig entdeckt wird (unter der Last anderer sehr offensichtlich anklickbarer Hotspots, die sowieso im PDF enthalten waren ...).

  • Wenn Sie auf den Link klicken, gelangen Sie zu einer Webseite http://my.own.site/project/87245e386722ad77b4212dbec4f0e912mit einigen erfundenen "Errata" -Aufzählungspunkten. (Habe ich erwähnt, dass dies 87245e386722ad77b4212dbec4f0e912der MD5-Hash des Namens + der Kontaktdaten der Person war, den ich in einer DB-Tabelle gespeichert habe? :-)

Dies schützt natürlich nicht vor Drucken + Scannen + Aufrufen oder vor einem PDF- "Refrying" -Zyklus. Und es beruht auch auf einem gewissen Grad an "Sicherheit durch Dunkelheit".

So verwenden Sie Ghostscript, um einen solchen anklickbaren Hotspot in der unteren linken Ecke von Seite 1 von random-in.pdf hinzuzufügen:

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

Um den anklickbaren Bereich größer und sichtbar zu machen, ändern Sie die Befehlszeilenparameter wie folgt:

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

Noch einfacher wäre es, einen MD5-Hash der PDF-Datei zu generieren und in Ihrer Datenbank zu speichern. Aufgrund der UUID der Dokumente sowie des CreationDate und ModDate in den Metadaten ist es für jedes von Ihnen erstellte PDF eindeutig. Dies ermöglicht natürlich auch nur die Verfolgung der Original-PDFs in ihrer digitalen Form ...

Kurt Pfeifle
quelle
Haben Sie jemals ein PDF in freier Wildbahn gefunden und es mit dieser Technik zurückverfolgt?
Dave Jarvis
@ Dave Jarvis: Ja, ich habe es in gewisser Weise getan ... Aber es war keine "ernste" Sache, ich hatte kein wirkliches Interesse an Tracking. Ich habe es nur als Proof of Concept gemacht und nach ungefähr 6 Monaten den "Tracking" -Webserver ausgeschaltet. Es war für einen Netzwerk-PDF-Server, den ich in der Firma eines Kunden eingerichtet hatte. Der "Tracker" ähnelte dem oben beschriebenen, verwendete jedoch einen ganzseitigen anklickbaren Bereich. Ich habe gerade die Anzahl der "Treffer" in der Apache-Protokolldatei verfolgt ...
Kurt Pfeifle
Gute Idee, aber beachten Sie, dass das Ausführen von GhostScript über eine solche PDF-Datei die darin enthaltenen abgetasteten Bilder beeinträchtigen kann, da GhostScript es nicht unterstützt, sie nicht zu dekomprimieren (wodurch Informationen aus Bildern verloren gehen, die im JPEG-Stil in der Eingabe komprimiert wurden) und dazu neigt
Wenden
@SamB: Ich denke, Sie können -dJPEQ=100 -dQFActor=1.0die Ghostscript-Befehlszeile erweitern, um sicherzustellen, dass Sie die vorhandene JPEG-Qualität zu 100% beibehalten. Aber nein, ich habe keine Verschlechterung der Bildqualität in meinen Dateien bemerkt, wenn ich die generische Einstellung -dPDFSETTINGS=/prepressbeim erneuten Destillieren von PDFs mit Ghostscript verwendet habe ....
Kurt Pfeifle
[Forts.] Und nein, es ist nicht nur die JPEG-Komprimierung, die für Bilder aus Ghostscript angeboten wird - Sie können -dColorImageFilter=/FlateEncode(die verlustfreie ZIP-Datei) verwenden, um die Standardeinstellung =/DCTEncode(die verlustbehaftetes JPEG ist) in älteren GS-Versionen zu überschreiben . Da GS den Standard v7.21 ist =/FlateEncodesowieso ... Die gleiche wie für Farbe gilt für -dGrayImageFilter=...( -dMonoImageFilter=...Anwendungen /CCITTFaxEncodestandardmäßig aktiviert .)
Kurt Pfeifle
1

Sehr schwer und ich bin nicht sicher, ob dies alle Ihre Fragen überhaupt beantworten wird.

Ich bin mir nicht sicher, ob eine All-in-One-Lösung dies kann oder zufällig ist.

Wenn ich jedoch damit beauftragt würde, würde ich denken, dass der einfachste Weg darin besteht, das Dokument in einem Zwischenformat wie formatiertem HTML oder ähnlichem zu halten.

Wenn Sie eine gedruckte CSS-Datei oder ähnliches verwenden, können Sie das Layout mit dem Buch identisch machen und ein Skript verwenden, um das Bild, den Inhalt oder etwas anderes zufällig auszuwählen, sowie eine serverseitige PDF-Komponente, die das Dokument wieder zusammensetzt.

Wenn also beispielsweise jemand das Dokument kauft, kann Ihr Kaufskript zufällig eine Nummer auswählen, die einen Schutzmechanismus identifiziert (z. B. erstes Bild, zweites Bild, Text irgendwo usw.), und dann einen eindeutigen Download-Link generieren.

Wenn dieser Download-Link aufgerufen wird, überprüft er die Nummer, führt den Vorgang aus, kompiliert ihn als PDF und lädt ihn dann auf den Client herunter.

Auch hier weiß ich, dass dies nicht einfach / unkompliziert sein wird, aber Sie fragen nicht nach etwas, das einfach ist, und dies ist der beste Weg, den ich mir vorstellen kann.

William Hilsum
quelle
@ Dave Jarvis - Ich verstehe voll und ganz, was Sie versuchen zu tun ... wie gesagt, ich bin mir nicht sicher, welche Lösung die beste ist, aber was ich gesagt habe, sollte zumindest funktionieren ... alles andere als einfach.
William Hilsum
@ Dave Jarvis - Was ich sagen / vermitteln wollte, ist, dass ich noch nie alles auf eine / einfache Weise gesehen habe, um das zu tun, was Sie wollen, aber mit PHP / ASP.Net ist es einfacher, Skripte zu schreiben / Dritte anzurufen Komponenten. Ich würde denken, wenn Sie das gesamte Dokument in HTML richtig / genau formatiert haben, wäre es sehr einfach, eine PDF-Komponente zum Konvertieren zu verwenden. Nehmen wir zum Beispiel an, Sie haben 100 Seiten und ein Bild auf Seite 31 Wenn Sie die Seiten 1-30 als PDF und die Seiten 32-100 als PDF haben, wird Seite 31 in HTML generiert und formatiert (im Stil des restlichen Buches). Sie können dann einen 1/2
William Hilsum verwenden
PDF-Komponente, die das erste PDF erhält, die HTML-Seite verdeckt, das zweite PDF abruft und ein neues PDF generiert, das alles kombiniert. Die generierte Seite kann Skripte aufrufen, Steganografie durchführen (nicht sicher über das Verb!) Oder alles andere, was Sie wollen ... es gibt viele (kostenlose und kostenpflichtige) PDF-Komponenten - dies ist zum Beispiel ... componentone.com/SuperProducts / PDF Ich hoffe, dies macht ein wenig klarer, was ich zu vermitteln versuche - nur sehr schwer zu erklären. 2/2
William Hilsum
@ Dave Jarvis - ehh, nicht genau ... Wie gesagt, sehr schwer zu erklären ... Einige PDF-Komponenten sind zusammen mit CSS / Druckstilen erstaunlich. Schauen Sie sich zum Beispiel Moodle an. Es ist möglich, eine Webseite vollständig zu formatieren und einen Ausdruck wie ein Buch aussehen zu lassen / einem Stil zu folgen. Sie können dann eine PDF-Komponente verwenden, um genau so zu exportieren / speichern, wie es im Endergebnis aussehen soll. Sie können ganz einfach das Bild erstellen, das Sie benötigen, den Text haben und ihn (nahtlos für den Endbenutzer) als einzelne PDF-Datei zusammenstellen. Ich erwähne nur web / php / asp.net, da ich denke, dass dies der einfachste Weg ist, um zu dem zu gelangen, was Sie wollen.
William Hilsum
@ Dave Jarvis: Ich denke, Sie verwenden dann nicht pdfTeX? (Oder haben Sie sich mehr Sorgen darüber gemacht, dass Benutzer pdf-> ps-> pdf konvertieren und dabei die Beispielbilder verschlechtern?) Auf jeden Fall verschlechtert die ps-> pdf-Konvertierung normalerweise Bilder, da GhostScript nicht intelligent genug ist, um Bilder im JPEG-Stil in komprimierter Form beizubehalten, und die JPEG-Komprimierung automatisch auf alle in der Eingabe auftretenden Bilder anwendet. (Distiller kann anscheinend angewiesen werden, Bilder im JPEG-Stil in Ruhe zu lassen, aber hat das tatsächlich jemand?)
SamB