# Metadaten in PDF scheiben/Aktualisieren



## MiMa (11. Okt 2017)

Metadaten in einer PDF-Datei zu schreiben / aktualisieren ist für mich das aktuelle Thema.
Um schnell ein zu steigen habe ich einen kleinen Lernkurs über PDFbox gemacht um einen Überblick zu bekommen.
http://www.w3ii.com/de/pdfbox/pdfbox_document_properties.html
Das war recht einfach und dabei traten keinerlei Probleme auf.
Endlich mal was auf anhieb klappt, so schien es.
Alle Beipsiele funktionierten auf anhieb und konnte es auch schnell in meinem Projekt integrieren. Leider habe ich derzeit das Problem, das meine Metadaten nicht in eine vorhandene PDF-Aktualisieren möchte.
Dabei lade ich die Vorhandene PDF-Datei ein, setzte die Metadaten, speichere alles und schliesse die Datei. In der IDE werden keine Fehler angezeigt und das Programm läuft auch ohne Fehler durch. Nach dem Öffnen der Datei musste ich feststellen, das die Metadaten nicht geschrieben wurden. Um Fehler in meiner Methode zu finden, habe ich das laden der Datei ausgeklammert.
Ein neues PDFDokument ezeugt, eine Seite eingefügt, die Metadaten geschrieben und gespeichert. Oh Wunder, die PDF-Datei wurde erzeugt inklusive neuer Metadaten?

```
// Metadaten hinzufuegen
        try {
            // Laden eines PDF-Dokumentes
            // PDDocument dokument = PDDocument.load(datei);

            PDDocument dokument = new PDDocument();
            PDPage seite = new PDPage();
            dokument.addPage(seite);
          
            // Metadaten Objekt erstellen
            PDDocumentInformation pdfMeta = dokument.getDocumentInformation();

            pdfMeta.setAuthor(verfasser);
            pdfMeta.setTitle(titel);
            pdfMeta.setCreator(ersteller);
            pdfMeta.setSubject(thema);
            // pdfMeta.setCreationDate(datumErst);
            // pdfMeta.setModificationDate(datumAend);
            pdfMeta.setKeywords(stichworte);

            // Speichern des PDF-Dokumentes
            dokument.save(datei);

            // Schließen dess PDF-Dokumentes
            dokument.close();
        }
        catch (IOException fehler) {
            log.info("Die Metadaten konnten nicht geschrieben werden\n" + fehler);
        } // try-catch
```
Weis jemand ob es Probleme mit vorhandenen PDFs gibt und was man dabei beachten sollte?
Bitte jetzt nicht mit iText kommen, das hatte ich mal, funktionierte auch, aber ich möchte es nicht verwenden. PDFbox scheint ein cooles Tool zu sein, was auch ziemlich einfach aussieht aber funktionieren sollte es schon. 

Vielen Dank
M


----------



## Robat (11. Okt 2017)

Kenne mich mit Pdfbox nicht aus was auffällt ist, dass du dir die Metadaten nur holst, nach dem bearbeiten aber nicht setzt.
Es gibt doch bestimmt eine `setDocumentInformation(..)` Methode mit der du dem document die überarbeiteten Metadaten geben kannst, oder?


----------



## MiMa (11. Okt 2017)

Das es im Beispiel nicht enthalten war, habe ich angenommen, das alle Informationen mit .save gespeichert werden. Es funktioniert mit einem neu angelegten PDF-Dokument.
Vor dem Speichern habe ich die Zeile eingefügt

```
dokument.setDocumentInformation(pdfMeta);
```
aber leider werden die Metadaten immer noch nicht gespeichert?


----------



## Robat (11. Okt 2017)

mhm also Google Suche bringt u.a. solche Beiträge.


----------



## MiMa (11. Okt 2017)

Habe jetzt mal ein ganz neues Testprogramm geschrieben und die Problematische Datei geladen, Metadaten update gemacht und geschrieben.
Seltsamerweise hat es funktioniert?
Dann muss es wohl woanders liegen!?!
Die Fehler, die nicht angezeigt werden schlucken die meiste Zeit. 
Ohne Laden des alten PDFs konnten aber alle Metadaten geschrieben werden?


----------



## Robat (11. Okt 2017)

MiMa hat gesagt.:


> Habe jetzt mal ein ganz neues Testprogramm geschrieben und die Problematische Datei geladen





MiMa hat gesagt.:


> Ohne Laden des alten PDFs konnten aber alle Metadaten geschrieben werden?


Irgendwie widersprechen sich die beiden Aussagen.
Funktioniert es denn jetzt?


----------



## MiMa (11. Okt 2017)

Ich weis, es ist wirklich seltsam.
Es sind die gleichen codezeilen.
Bei dem Test funktioniert es und in meinem Programm nicht.
Ich habe die Methode aus meine Programm in eine eigene Java Klasse kopiert.
Nur die Stringinhalte angepasst damit alles vorahnden ist und es geht.
Warum denn nun?

