From 40062dd0b854b6a7b5eef0bdd12489dfac20d646 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Wed, 26 Aug 2026 13:39:25 +0200 Subject: [PATCH] cool#16122 export to pdf produces bad PANTONE element The name element in a PDF file needs escaping if it contains spaces, like the PANTONE element does. Re-use the escaping logic in COSWriter, and while we are here, convert the COSWriter function from 'const char*' to std::string_view. Change-Id: I4f6fdb049e746688c393371e2fea30bbaf6da314 Signed-off-by: Noel Grandin Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/10095 Tested-by: Jenkins CPCI Reviewed-by: Mike Kaganski (cherry picked from commit 765ae13aa2e7a954a1629314726207f551d83ff8) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210955 Tested-by: Jenkins Reviewed-by: Xisco Fauli --- include/vcl/filter/pdfdocument.hxx | 7 +----- vcl/inc/pdf/COSWriter.hxx | 2 +- vcl/qa/cppunit/pdfexport/data/cool16122.odt | Bin 0 -> 38967 bytes vcl/qa/cppunit/pdfexport/pdfexport2.cxx | 25 ++++++++++++++++++++ vcl/source/filter/ipdf/pdfdocument.cxx | 6 +++++ vcl/source/pdf/COSWriter.cxx | 13 +++++----- 6 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 vcl/qa/cppunit/pdfexport/data/cool16122.odt diff --git a/include/vcl/filter/pdfdocument.hxx b/include/vcl/filter/pdfdocument.hxx index e66ffa42b2d1..226e0318711d 100644 --- a/include/vcl/filter/pdfdocument.hxx +++ b/include/vcl/filter/pdfdocument.hxx @@ -223,12 +223,7 @@ public: const OString& GetValue() const; SAL_DLLPRIVATE sal_uInt64 GetLocation() const; sal_uInt64 GetLength() const { return m_aValue.getLength(); } - - void writeString(OStringBuffer& rBuffer) override - { - rBuffer.append("/"); - rBuffer.append(m_aValue); - } + void writeString(OStringBuffer& rBuffer) override; }; /// Dictionary object: a set of key-value pairs. diff --git a/vcl/inc/pdf/COSWriter.hxx b/vcl/inc/pdf/COSWriter.hxx index 5c676da1ac02..41ac519b8b00 100644 --- a/vcl/inc/pdf/COSWriter.hxx +++ b/vcl/inc/pdf/COSWriter.hxx @@ -167,7 +167,7 @@ public: static void appendUnicodeTextString(const OUString& rString, OStringBuffer& rBuffer); static void appendName(std::u16string_view rString, OStringBuffer& rBuffer); - static void appendName(const char* pString, OStringBuffer& rBuffer); + static void appendName(std::string_view aString, OStringBuffer& rBuffer); }; } diff --git a/vcl/qa/cppunit/pdfexport/data/cool16122.odt b/vcl/qa/cppunit/pdfexport/data/cool16122.odt new file mode 100644 index 0000000000000000000000000000000000000000..05070e391afa93789b2e9e5f8ada6e521915f4fc GIT binary patch literal 38967 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 literal 0 HcmV?d00001 diff --git a/vcl/qa/cppunit/pdfexport/pdfexport2.cxx b/vcl/qa/cppunit/pdfexport/pdfexport2.cxx index f4a72d9cbb90..40303a033c0b 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport2.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport2.cxx @@ -7156,6 +7156,31 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest2, testDropCapPaint) CPPUNIT_ASSERT_DOUBLES_EQUAL(114.53, aRect.at(4).getMinX(), /*delta*/ 2.0); } +CPPUNIT_TEST_FIXTURE(PdfExportTest2, cool16122BadPantoneElement) +{ + vcl::filter::PDFDocument aDocument; + loadFromFile(u"cool16122.odt"); + save(TestFilter::PDF_WRITER); + + // Parse the export result. + SvFileStream aStream(maTempFile.GetURL(), StreamMode::READ); + // Previously this would have failed here with "PDFDocument::Tokenize: unexpected 'C' keyword at byte position 280" + CPPUNIT_ASSERT(aDocument.Read(aStream)); + + // But just to be sure, check that the PANTONE element round-trips properly + bool bFound = false; + for (const auto& rDocElement : aDocument.GetElements()) + { + if (auto pObject = dynamic_cast(rDocElement.get())) + if (pObject->GetValue() == "PANTONE 293 C") + { + bFound = true; + break; + } + } + CPPUNIT_ASSERT(bFound); +} + } // end anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/vcl/source/filter/ipdf/pdfdocument.cxx b/vcl/source/filter/ipdf/pdfdocument.cxx index e7b5b95d5ee3..2052ae9bf415 100644 --- a/vcl/source/filter/ipdf/pdfdocument.cxx +++ b/vcl/source/filter/ipdf/pdfdocument.cxx @@ -2918,6 +2918,12 @@ bool PDFNameElement::Read(SvStream& rStream) return false; } +void PDFNameElement::writeString(OStringBuffer& rBuffer) +{ + rBuffer.append("/"); + pdf::COSWriter::appendName(m_aValue, rBuffer); // this does the necessary escaping +} + const OString& PDFNameElement::GetValue() const { return m_aValue; } sal_uInt64 PDFNameElement::GetLocation() const { return m_nLocation; } diff --git a/vcl/source/pdf/COSWriter.cxx b/vcl/source/pdf/COSWriter.cxx index 725322374f5d..270802551eab 100644 --- a/vcl/source/pdf/COSWriter.cxx +++ b/vcl/source/pdf/COSWriter.cxx @@ -170,22 +170,21 @@ void COSWriter::appendName(std::u16string_view rStr, OStringBuffer& rBuffer) } } -void COSWriter::appendName(const char* pStr, OStringBuffer& rBuffer) +void COSWriter::appendName(std::string_view aStr, OStringBuffer& rBuffer) { // FIXME i59651 see above - while (pStr && *pStr) + for (const auto ch : aStr) { - if ((*pStr >= 'A' && *pStr <= 'Z') || (*pStr >= 'a' && *pStr <= 'z') - || (*pStr >= '0' && *pStr <= '9') || *pStr == '-') + if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') + || ch == '-') { - rBuffer.append(*pStr); + rBuffer.append(ch); } else { rBuffer.append('#'); - appendHex(static_cast(*pStr), rBuffer); + appendHex(static_cast(ch), rBuffer); } - pStr++; } }