[Libreoffice-commits] core.git: vcl/source

Miklos Vajna vmiklos at collabora.co.uk
Tue Mar 28 12:49:45 UTC 2017


 vcl/source/filter/ipdf/pdfdocument.cxx |    8 ++++++--
 vcl/source/gdi/pdfwriter_impl.cxx      |    4 ++++
 2 files changed, 10 insertions(+), 2 deletions(-)

New commits:
commit 3ea5e3401e567bfe956817fd5abd17530da664f5
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Mar 28 12:10:03 2017 +0200

    tdf#106693 vcl PDF export, norefxobj: copy nested arrays correctly
    
    When copying an array we're only interested in the start/end position of
    the outermost array, otherwise only part of the array is copied.
    
    Change-Id: I9f5cb5e3ed395142fd82db34e1153ddfdf9f0eb3
    Reviewed-on: https://gerrit.libreoffice.org/35797
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/vcl/source/filter/ipdf/pdfdocument.cxx b/vcl/source/filter/ipdf/pdfdocument.cxx
index 1a85c4f3fd5e..1c132353e0a6 100644
--- a/vcl/source/filter/ipdf/pdfdocument.cxx
+++ b/vcl/source/filter/ipdf/pdfdocument.cxx
@@ -876,6 +876,8 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
     bool bInStartXRef = false;
     // Dictionary depth, so we know when we're outside any dictionaries.
     int nDictionaryDepth = 0;
+    // Array depth, only the offset/length of the toplevel array is tracked.
+    int nArrayDepth = 0;
     // Last seen array token that's outside any dictionaries.
     PDFArrayElement* pArray = nullptr;
     while (true)
@@ -939,7 +941,7 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
         {
             auto pArr = new PDFArrayElement();
             rElements.push_back(std::unique_ptr<PDFElement>(pArr));
-            if (nDictionaryDepth == 0)
+            if (nDictionaryDepth == 0 && nArrayDepth == 0)
             {
                 // The array is attached directly, inform the object.
                 pArray = pArr;
@@ -949,6 +951,7 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
                     pObject->SetArrayOffset(rStream.Tell());
                 }
             }
+            ++nArrayDepth;
             rStream.SeekRel(-1);
             if (!rElements.back()->Read(rStream))
             {
@@ -962,7 +965,8 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
             rElements.push_back(std::unique_ptr<PDFElement>(new PDFEndArrayElement()));
             pArray = nullptr;
             rStream.SeekRel(-1);
-            if (nDictionaryDepth == 0)
+            --nArrayDepth;
+            if (nDictionaryDepth == 0 && nArrayDepth == 0)
             {
                 if (pObject)
                 {
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 7d435e404837..000e2875d95b 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -11067,6 +11067,8 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
             return;
         }
 
+        OString sColorSpaces = copyExternalResources(*pPage, "ColorSpace");
+        OString sExtGStates = copyExternalResources(*pPage, "ExtGState");
         OString sFonts = copyExternalResources(*pPage, "Font");
         OString sXObjects = copyExternalResources(*pPage, "XObject");
 
@@ -11089,6 +11091,8 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
         aLine.append("<< /Type /XObject");
         aLine.append(" /Subtype /Form");
         aLine.append(" /Resources <<");
+        aLine.append(sColorSpaces);
+        aLine.append(sExtGStates);
         aLine.append(sFonts);
         aLine.append(sXObjects);
         aLine.append(">>");


More information about the Libreoffice-commits mailing list