Metadatum "Creation Date" aus einem PDF mappen

  • Hi,

    ich versuche vergeblich, im Bereich Main_Module_Management ..../contenttask den Eintrag PDF so anzupassen, dass auch das im PDF vorhandene Attribut "Creation Date" gemappt wird.

    Nach Prüfung Quellcode mit archaischem studentischem Programmier Know-How scheint es, dass das zugehörige Script agorum.roi.ejb.common.ContentTaskPDFExtractor so etwas nicht vorsieht. Leider enthält die Dokumentation zwar für Bilddateien ausgezeichnete Hinweise, für PDFŝ jedoch nicht.

    Falls meine Vermutung richtig ist, gibt es Ihrerseits einen Lösungsvorschlag?

    Besten Dank im voraus

  • Hallo Volker,

    besten Dank für die Hinweise, denen ich teilweise auch schon nachgegangen war.

    Das Original-Erstellungsdatum eines PDF erscheint mir als ein für ein DMS doch recht wichtiges Attribut, das beim Import automatisch integriert werden sollte. Daher landete ich bei dem bereits vorhandenen PDF-Contenttask, Zudem ist ja bei den ContentTasks der Bilddateien diese Funktionalität vorhanden. Wenn es dort richtig angesiedelt ist, wieso nicht auch bei einem PDF?

    @ Entwicklerteam

    Wenn die Common/pdf erlaubt, diese Attribute auszulesen, müsste doch auch eine Funktionalitätserweiterung des PDF-Contenttasks möglich sein?


    Die Funktion pdf.readmetadata der common/pdf habe ich dank der Doku auch schon entdeckt. Allerdings ist mir unklar, wie aus dem zurückgelieferten XML-JavaScript-Format ein bestimmter Knoten elegant auszulesen ist. Mittels common/xml stringify bin ich zu einem String gekommen, der dann durchsucht werden könnte. Scheint mir aber etwas unprofessionell.


    Gibt es irgendwo eine Anleitung, wie ein bestimmter Knoten des XML-JavaScript-Format ausgelesen werden kann?


    Besten Dank vorab.


    P.S.

    Ein Teil der PDF meines Archivs wurde mit Acrobat erstellt, ein Teil mit exiftool nachbearbeitet. Ich habe festgestellt, dass exiftool den Aufbau des XMP-Teils des PDF wohl modifiziert, Daher ist das XML-JavaScript-Format strukturell zwar deckungsgleich, aber nicht einheutlich.

  • Hallo dmsrostra,

    Zitat

    Mittels common/xml stringify bin ich zu einem String gekommen, der dann durchsucht werden könnte. Scheint mir aber etwas unprofessionell.

    Ja, das klingt wirklich etwas umständlich.

    Dein "XML-JavaScript-Format" hört übrigens auch auf den Namen JSON und ist wirklich cooler als XML. Einer der größten Vorteile an JSON ist, dass sofort alle (Unter-)Eigentschaften als JS-Objekt verfügbar sind und sehr einfach abgefragt werden können.


    Probier das mal aus (Zeile 5 musste anpassen):

    Das Ergebnis ist ein String und sieht z.B. so aus:

    >> 2023-09-20T14:25:14+01:00


    Mit dem Ergebnis kannst du weiterarbeiten. Evtl. möchtest du in deine Zeitzone übersetzen und am liebsten auch ein für deutschsprachige Augen ansehnlicheres Datum? Easy:

    Code
    let niceDate = new Date(createDate).toLocaleString('de-DE');
    console.log(niceDate);

    >> 20. September 2023 15:25:14 MESZ

  • Hallo Bruce,

    herzlichen Dank nicht nur für die kompetente Lösung, sondern auch für den besonderen Aufwand der erläuternden Anmerkungen. :thumbup: :thumbup:


    Nur der Vollständigkeit halber:

    Da die Funktion readMetadata eine Objekt-ID verlangt, war noch eine kleine Anpassung notwendig.


    Dank Deiner Hilfe ist das Thema nun erledigt.

  • Hallo nochmal,


    ist ja super gelaufen. Ich hab mich eigentlich nur deshalb in diesen Thread eingeklinkt, weil ich die PDF-Library selbst auch noch nie verwendet habe und plötzlich wissen wollte, was sie kann. Jetzt haben wir beide was davon - Party. :)

    Zitat

    Nur der Vollständigkeit halber:

    Da die Funktion readMetadata eine Objekt-ID verlangt, war noch eine kleine Anpassung notwendig.

    Jein. Erstmal hast du natürlich Recht, das Beispiel funktioniert nur, wenn du ebenfalls die Datei im angegebenen Ort liegen hast (also Zeile 5, das ist ziemlich unwahrscheinlich). Aber: Du hast bei div. Funktionen in agorum die Wahl, ob ID, UUID, oder Pfad grade die beste Variante für dich ist. Pfade machen meiner Erfahrung eigentlich nur dann Sinn, wenn der Code möglichst leserlich sein soll, weil man so direkt sieht, um was es konkret geht (z. B. .../Test.pdf - wie cool, ein PDF zum Rumspielen). Prinizipiell möglich wären jedoch (mind.) all diese Varianten und Pfad ist die langsamste:

    Code
    let myPDF = '/agorum/roi/Files/bla/Test.pdf'            // Pfad
    let myPDF = '123456';                                   // Objekt ID
    let myPDF = '85699c60-aea5-11eb-b0ed-00155d999a03';     // Objekt UUID
    
    let pdfMeta = pdf.readMetadata(myPDF);

    In Schleifen nehme ich hingegen immer IDs, denn hier ist auch am ehesten Geschwindigkeit gefragt:

    Code
    let pdf = require('common/pdf');
    let objects = require('common/objects');
    
    // Loop over all the PDFs in the house (might be many thousands)
    objects.query('nameextension_ci:pdf').iterate('id', row => {
      let pdfMeta = pdf.readMetadata(row.id);
    
      // Do crazy things with pdfMeta ...
    });
  • Hallo Bruce,

    hatte beim ersten Versuch mit dem angepassten PDF-Pfad einen Fehler und habe deshalb auf ID umgestellt. War aber wohl ein Typo beim Pfad.

    Lt. Doku sind alle 3 von Dir genannten Varianten korrekt.


    Ich werde dank Deines Scripts eine Funktion GetAttributesFromPDF(_idarray, _attributesarray) erstellen und exportieren.

    Ist _idarray == Null, wird

    Code
    query('nameextension_ci:pdf')

    über alle PDF iteriert und für jede ID die im _attributesarray angegebenen Atrributnamen gelesen.


    Bei Angabe eines _idarray wird dies nur für die angegebenen IDs gemacht (So kann man vorher eine PDF-Teilmenge filtern und damit die Funktion aufrufen)


    Rückgabewert der Funktion ist dann eine Struktur mit allen angegebenen Attributswerten für jede ID.


    Die zurückgegebenen Attribute können dann als Metadatum dem PDF-Objekt per common/metadata save hinzugefügt werden.


    Nochmals ausserordentlichen Dank für Deine UNterstützung.

Jetzt Teil von agorum Community werden!

Noch kein Benutzerkonto? Registriere dich kostenlos und werde Teil von agorum Community!