summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-04-11 17:39:10 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-04-12 10:46:18 +0200
commiteae84fb805f8ba1bce72a64e78b8ef6f8eb22439 (patch)
treeaf329086df1dc1e39f7571069c15e10f5119dc7f
parent198c3a5929e183ed710c8838844148bd0c1a533a (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> (cherry picked from commit 54a4121f2040bd11f3d6056767f2d7ad6c7745ac)
-rw-r--r--vcl/qa/cppunit/pdfexport/pdfexport.cxx12
-rw-r--r--vcl/source/gdi/pdfwriter_impl.cxx17
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 2c94de56c183..a6ced4d62952 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -12003,10 +12003,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();
@@ -12035,21 +12036,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;