Veränderung und Löschen von Metadaten in PDF-Dokumenten

Motivation

Das PDF-Format erlaubt es, dass neben den eigentlichen Dokumentdaten beschreibende Daten über das Dokument, sogenannte Metadaten, transportiert werden. Diese Metadaten werden meist stiefmütterlich betrachtet, doch es lohnt sich auch diesen die Aufmerksamkeit zu widmen. Meist werden die Metadaten während der Erzeugung des PDF-Dokument automatisiert erstellt und beinhalten dadurch z.B. Informationen über den Ersteller. Ist dies aus datenschutzrechtlichen Gründen nicht gewünscht, müssen diese Metadaten nachträglich verändert bzw. gelöscht werden.

In der PDF-Spezifikation (ISO 32000) werden Metadaten in Kapitel 14.3 behandelt. Diese können in zwei Formen angeben werden: Als Schlüssel-Wert-Paar im sogenannten "document information dictionary" oder als "metadata stream". Der zweite Weg wurde in PDF 1.4 eingeführt und ist heutzutage der bevorzugte Weg, um Metadaten zu transportieren. Bei widersprüchlichen Angaben erhalten diese von den marktüblichen PDF-Viewern den Vorrang.

Dieser Knowledge Base-Artikel zeigt, wie Metadaten eines vorhandenen Dokuments mit Hilfe von jadice server 5 verändert werden können. Ausgangspunkt hierfür ist der PDFMetadataNode, der seit Version 5.2.1.0 Bestandteil von jadice server ist.

Löschen von Metadaten

Das Löschen der Metadaten kann auf einfache Weise erreicht werden. Es genügt, dass alle setter-Methoden des PDFMetadataNode mit null-Werten belegt werden:

Löschen von PDF-Metadaten
final PDFMetadataNode pdfMetadata = new PDFMetadataNode();
pdfMetadata.setAuthor(null);
pdfMetadata.setCreator(null);
pdfMetadata.setCreationDate(null);
pdfMetadata.setKeywords(null);
pdfMetadata.setModificationDate(null);
pdfMetadata.setProducer(null);
pdfMetadata.setSubject(null);
pdfMetadata.setTitle(null);
pdfMetadata.setXmpMetaData(null);

Nach der Verarbeitung des PDF-Dokuments werden weder im jadice viewer noch im Adobe Reader Informationen über dieses Dokument angezeigt:

Gelöschte Metadaten, Ansicht der Dokumentinformation im jadice viewerGelöschte Metadaten, Ansicht der Dokumenteigenschaften im Adobe Reader

Setzen eigener XMP-Metadaten

Im Gegensatz zu den Feldern des "document information dictionary", die mehr oder minder aus einfachen Datentypen bestehen, werden die XMP-Metadaten in XML repräsentiert. Diese werden jadice server als Instanz von Document übergeben. Um sich die Mühe zu sparen, die vordefinierten Schemata und deren Namespaces korrekt wiederzugeben, greifen wir in diesem Beispiel auf Apache JempBox als Teil der Apache PDFBox zurück.

Hiermit können alle relevanten Metadaten ohne den Overhead der XML-Erzeugung angeben werden:

Erstellen von XMP-Metadaten
final XMPMetadata xmlMeta = new XMPMetadata();
final XMPSchemaPDF pdfScheme = xmlMeta.addPDFSchema();
pdfScheme.setProducer("ACME PDF Producer");
pdfScheme.setKeywords("XMP, demo, jadice server");
final XMPSchemaBasic basicScheme = xmlMeta.addBasicSchema();
final Calendar createDate = Calendar.getInstance();
createDate.set(2015, 0, 1, 12, 0, 0); // 1st of January 2015, 12:00
basicScheme.setCreateDate(createDate);

final Calendar modifyDate = Calendar.getInstance();
modifyDate.set(2015, 1, 28, 12, 0, 0); // 28th of February 2015, 12:00
basicScheme.setModifyDate(modifyDate);

final XMPSchemaDublinCore dc = xmlMeta.addDublinCoreSchema();
dc.setTitle("XMP demonstration document");
dc.setDescription("This document is the result of the PDFMetadataNode of jadice server");
dc.addCreator("John Doe");

// Provide metadata as DOM document
final Document dom = xmlMeta.getXMPDocument();

final PDFMetadataNode pdfMetadata = new PDFMetadataNode();
pdfMetadata.setXmpMetaData(dom);

Nach der Verarbeitung des PDF-Dokuments durch jadice server werden sowohl im jadice viewer als auch im Adobe Reader die neu gesetzten Metadaten angezeigt:

Geänderte XMP-Metadaten, Ansicht der Dokumentinformation im jadice viewerGeänderte XMP-Metadaten, Ansicht der Dokumenteigenschaften im Adobe Reader

Zusammenfassung

Dieser Artikel zeigt, wie mit wenigen Zeilen Code die Metadaten eines PDF-Dokumentes an eigene Wünsche angepasst oder ggf. gelöscht werden können.

Den vollständigen Beispiel-Code finden Sie in Github unter https://gist.github.com/geissebn/c43f156e197a75a8da81