"Gesonderte" Signaturen in PDF's und ihre Erstellung in LaTeX mit den Paketen hyperref und catchfile

in #latex7 years ago (edited)

Dass auch PDF's Metadaten enthalten ist nichts Neues und kann über das Betriebssystem bzw. über die Lesesoftware abgefragt werden, so zum Beispiel der Name des Autors oder der Titel des PDF-Dokuments.

Eine Möglichkeit, dieses zu erreichen, ist die Verwendung des Paketes hyperref wie in folgendem Listing:

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{fontenc}
\usepackage{helvet}\renewcommand{\rmdefault}{phv}
\parindent0pt\pagestyle{empty}
\usepackage{hyperref}
\hypersetup{
            pdftitle            = {"geheime" PDF-Signatur},
            pdfdisplaydoctitle  = true,
            pdfauthor           = {anonym},
            pdfsubject          = {Signatur},
            pdfproducer         = {egal},
            pdfcreator          = {auch egal},
            pdfkeywords         = {Text,Test,Code}
           }
\begin{document}
  Ein ganz einfaches PDF-Dokument%
\end{document}

Beim Anschauen des PDF-Dokuments mit einem gewöhnlichen Editor fällt auf, dass sich diese Einträge leicht abgewandelt und z.T. etwas anders angeordnet als direkt auslesbare ASCII-Zeichen unverschlüsselt im PDF befinden (Reihenfolge kann abweichen) :
.../Producer(egal)/Keywords(Text,Test,Code)/Subject(Signatur)/Creator(auch egal)...

Nun nehmen wir im 'hypersetup' pdfinfo dazu.
Damit lassen sich zusätzliche eigene Bezeichnernamen ihren Daten zuordnen.
Mit pdfinfo = {Abteilung=Rechnung} würde man einen Bezeichner namens 'Abteilung' kreieren und ihm 'Rechnung' zuordnen.
Doch auf diese Zuordnung kann man auch verzichten und die "Signatur"-Daten direkt einbetten, z.B.: pdfinfo={=Signatur-Daten}
Die pdfinfo sollte man zu guter Letzt ganz am Ende vom 'hypersetup' ins Listing eingeben, um eine fehlerfreie Einbettung zu erreichen (Komma-Trennung nicht vergessen) :

            ...
            pdfkeywords         = {Text,Test,Code},
            pdfinfo             = {=Ein Beispiel-Code}
           }% Ende von hypersetup

Nach erneuter PDF-Kompilierung und Prüfung mit dem Editor würden wir unmittelbar auf die oben erwähnten Einträge (und direkt vor dem Erstellungsdatum) dieses hier auffinden:
/(Ein Beispiel-Code)

Normalerweise sollte weder das Betriebssystem noch übliche Standard-Software in der Lage sein, diese Information ebenso herauszufiltern wie die anderen Metadaten.

Sollte der Code etwas länger sein (durchaus auch im unteren 2-stelligen kB-Bereich ... doch dann läuft der pdflatex-Compiler bereits auf Hochtouren) und extern eingelesen werden, dann empfiehlt sich das mittels catchfile-Paket und eines Makros, den ich im folgenden Abschlussbeispiel \MetaCode nenne:

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{fontenc}

\usepackage{helvet}\renewcommand{\rmdefault}{phv}

\parindent0pt\pagestyle{empty}

\usepackage{hyperref}
\usepackage{catchfile}

\CatchFileDef{\MetaCode}{MetaCode.txt}{}
% ext. Datei MetaCode.txt wird eingelesen

\hypersetup{
            pdftitle            = {"geheime" PDF-Signatur},
            pdfdisplaydoctitle  = true,
            pdfauthor           = {anonym},
            pdfsubject          = {Signatur},
            pdfproducer         = {egal},
            pdfcreator          = {auch egal},
            pdfkeywords         = {Text,Test,Code},
            pdfinfo             = {=\MetaCode}
           }

\begin{document}
    Ein ganz einfaches PDF-Dokument%
\end{document}

Wichtig:
Bei der Erstellung der Datei MetaCode.txt ist dieses zu beachten:
Die Angabe des richtigen Verzeichnisses im Listing ... oder falls keine Verzeichnisangabe, dann ganz einfach sicherstellen, dass diese Datei sich im selben Verzeichnis wie das LaTeX-Listing befindet. - Das ist am einfachsten.
Die Textdatei sollte nur solche Zeichen enthalten, die für LaTeX unproblematisch sind und nicht als Steuerungszeichen interpretiert werden, also kein \ oder @ , $, {, } usw.
Ebenso keine Zeilenumbrüche, weil diese von LaTeX in Leerzeichen gewandelt werden.
Binäre Daten lassen sich in 6-Bit-Zeichencodes umrechnen, z.B. in den Base64-Zeichensatz ... also Zeichen A..Z, a..z, 0..9 und zwei weitere, z.B. Doppelpunkt, Punkt, Komma o.ä.
Von runden Klammern möchte ich dabei besser abraten, weil sie sowohl beim Einbetten als auch beim Auslesen für ewaige Schwierigkeiten sorgen könnten, da sich die Signatur ja in solchen runden Klammern befindet (pdflatex baut zusätzliche Zeichen ein, falls Anzahl der geöffneten und geschlossenen Klammern ungleich ist bzw. eine geschlossene Klammer kann das Auslesen bei entsprechender Programmierung vorzeitig beenden).
Dieses Programm (ohne Bezeichner für die Signaturdaten) habe ich zwar nur unter MiKTeX getestet, doch müsste es ebenso unter TeXLive funktionieren.
Die Signatur sollte sich ebenso im fertigen PDF modifizieren lassen, solange die Anzahl der verwendeten Bytes sich nicht ändert, und es sollte dabei stabil und lesbar bleiben.

Ich bin zwar kein La/TeX-Experte und vielen mag diese Einfügung von Metadaten bekannt sein, doch hoffe ich, hiermit einen hilfreichen Tipp gegeben zu haben.
Für's Testen und Anwenden wünsche ich viel Spaß und gute Ideen!

Sort:  

Congratulations @cryrac! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

You made your First Vote

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

Congratulations @cryrac! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of comments
Award for the number of comments received

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

Congratulations @cryrac! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

Ergänzend möchte ich noch erwähnen, dass nicht nur die Kompilierung zu PDF (Kompiler: pdflatex), sondern auch zu DVI (Kompiler: latex) und PS (dvi2ps) diese "Signatur" beibehält.
Nur im Falle der Umwandlung von PS zu PDF verschwindet sie.