vcl/source/gdi/pdfobjectcopier.cxx |   21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

New commits:
commit a56ee7d45d82ce9ce47dab3fd95577a28b6f4db3
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Thu Nov 5 10:46:30 2020 +0100
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Wed Nov 11 22:06:22 2020 +0100

    pdf: use object stream to copy dict or array content
    
    Objects can be stored in a compressed stream inside a PDF stream,
    so we can't assume that we always copy from a document stream, but
    we need to check if we have an object stream available and use
    that for copying.
    
    Change-Id: I877a4d8e169919d26878cb9c98782c637479d77a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105490
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/vcl/source/gdi/pdfobjectcopier.cxx 
b/vcl/source/gdi/pdfobjectcopier.cxx
index a953c864c122..129a4c8bda35 100644
--- a/vcl/source/gdi/pdfobjectcopier.cxx
+++ b/vcl/source/gdi/pdfobjectcopier.cxx
@@ -41,6 +41,12 @@ sal_Int32 
PDFObjectCopier::copyExternalResource(SvMemoryStream& rDocBuffer,
     SAL_INFO("vcl.pdfwriter", "PDFObjectCopier::copyExternalResource: " << 
rObject.GetObjectValue()
                                                                         << " 
-> " << nObject);
 
+    SvMemoryStream* pObjectStream = rObject.GetStreamBuffer();
+    if (!pObjectStream)
+    {
+        pObjectStream = &rDocBuffer;
+    }
+
     OStringBuffer aLine;
     aLine.append(nObject);
     aLine.append(" 0 obj\n");
@@ -71,7 +77,7 @@ sal_Int32 
PDFObjectCopier::copyExternalResource(SvMemoryStream& rDocBuffer,
                     else
                         // Previous reference end -> reference start.
                         nOffset = nCopyStart;
-                    aLine.append(static_cast<const 
char*>(rDocBuffer.GetData()) + nOffset,
+                    aLine.append(static_cast<const 
char*>(pObjectStream->GetData()) + nOffset,
                                  nReferenceStart - nOffset);
                     // Write the updated reference.
                     aLine.append(" ");
@@ -93,11 +99,11 @@ sal_Int32 
PDFObjectCopier::copyExternalResource(SvMemoryStream& rDocBuffer,
             if (nLen < 0)
                 SAL_WARN("vcl.pdfwriter", "copyExternalResource() failed");
             else
-                aLine.append(static_cast<const char*>(rDocBuffer.GetData()) + 
nCopyStart, nLen);
+                aLine.append(static_cast<const 
char*>(pObjectStream->GetData()) + nCopyStart, nLen);
         }
         else
             // Can copy it as-is.
-            aLine.append(static_cast<const char*>(rDocBuffer.GetData())
+            aLine.append(static_cast<const char*>(pObjectStream->GetData())
                              + rObject.GetDictionaryOffset(),
                          rObject.GetDictionaryLength());
 
@@ -141,7 +147,7 @@ sal_Int32 
PDFObjectCopier::copyExternalResource(SvMemoryStream& rDocBuffer,
                     else
                         // Previous reference end -> reference start.
                         nOffset = nCopyStart;
-                    aLine.append(static_cast<const 
char*>(rDocBuffer.GetData()) + nOffset,
+                    aLine.append(static_cast<const 
char*>(pObjectStream->GetData()) + nOffset,
                                  nReferenceStart - nOffset);
 
                     // Write the updated reference.
@@ -164,11 +170,12 @@ sal_Int32 
PDFObjectCopier::copyExternalResource(SvMemoryStream& rDocBuffer,
             if (nLen < 0)
                 SAL_WARN("vcl.pdfwriter", "copyExternalResource() failed");
             else
-                aLine.append(static_cast<const char*>(rDocBuffer.GetData()) + 
nCopyStart, nLen);
+                aLine.append(static_cast<const 
char*>(pObjectStream->GetData()) + nCopyStart, nLen);
         }
         else
             // Can copy it as-is.
-            aLine.append(static_cast<const char*>(rDocBuffer.GetData()) + 
rObject.GetArrayOffset(),
+            aLine.append(static_cast<const char*>(pObjectStream->GetData())
+                             + rObject.GetArrayOffset(),
                          rObject.GetArrayLength());
 
         aLine.append("]\n");
@@ -177,7 +184,7 @@ sal_Int32 
PDFObjectCopier::copyExternalResource(SvMemoryStream& rDocBuffer,
     // If the object has a number element outside a dictionary or array, copy 
that.
     if (filter::PDFNumberElement* pNumber = rObject.GetNumberElement())
     {
-        aLine.append(static_cast<const char*>(rDocBuffer.GetData()) + 
pNumber->GetLocation(),
+        aLine.append(static_cast<const char*>(pObjectStream->GetData()) + 
pNumber->GetLocation(),
                      pNumber->GetLength());
         aLine.append("\n");
     }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to