diff -Naur inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-parser.cpp inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-parser.cpp --- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-parser.cpp 2026-04-09 19:24:14.404864903 +0200 +++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-parser.cpp 2026-04-09 19:26:28.305975206 +0200 @@ -2252,15 +2252,11 @@ * This adds a string from a PDF file that is contained in one command ('Tj', ''', '"') * or is one string in ShowSpacetext ('TJ'). */ -#if POPPLER_CHECK_VERSION(0,64,0) -void PdfParser::doShowText(const GooString *s) { -#else -void PdfParser::doShowText(GooString *s) { -#endif +void PdfParser::doShowText(const std::string &s) { auto font = state->getFont(); GfxFont::WritingMode wMode = font->getWMode(); // Vertical/Horizontal/Invalid - builder->beginString(state, get_goostring_length(*s)); + builder->beginString(state, s.size()); // handle a Type 3 char if (font->getType() == fontType3) { @@ -2270,8 +2266,8 @@ double riseX, riseY; state->textTransformDelta(0, state->getRise(), &riseX, &riseY); - auto p = s->getCString(); // char* or const char* - int len = get_goostring_length(*s); + auto p = s.c_str(); // char* or const char* + int len = s.size(); while (len > 0) { @@ -2328,6 +2324,14 @@ builder->endString(state); } +#if POPPLER_CHECK_VERSION(0,64,0) +void PdfParser::doShowText(const GooString *s) { +#else +void PdfParser::doShowText(GooString *s) { +#endif + const std::string str = s->toStr(); + doShowText(str); +} //------------------------------------------------------------------------ // XObject operators diff -Naur inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-parser.h inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-parser.h --- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/pdf-parser.h 2026-04-09 19:24:14.404575113 +0200 +++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/pdf-parser.h 2026-04-09 19:27:06.118975172 +0200 @@ -283,10 +283,11 @@ void opMoveShowText(Object args[], int numArgs); void opMoveSetShowText(Object args[], int numArgs); void opShowSpaceText(Object args[], int numArgs); + void doShowText(const std::string &s); #if POPPLER_CHECK_VERSION(0,64,0) - void doShowText(const GooString *s); + void doShowText(const GooString *s); #else - void doShowText(GooString *s); + void doShowText(GooString *s); #endif diff -Naur inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-transition-api.h inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-transition-api.h --- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-transition-api.h 2026-04-09 19:24:14.404686983 +0200 +++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-transition-api.h 2026-04-09 19:34:19.667974783 +0200 @@ -62,11 +62,11 @@ #endif #if POPPLER_CHECK_VERSION(24, 5, 0) -#define _POPPLER_HAS_UNICODE_BOM(value) (hasUnicodeByteOrderMark(value->toStr())) -#define _POPPLER_HAS_UNICODE_BOMLE(value) (hasUnicodeByteOrderMarkLE(value->toStr())) +#define _POPPLER_HAS_UNICODE_BOM(value) (hasUnicodeByteOrderMark(value)) +#define _POPPLER_HAS_UNICODE_BOMLE(value) (hasUnicodeByteOrderMarkLE(value)) #else -#define _POPPLER_HAS_UNICODE_BOM(value) (value->hasUnicodeMarker()) -#define _POPPLER_HAS_UNICODE_BOMLE(value) (value->hasUnicodeMarkerLE()) +#define _POPPLER_HAS_UNICODE_BOM(value) (GooString(value).hasUnicodeMarker()) +#define _POPPLER_HAS_UNICODE_BOMLE(value) (GooString(value).hasUnicodeMarkerLE()) #endif #if POPPLER_CHECK_VERSION(24, 3, 0) diff -Naur inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-utils.cpp inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-utils.cpp --- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-utils.cpp 2026-04-09 19:24:14.404905293 +0200 +++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-utils.cpp 2026-04-09 19:33:54.570974805 +0200 @@ -149,7 +149,6 @@ void InkFontDict::hashFontObject1(const Object *obj, FNVHash *h) { - const GooString *s; const char *p; double r; int n, i; @@ -169,11 +168,16 @@ r = obj->getReal(); h->hash((char *)&r, sizeof(double)); break; - case objString: + case objString: { h->hash('s'); - s = obj->getString(); - h->hash(s->c_str(), get_goostring_length(*s)); - break; +#if POPPLER_CHECK_VERSION(26, 4, 0) + const auto &s = obj->getString(); + h->hash(s.c_str(), s.size()); +#else + const GooString* s = obj->getString(); + h->hash(s->c_str(), get_goostring_length(*s)); +#endif + } break; case objName: h->hash('n'); p = obj->getName(); @@ -587,23 +591,45 @@ if (!obj.isString()) { return ""; } + std::cout << obj.getString() << std::endl; return getString(obj.getString()); } +std::string getString(const std::unique_ptr &value) +{ + return getString(value.get()); +} + +std::string getString(const GooString *value) +{ + if (value) { + return getString(value->toStr()); + } + return ""; +} + /** * Convert PDF strings, which can be formatted as UTF8, UTF16BE or UTF16LE into * a predictable UTF8 string consistant with svg requirements. */ -std::string getString(const GooString *value) +std::string getString(const std::string &value) { + char *str = nullptr; + if (_POPPLER_HAS_UNICODE_BOM(value)) { - return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2, - "UTF-8", "UTF-16BE", NULL, NULL, NULL); + str = g_convert(value.c_str() + 2, value.size() - 2, + "UTF-8", "UTF-16BE", NULL, NULL, NULL); } else if (_POPPLER_HAS_UNICODE_BOMLE(value)) { - return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2, - "UTF-8", "UTF-16LE", NULL, NULL, NULL); + str = g_convert(value.c_str() + 2, value.size() - 2, + "UTF-8", "UTF-16LE", NULL, NULL, NULL); + } + if (str) { + std::string copy = str; + g_free(str); + return copy; } - return value->toStr(); + g_warning("Couldn't parse text in PDF from UTF16."); + return value; } void pdf_debug_array(const Array *array, int depth, XRef *xref) @@ -660,7 +686,11 @@ } else if (obj->isArray()) { pdf_debug_array(obj->getArray(), depth, xref); } else if (obj->isString()) { +#if POPPLER_CHECK_VERSION(26, 4, 0) + std::cout << " STR '" << obj->getString().c_str() << "'"; +#else std::cout << " STR '" << obj->getString()->getCString() << "'"; +#endif } else if (obj->isName()) { std::cout << " NAME '" << obj->getName() << "'"; } else if (obj->isBool()) { diff -Naur inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-utils.h inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-utils.h --- inkscape-1.4.3_2025-12-25_0d15f75042.orig/src/extension/internal/pdfinput/poppler-utils.h 2026-04-09 19:24:14.404675233 +0200 +++ inkscape-1.4.3_2025-12-25_0d15f75042/src/extension/internal/pdfinput/poppler-utils.h 2026-04-09 19:34:19.673974783 +0200 @@ -83,6 +83,8 @@ FontList getPdfFonts(std::shared_ptr pdf_doc); std::string getNameWithoutSubsetTag(std::string name); std::string getDictString(Dict *dict, const char *key); +std::string getString(const std::string &value); +std::string getString(const std::unique_ptr &value); std::string getString(const GooString *value); std::string validateString(std::string const &in);