diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-03-27 14:21:53 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-03-27 13:31:42 +0000 |
commit | 06d073695c764744d308c74f80c40a317255fc05 (patch) | |
tree | 70f4d2ff3adbc62edffab604242d05c024a53dc4 /vcl | |
parent | 71c56d9e74d579471924ec8ecd506743a57fbe2e (diff) |
vcl PDF export, norefxobj: improve ref handling in dicts
When copying objects referenced from the page stream support references
in any item value, not just for one single item key.
Also move the dictionary entry generator code to
PDFWriterImpl::copyExternalResources(), so other keys can be copied
without code duplication.
Change-Id: I4004e82014cec915c66a8a9d3aed2155fa2452ef
Reviewed-on: https://gerrit.libreoffice.org/35755
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'vcl')
-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); |