diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-04-11 17:39:10 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-04-11 20:34:50 +0200 |
commit | 54a4121f2040bd11f3d6056767f2d7ad6c7745ac (patch) | |
tree | 66d5d8ce38438d7fcd8cad5ec154de8792118844 /vcl | |
parent | aa4e06c67dbe414ae26b757d6968eb27b5ebeb99 (diff) |
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>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/qa/cppunit/pdfexport/pdfexport.cxx | 12 | ||||
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.cxx | 17 |
2 files changed, 17 insertions, 12 deletions
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index 76cad0f2a9af..36b5134bdaf3 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 4c7542de2bfa..23706483e3f3 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; |