Generieren oder aktualisieren Sie ein PDF, um ein verschlüsseltes, verstecktes Wasserzeichen aufzunehmen.

2242
Dave Jarvis

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 auf ein PDF verschlüsselte, unsichtbare Wasserzeichen an
  • Open Source
  • Plattformunabhängig (Linux, Windows)
  • Schnell (markiert ein 200-seitiges PDF in weniger als einer Sekunde)
  • Stapelverarbeitung (ausschließlich über die Befehlszeile gesteuert)
  • Kollusionsangriff beständig
  • Nicht zerbrechlich (z. B. PDF -> EPS -> PDF enthält noch das Wasserzeichen)
  • Gut dokumentiert (zeigt beispielhafte Verwendungen)

Ideen & Ressourcen

Einige Gedanken und Erkenntnisse:

Das Problem bei NLP ist, dass Grammatikfehler eingeführt werden können. Das Problem bei der Steganographie besteht darin, dass die Bilder aus einem Bildcache stammen. Wenn Sie also den Cache mit Bildern mit Wasserzeichen wiederherstellen, wird die PDF-Erzeugung verzögert (ich könnte nur ein Bild aus dem Cache löschen, aber das ist keine elegante Lösung).

Vielen Dank!

10
Bitte ändern Sie Ihre Beschreibung der Anforderungen ein wenig, sonst sind sie unklar. * "nicht nachweisbare Wasserzeichen" * sind offensichtlich nicht das, was Sie wollen ... wie würden Sie sie selbst erkennen, wenn Sie es müssten? Kurt Pfeifle vor 13 Jahren 0
Es ist ein wenig unklar, was genau der Zweck Ihres Systems ist: Erkennen, ob die PDF-Datei an einen anderen Benutzer weitergegeben wird, obwohl Ihre Lizenz dies verbietet? Erkennen, ob das PDF auf Papier gedruckt ist, obwohl dies in Ihrer Lizenz verboten ist? Den Weg einer bestimmten PDF-Datei durch das Internet verfolgen und nach dem Öffnen verfolgen? Oder etwas anderes? Kurt Pfeifle vor 13 Jahren 0
@pipitas: Wenn eine registrierte Version des PDFs ohne Erlaubnis in die Wildnis freigegeben wird, würde ich gerne wissen, wer es veröffentlicht hat. Wenn die Benutzer jedoch erkennen können, dass die PDF-Datei ein Wasserzeichen hat, lässt sich das Wasserzeichen so viel einfacher umgehen. Dave Jarvis vor 13 Jahren 0

2 Antworten auf die Frage

6
Kurt Pfeifle

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

  • Ich habe einen kaum nachweisbaren, "anklickbaren" Bereich mit 2x2 Punktgröße an einem zufälligen Ort an einem Rand 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 sich ohnehin in der PDF-Datei befanden ...).

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

Offensichtlich schützt dies nicht vor Drucken + Scannen + Stellen oder vor einem PDF-Aktualisierungszyklus. Und es hängt auch von einem gewissen Maß an "Sicherheit durch Unbekanntheit" ab.

So fügen Sie mit Ghostscript einen solchen anklickbaren Hotspot in der unteren linken Ecke von Seite 1 von random-in.pdf hinzu:

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 zu vergrößern 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 in Ihrer Datenbank zu generieren. Aufgrund der UUID der Dokumente sowie des CreationDate und des ModDate in ihren Metadaten ist es für jede erstellte PDF-Datei einheitlich. Natürlich können Sie damit auch nur die Original-PDFs in digitaler Form verfolgen ...

