diff options
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.cxx | 35 | ||||
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.hxx | 4 |
2 files changed, 20 insertions, 19 deletions
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 6d6e7eec9993..eb9d00cac010 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -10866,11 +10866,9 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter // Complex case: can't copy the dictionary byte array as is, as it contains a reference. bool bDone = false; const std::map<OString, filter::PDFElement*>& rItems = rObject.GetDictionaryItems(); - OString aReferenceName("ColorSpace"); - auto it = rItems.find(aReferenceName); - if (it != rItems.end()) + for (const auto& rItem : rItems) { - auto pReference = dynamic_cast<filter::PDFReferenceElement*>(it->second); + auto pReference = dynamic_cast<filter::PDFReferenceElement*>(rItem.second); if (pReference) { filter::PDFObjectElement* pReferenced = pReference->LookupObject(); @@ -10880,8 +10878,8 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter sal_Int32 nRef = copyExternalResource(rDocBuffer, *pReferenced); sal_uInt64 nDictStart = rObject.GetDictionaryOffset(); - sal_uInt64 nReferenceStart = pDictionary->GetKeyOffset(aReferenceName) + aReferenceName.getLength(); - sal_uInt64 nReferenceEnd = pDictionary->GetKeyOffset(aReferenceName) + pDictionary->GetKeyValueLength(aReferenceName); + sal_uInt64 nReferenceStart = pDictionary->GetKeyOffset(rItem.first) + rItem.first.getLength(); + sal_uInt64 nReferenceEnd = pDictionary->GetKeyOffset(rItem.first) + pDictionary->GetKeyValueLength(rItem.first); sal_uInt64 nDictEnd = nDictStart + rObject.GetDictionaryLength(); // Dict start -> reference start. aLine.append(static_cast<const sal_Char*>(rDocBuffer.GetData()) + nDictStart, nReferenceStart - nDictStart); @@ -10893,6 +10891,7 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter aLine.append(static_cast<const sal_Char*>(rDocBuffer.GetData()) + nReferenceEnd, nDictEnd - nReferenceEnd); bDone = true; + break; } } } @@ -10968,7 +10967,7 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter return nObject; } -std::map<OString, sal_Int32> PDFWriterImpl::copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind) +OString PDFWriterImpl::copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind) { // A name - object ID map, IDs as they appear in our output, not the // original ones. @@ -10977,11 +10976,11 @@ std::map<OString, sal_Int32> PDFWriterImpl::copyExternalResources(filter::PDFObj // Get the rKind subset of the resource dictionary. auto pResources = dynamic_cast<filter::PDFDictionaryElement*>(rPage.Lookup("Resources")); if (!pResources) - return aRet; + return OString(); auto pDictionary = dynamic_cast<filter::PDFDictionaryElement*>(pResources->LookupElement(rKind)); if (!pDictionary) - return aRet; + return OString(); SvMemoryStream& rDocBuffer = rPage.GetDocument().GetEditBuffer(); @@ -11002,7 +11001,15 @@ std::map<OString, sal_Int32> PDFWriterImpl::copyExternalResources(filter::PDFObj aRet[rItem.first] = nObject; } - return aRet; + // Build the dictionary entry string. + OString sRet = "/" + rKind + "<<"; + for (const auto& rPair : aRet) + { + sRet += "/" + rPair.first + " " + OString::number(rPair.second) + " 0 R"; + } + sRet += ">>"; + + return sRet; } void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit) @@ -11050,13 +11057,7 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit) return; } - std::map<OString, sal_Int32> aXObjects = copyExternalResources(*pPage, "XObject"); - OString sXObjects = "/XObject<<"; - for (const auto& rPair : aXObjects) - { - sXObjects += "/" + rPair.first + " " + OString::number(rPair.second) + " 0 R"; - } - sXObjects += ">>"; + OString sXObjects = copyExternalResources(*pPage, "XObject"); filter::PDFObjectElement* pPageContents = pPage->LookupObject("Contents"); if (!pPageContents) diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx index 47956ce72022..57d125270caf 100644 --- a/vcl/source/gdi/pdfwriter_impl.hxx +++ b/vcl/source/gdi/pdfwriter_impl.hxx @@ -853,8 +853,8 @@ i12626 /// Writes the form XObject proxy for the image. void writeReferenceXObject(ReferenceXObjectEmit& rEmit); /// Copies resources of a given kind from an external page to the output, - /// returning what has beeen copied (name) and where (object ID). - std::map<OString, sal_Int32> copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind); + /// returning what has to be included in the new resource dictionary. + OString copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind); /// Copies a single resource from an external document, returns the new /// object ID in our document. sal_Int32 copyExternalResource(SvMemoryStream& rDocBuffer, filter::PDFObjectElement& rObject); |