```
public class PDFmetadatenAktualsieren {

    public static void main(String[] args) throws IOException {

        File quellDatei = new File("N:/PDFbox/056546565.pdf");
        File zielDatei = new File("N:/PDFbox/056546565.pdf");
      
        /*
         * Dokumenteigenschaften einer PDF-Datei
         *  File        Diese Eigenschaft enthält den Namen der Datei.
         *  Title       Mit dieser Eigenschaft können Sie den Titel für das Dokument gesetzt.
         *  Author      Mit dieser Eigenschaft können Sie den Namen des Autors für das Dokument gesetzt.
         *  Subject     Mit dieser Eigenschaft können Sie den Betreff des PDF-Dokuments angeben.
         *  Keywords    Mit dieser Eigenschaft können Sie die Liste der Schlüsselwörter, mit denen wir das Dokument suchen.
         *  Created     Mit dieser Eigenschaft können Sie das Datum für das Dokument erstellt eingestellt.
         *  Modified    Mit dieser Eigenschaft können Sie das Datum für das Dokument geändert gesetzt.
         *  Application Mit dieser Eigenschaft können Sie die Anwendung des Dokuments festgelegt.
        */

        // Laden eines PDF-Dokumentes
        PDDocument dokument = PDDocument.load(quellDatei);
      
        // Metadaten definieren
        String titel        = "Dokumenteigenschaften in PDF-Dateien";
        String verfasser    = "Mike";
        String thema        = "PDFbox Dokumenteigenschaften";
        String stichworte   = "PDFbox, Dokumenteigenschaten";
        Calendar datumErst  = new GregorianCalendar();
        datumErst.set(2015, 11, 5);
        Calendar datumAend  = new GregorianCalendar();
        datumAend.set(2017, 10, 11);
        String ersteller    = "PDFbox";
      
        // Metadaten Objekt erstellen
        PDDocumentInformation pdfMeta = dokument.getDocumentInformation();
      
        // Metadaten hinzufuegen
        pdfMeta.setAuthor(verfasser);
        pdfMeta.setTitle(titel);
        pdfMeta.setCreator(ersteller);
        pdfMeta.setSubject(thema);
        pdfMeta.setCreationDate(datumErst);
        pdfMeta.setModificationDate(datumAend);
        pdfMeta.setKeywords(stichworte);
      
        // Speichern des PDF-Dokumentes
        dokument.save(zielDatei);
      
        // Schließen dess PDF-Dokumentes
        dokument.close();
    } // main
} // PDFmetadatenAktualsieren
```


----------



## MiMa (11. Okt 2017)

Die Datei wird ja auch geladen, sonst gäbe es ja eine Fehlermeldung.
Ausserdem wird im Zielverzeichnis auch eine PDF-Datei mit einen anderen Dateinamen erstellt.
Nur stimmen die Metadaten nicht?


----------



## Robat (11. Okt 2017)

So richtig erklären kann ich mir das ehrlich gesagt auch nicht.
Bisher habe ich auch noch nichts mit PDFBox zutun gehabt sondern nur mit iText gearbeitet.


----------



## MiMa (11. Okt 2017)

Meine güte ich habe es nun endlich geschafft. 
Das ist ja wirklich nicht zu fassen was für eine Auskommentierung für einen Ärger, Frust und Stunden kosten kann.
Ich habe zuerst ein Tutorial gemacht und das hat ohne Probleme geklappt. Metadaten wurden erstellt. Dann habe ich das gelernte in mein Programm eingebaut und es klappte ebenfalls.
Dann implemetierte ich auch meine gefundenen und errechneten Variablen und danach ging gar nichts mehr. Keine Fehler in der IDE, keine Fehler bei der Programmausführung.
Der Grund dafür war eine Auskommetierung der Datumsangaben. Das habe ich deshalb gemacht weil ich das Datum als String vorliegen habe und der Datentyp der benötigt wurde war Calendar. Also wollte ich vorübergehend folgende Zeilen auskommentieren.

```
// Metadaten Objekt erstellen
            PDDocumentInformation pdfMeta = dokument.getDocumentInformation();

            pdfMeta.setAuthor(verfasser);
            pdfMeta.setTitle(titel);
            pdfMeta.setCreator(ersteller);
            pdfMeta.setSubject(thema);
//            pdfMeta.setCreationDate(datumErst);
//            pdfMeta.setModificationDate(datumAend);
            pdfMeta.setKeywords(stichworte);

            // Speichern des PDF-Dokumentes
            dokument.save(rechnungObjekt.getDateiZiel());
```
Viele Stunden hat es gedauert und einiges an Nerven, Frustration, Ärger und ausprobieren um diese Erkentnis zu erlangen.
Der grosse Übeltäter ist das .setModificationDate.
Wenn dieser nicht enthalten ist, werden keine Metadaten geschrieben. 
Alles andere kann man auskommentieren und die Metadaten werden dann teilweise aktualisiert. Aber wenn man .setModificationDate auskommentiert, wird gar nichts aktialisiert.
Also lasse ich alles drin und setze das Datum erst mal vorrübergehen manuell ein bis ich eine Methode gefunden habe einen Datum String in Calendar zu konvertieren.

Dabei wolte ich erst den String manipulieren, dann viel mir ein den String in Date um zu rechnen, und dort Jahr, Monat und Tag heraus zu holen, aber das ist deprecated .
Vielleicht doch in Millisekunden umrechnen und dann in Calendar???


----------



## mrBrown (11. Okt 2017)

Wenn du dein Datum als String speicherst, läuft irgendwas falsch 

https://stackoverflow.com/questions...-to-gregoriancalendar?answertab=votes#tab-top


----------



## MiMa (12. Okt 2017)

Das Datum liegt deshalb als String vor, weil es mit einem Regulären Ausdruck aus dem Textinhalt extrahiert und noch nicht verarbeitet wurde. Das mache ich jetzt als nächstes, um dann die Methode metaDatenSpeichern abschließen zu können. 
Ich suche halt den bestmöglichen und einfachsten Weg das zu machen. Es macht ja keinen Sinn ein Datentyp von Date zu konvertieren, wenn ein Calendar benötigt wird.


----------