Haben Sie jemals ein PDF in der Wildnis gefunden und mit dieser Technik zurückverfolgt? Dave Jarvis vor 13 Jahren 0
@Dave Jarvis: Ja, das habe ich in gewisser Weise ... Aber es war keine "ernsthafte" Sache, ich hatte kein echtes Interesse am Tracking. Ich habe es nur als Proof of Concept gemacht und nach etwa 6 Monaten habe ich den "Tracking" Webserver abgeschaltet. Es war für einen Netzwerk-PDF-Server, den ich im Unternehmen eines Kunden eingerichtet hatte. Der "Tracker" ähnelte dem oben beschriebenen, verwendete jedoch einen vollseitigen anklickbaren Bereich. Ich habe gerade die Anzahl der "Treffer" in der Apache-Protokolldatei nachverfolgt. Kurt Pfeifle vor 13 Jahren 0
Eine gute Idee, aber beachten Sie, dass das Ausführen von GhostScript über eine solche PDF-Datei die darin enthaltenen gesampelten Bilder beeinträchtigen könnte, da GhostScript das Dekomprimieren von Bildern nicht unterstützt (wodurch Informationen von Bildern verloren gehen, die in der Eingabe im JPEG-Format komprimiert wurden) und dazu neigen Wenden Sie die JPEG-Komprimierung auf alle Bilder an (auch die, die gerade dekomprimiert wurden). SamB vor 13 Jahren 0
@SamB: Ich denke, ** Sie können der Ghostscript-Befehlszeile -dJPEQ = 100 -dQFActor = 1.0 hinzufügen, um sicherzustellen, dass Sie 100% der vorhandenen JPEG-Qualität beibehalten. Aber nein, ich habe keine Verschlechterung der Bildqualität in ** meinen ** Dateien festgestellt, wenn ich die generische Einstellung von -dPDFSETTINGS = / prepress verwendet habe, wenn ich PDFs mit Ghostscript neu destilliere .... Kurt Pfeifle vor 13 Jahren 0
[contd.] Und nein, es gibt nicht nur JPEG-Komprimierung für Bilder von Ghostscript - Sie können `-dColorImageFilter = / FlateEncode` (verlustfreie ZIP-Datei) verwenden, um die Standardeinstellung` = / DCTEncode` (die verlustbehaftet ist) zu überschreiben JPEG) in älteren GS-Versionen. Seit GS v7.21 ist der Standardwert ohnehin `= / FlateEncode` ... Gleiches wie für color gilt für -dGrayImageFilter = ...` (`-dMonoImageFilter = ...` verwendet standardmäßig `/ CCITTFaxEncode`.) Kurt Pfeifle vor 13 Jahren 0
Wie kann man das Wasserzeichen mehreren Seiten / allen Seiten hinzufügen? Ich habe bereits versucht, den gesamten Block zu wiederholen (`[/ Rect ... pdfmark`), jedoch mit unterschiedlichen Seitenzahlen ohne Erfolg. Nur das Kopieren der `/ Page'-Befehle in diesem Block funktioniert ebenfalls nicht. Ich denke, ich muss [pdf-Dokumentation von PostScript] lesen (http://www.adobe.com/content/dam/Adobe/de/devnet/acrobat/pdfs/pdfmarkreference.pdf). ComFreek vor 7 Jahren 0
1
William Hilsum

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

Ich bin mir nicht sicher, ob es sich um eine All-in-One-Lösung handelt, die dies oder randomisieren kann.

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.

Mit einer CSS-Druckdatei oder ähnlichem können Sie das Layout mit dem Buch identisch machen und ein Skript verwenden, um das Bild, den Inhalt oder etwas zufällig zu sortieren, und eine serverseitige PDF-Komponente, die das Dokument wieder zusammenbaut.

So kann Ihr Kaufskript beispielsweise beim Kauf eines Dokuments 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, prüft er die Nummer, führt die Operation aus, erstellt eine PDF-Datei und lädt sie dann zum Client herunter.

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

@Dave Jarvis - Ich verstehe voll und ganz, was Sie zu tun versuchen ... Wie gesagt, ich bin mir nicht sicher, welche Lösung das Beste ist, aber was ich sagte, sollte zumindest funktionieren ... einfach alles andere als einfach. William Hilsum vor 13 Jahren 0
@Dave Jarvis - Ich habe versucht zu sagen, dass ich noch nie einen einfachen Weg gesehen habe, was Sie wollen, aber mit PHP / ASP.Net ist es einfacher, Skripte zu schreiben oder Dritte anzurufen Komponenten. Ich würde denken, wenn Sie das gesamte Dokument in HTML korrekt / genau formatiert haben, wäre es sehr einfach, eine PDF-Komponente zum Konvertieren zu verwenden ... Zum Beispiel, sagen wir, es gibt 100 Seiten und ein Bild auf Seite 31 Wenn die Seiten 1-30 als PDF und die Seiten 32-100 als PDF enthalten sein könnten, würde Seite 31 in HTML generiert und formatiert (zum Stil des restlichen Buches). Sie können dann eine 1/2 verwenden William Hilsum vor 13 Jahren 0
pdf-Komponente, die die erste PDF-Datei erhält, die HTML-Seite verdeckt, die zweite PDF-Datei abrufen und eine neue PDF-Datei erstellen, die all dies kombiniert. Die generierte Seite kann Skripts aufrufen, Steganographie ausführen (nicht sicher über das Verb!) Oder was Sie sonst noch wollen ... Es gibt viele (kostenlose und kostenpflichtige) PDF-Komponenten - dies ist zum Beispiel eine ... http: // www Ich hoffe, das macht es ein wenig klarer, was ich zu vermitteln versuche - nur sehr schwer zu erklären. 2/2 William Hilsum vor 13 Jahren 0
@Dave Jarvis - äh, 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 / einen Stil aussehen zu lassen. Sie können dann eine PDF-Komponente zum Exportieren / Speichern von ** EXACTLY ** verwenden, wie sie beim Endergebnis aussehen soll. Sie können das von Ihnen benötigte Bild einfach erstellen und den Text erhalten und (nahtlos für den Endbenutzer) als eine einzige PDF-Datei zusammenstellen. Ich erwähne nur web / php / asp.net, da ich denke, dass dies der einfachste Weg ist, um das zu erreichen, was Sie wollen. William Hilsum vor 13 Jahren 0
@Dave Jarvis: Ich nehme an, Sie verwenden pdfTeX nicht? (Oder haben Sie sich mehr Sorgen gemacht, dass * Benutzer * die PDF-> Ps-> PDF-Konvertierung durchführen und dabei die Beispielbilder herabsetzen?). Die PDF- * Konvertierung * führt jedoch normalerweise zu einer Verschlechterung der Bilder, da GhostScript nicht in der Lage ist, JPEG-Bilder in komprimierter Form zu erhalten, und die JPEG-Komprimierung automatisch auf alle in der Eingabe auftretenden Bilder angewendet wird. (Distiller kann anscheinend * angewiesen werden, Bilder im JPEG-Stil in Ruhe zu lassen, aber hat das tatsächlich jemand?) SamB vor 13 Jahren 0