fitz (pymupdf) pdf metadaten neu schreiben wirft Fehler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ran
User
Beiträge: 10
Registriert: Mittwoch 23. April 2025, 14:48

Hi, in meinem kleinen pdf-such-und-find-Projektchen stoße ich gerade auf ein Metadaten-Schreib-Problem

Code: Alles auswählen

def speichern():
            try:
                doc = fitz.open(pfad)
                new_meta = {
                    "/Title": entries["title"].get(),
                    "/Author": entries["author"].get(),
                    "/Subject": entries["subject"].get(),
                    "/Keywords": entries["keywords"].get(),
                    "/Creator": entries["creator"].get() or "PDF Finder",
                    "/Producer": entries["producer"].get() or "PDF Finder v1.0"
                }
                print(new_meta)
                doc.dataset_meta(new_meta)
                doc.save(pfad, incremental=True, encryption=fitz.PDF_ENCRYPT_KEEP)
                doc.close()
                messagebox.showinfo("Erfolg", "Metadaten erfolgreich gespeichert.")
                editor.destroy()
            except Exception as e:
                messagebox.showerror("Fehler", f"Speichern nicht möglich:\n{e}")
Ich habe das nicht in einer Schleife laufen, weil ich gelesen habe, dass fitz bei manchen Daten-Feldern sehr pingelig ist und ich sicher stellen wollte, dass die auch richtig befüllt sind. Ich habe Auslesen und Einschreib-Daten mal schreiben lassen

{'format': 'PDF 1.7', 'title': '', 'author': '', 'subject': '', 'keywords': '', 'creator': '', 'producer': 'PDFlib+PDI 9.0.3 (Ruby/Linux-x86_64)', 'creationDate': "D:20250207010220+01'00'", 'modDate': '', 'trapped': '', 'encryption': None}

{'/Title': 'a', '/Author': 'b', '/Subject': 'c', '/Keywords': 'd', '/Creator': 'PDF Finder', '/Producer': 'PDFlib+PDI 9.0.3 (Ruby/Linux-x86_64)'}

irgendwas mache ich wohl falsch, aber was? Kann mir vielleicht jemand weiterhelfen?
Sirius3
User
Beiträge: 18215
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Einrückungen sind nicht einheitlich, eingerückt wird immer mit 4 Leerzeichen pro Ebene. Die Variablen `pfad`, `entities` und `editor` kommen aus dem Nichts, das sollten Argumente der Funktion sein.
Da Du nicht beschreibst, was Deine Erwartungen sind, und wie das Ergebnis davon abweicht, läßt sich schwer sagen, was Du falsch machst.
Es hilft auf jeden Fall, erst einmal die Dokumentation zu lesen: https://pymupdf.readthedocs.io/en/lates ... f-metadata
Da ist jedenfalls die Rede davon, dass es zwei Arten von Zugriff auf Metadaten gibt, eine vereinfachte Form und die erweiterte Art, da Du die vereinfachte Form verwendest, sind auch die entsprechenden Schlüssel zu verwenden.
ran
User
Beiträge: 10
Registriert: Mittwoch 23. April 2025, 14:48

Danke für den Hinweis. Das Script ist richtig eingerückt, durch das Setzen hier in die code-tags wurde es verzerrt, ich bin mit dieser Form der Eingabe noch nicht vertraut. Die Variablen kommen aus dem Editor-Teil des Programms, ich will einfach editierte Metadaten zu meinem pdf zurück schreiben. und es wird der Schreib-Fehler geworfen, es wird also nichts in das File geschrieben.
Sirius3
User
Beiträge: 18215
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du einen Fehler bekommst,dann poste den kompletten Traceback hier.
geraldfo
User
Beiträge: 72
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien
Kontaktdaten:

fitz – was ist das? Muss man das wissen?
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

Sirius3 hat geschrieben: Mittwoch 30. April 2025, 05:10 Wenn Du einen Fehler bekommst,dann poste den kompletten Traceback hier.
Und dazu das 'try:' und 'except Exception as e:' aus der Funktion 'speichern' entfernen. Dann wird auch irgendwo die komplette Fehlermeldung angezeigt. So fehlen jedenfalls die wesentlichen Informationen, die man bei der Fehlersuche benötigt...
ran
User
Beiträge: 10
Registriert: Mittwoch 23. April 2025, 14:48

Gelöst. Danke für alle, die sich für mich den Kopf zerbrochen haben. 2 Fehler waren drin. Frühere Versionen von fitz wollten die Übergabe mit / und Großbuchstabe am Anfang (z.B. /Keywords) jetzt nicht mehr nur noch flat keywords. Und dann ein peinlicher Hirnverdreher im Ojekt-Aufruf doc.set_metadata(new_meta)

Code: Alles auswählen

doc = fitz.open(pfad)
                new_meta = {
                    "title": entries["title"].get(),
                    "author": entries["author"].get(),
                    "subject": entries["subject"].get(),
                    "keywords": entries["keywords"].get(),
                    "creator": entries["creator"].get() or "PDF Finder",
                    "producer": entries["producer"].get() or "PDF Finder v1.0"
                }
                doc.set_metadata(new_meta)
                doc.save(pfad, incremental=True, encryption=fitz.PDF_ENCRYPT_KEEP)
                doc.close()
                messagebox.showinfo("Erfolg", "Metadaten erfolgreich gespeichert.")
                editor.destroy()
Jetzt sind meine Kopfschmerztabletten alle - aber es funktioniert.
ran
User
Beiträge: 10
Registriert: Mittwoch 23. April 2025, 14:48

Ach ja, noch die schuldige Antwort: fitz ist das Mitbringsel von https://pypi.org/project/PyMuPDF/
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Dokumentation hat dazu eine Notiz zum Namen *fitz*:
Old versions of PyMuPDF had their Python import name as fitz. Newer versions use pymupdf instead, and offer fitz as a fallback so that old code will still work.
Sollte man aber nicht mehr benutzen, insbesondere weil das im Zusammenhang mit einem anderen, gleichnamigen Python-Package Probleme machen kann.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
geraldfo
User
Beiträge: 72
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien
Kontaktdaten:

@ran
@__blackjack__
Dankeschön!
Antworten