From 3eb3484cc019fea215b2bb2a313423c4c2b3b416 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 16 Mar 2025 17:24:00 +0530 Subject: [PATCH] Fix #2103084 [Private bug](https://bugs.launchpad.net/calibre/+bug/2103084) --- src/calibre/utils/podofo/__init__.py | 2 ++ src/calibre/utils/podofo/doc.cpp | 21 ++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/calibre/utils/podofo/__init__.py b/src/calibre/utils/podofo/__init__.py index 6387ee8035..5fdda27616 100644 --- a/src/calibre/utils/podofo/__init__.py +++ b/src/calibre/utils/podofo/__init__.py @@ -242,6 +242,8 @@ def test_podofo(): try: p = podofo.PDFDoc() p.open(f.name) + print(1111111111111111111) + print(22222222, repr(p.title)) if (p.title, p.author, p.keywords) != ('info title', 'info author', 'a, b'): raise ValueError('podofo failed to set title and author in Info dict {} != {}'.format( (p.title, p.author, p.keywords), ('info title', 'info author', 'a, b'))) diff --git a/src/calibre/utils/podofo/doc.cpp b/src/calibre/utils/podofo/doc.cpp index 648a90c1bb..047f319e57 100644 --- a/src/calibre/utils/podofo/doc.cpp +++ b/src/calibre/utils/podofo/doc.cpp @@ -731,19 +731,21 @@ PDFDoc_version_getter(PDFDoc *self, void *closure) { return PyUnicode_FromString(""); } -static PdfDictionary& -get_or_create_info(PDFDoc *self) { +static void +get_or_create_info(PDFDoc *self, PdfDictionary **dict) { PdfObject *info = self->doc->GetTrailer().GetDictionary().FindKey("Info"); - if (info && info->IsDictionary()) return info->GetDictionary(); + if (info && info->TryGetDictionary(*dict)) return; info = &self->doc->GetObjects().CreateDictionaryObject(); self->doc->GetTrailer().GetDictionary().AddKeyIndirect("Info", *info); - return info->GetDictionary(); + info->TryGetDictionary(*dict); } + static inline PyObject* string_metadata_getter(PDFDoc *self, const std::string_view name) { - auto info = get_or_create_info(self); - auto obj = info.FindKey(name); + PdfDictionary *info_dict; + get_or_create_info(self, &info_dict); + auto obj = info_dict->FindKey(name); const PdfString* str; return (obj == nullptr || !obj->TryGetString(str)) ? PyUnicode_FromString("") : podofo_convert_pdfstring(*str); } @@ -782,11 +784,12 @@ PDFDoc_producer_getter(PDFDoc *self, void *closure) { static inline int string_metadata_setter(PDFDoc *self, const std::string_view name, PyObject *val) { if (!PyUnicode_Check(val)) { PyErr_SetString(PyExc_TypeError, "Must use unicode to set metadata"); return -1; } - auto& info = get_or_create_info(self); + PdfDictionary *info_dict; + get_or_create_info(self, &info_dict); const char *raw; Py_ssize_t sz; raw = PyUnicode_AsUTF8AndSize(val, &sz); - if (sz == 0) info.RemoveKey(name); - else info.AddKey(name, PdfString(std::string_view(raw, sz))); + if (sz == 0) info_dict->RemoveKey(name); + else info_dict->AddKey(name, PdfString(std::string_view(raw, sz))); return 0; }