PDF export of PDF images: compress page stream if requested

compressStream() automatically takes care of
VCL_DEBUG_DISABLE_PDFCOMPRESSION, so this also simplifies code.

Change-Id: I7661123e6ba73f8f064ec0543a03e2ec15fd2468
Reviewed-on: https://gerrit.libreoffice.org/36415
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
index 76cad0f..36b5134 100644
--- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx
+++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
@@ -481,10 +481,16 @@ void PdfExportTest::testTdf107089()
    // Make sure 'Hello' is part of the form object's stream.
    vcl::filter::PDFStreamElement* pStream = pForm->GetStream();
    CPPUNIT_ASSERT(pStream);
    SvMemoryStream& rObjectStream = pStream->GetMemory();
    SvMemoryStream aObjectStream;
    ZCodec aZCodec;
    aZCodec.BeginCompression();
    pStream->GetMemory().Seek(0);
    aZCodec.Decompress(pStream->GetMemory(), aObjectStream);
    CPPUNIT_ASSERT(aZCodec.EndCompression());
    aObjectStream.Seek(0);
    OString aHello("Hello");
    auto pStart = static_cast<const char*>(rObjectStream.GetData());
    const char* pEnd = pStart + rObjectStream.GetSize();
    auto pStart = static_cast<const char*>(aObjectStream.GetData());
    const char* pEnd = pStart + aObjectStream.GetSize();
    auto it = std::search(pStart, pEnd, aHello.getStr(), aHello.getStr() + aHello.getLength());
    // This failed, 'Hello' was part only a mixed compressed/uncompressed stream, i.e. garbage.
    CPPUNIT_ASSERT(it != pEnd);
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 4c7542d..2370648 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -11164,10 +11164,11 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
        aLine.append(aSize.Height());
        aLine.append(" ]");

        if (!g_bDebugDisableCompression)
            aLine.append(" /Filter/FlateDecode");
        aLine.append(" /Length ");

        sal_Int32 nLength = 0;
        OStringBuffer aStream;
        SvMemoryStream aStream;
        for (auto pContent : aContentStreams)
        {
            filter::PDFStreamElement* pPageStream = pContent->GetStream();
@@ -11196,21 +11197,19 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
                    continue;
                }

                nLength += aMemoryStream.GetSize();
                aStream.append(static_cast<const sal_Char*>(aMemoryStream.GetData()), aMemoryStream.GetSize());
                aStream.WriteBytes(aMemoryStream.GetData(), aMemoryStream.GetSize());
            }
            else
            {
                nLength += rPageStream.GetSize();
                aStream.append(static_cast<const sal_Char*>(rPageStream.GetData()), rPageStream.GetSize());
            }
                aStream.WriteBytes(rPageStream.GetData(), rPageStream.GetSize());
        }

        compressStream(&aStream);
        sal_Int32 nLength = aStream.Tell();
        aLine.append(nLength);

        aLine.append(">>\nstream\n");
        // Copy the original page streams to the form XObject stream.
        aLine.append(aStream.makeStringAndClear());
        aLine.append(static_cast<const sal_Char*>(aStream.GetData()), aStream.GetSize());
        aLine.append("\nendstream\nendobj\n\n");
        if (!updateObject(nWrappedFormObject))
            return;