diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-04-11 12:42:23 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-04-11 13:48:32 +0200 |
commit | 9e8598c42a1a6f2fbd88711aa9bea5961eaf7b4a (patch) | |
tree | 29a9edcb1be51273871573829c5677f42bb4b96f /vcl/source/gdi/pdfwriter_impl.cxx | |
parent | 24d935164f553bb4daa9be591c9cb392a86f06cd (diff) |
tdf#107089 PDF export of PDF images: handle mixed filters of page streams
It's allowed to compress different page streams differently, and we must
have a single object stream for our form XObject, so just incompress all
of them to be consistent.
Change-Id: I7a20dc2084a902a37dcefa3420d59a576f120bcd
Reviewed-on: https://gerrit.libreoffice.org/36409
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'vcl/source/gdi/pdfwriter_impl.cxx')
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.cxx | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 218ee883bdc5..f05c94e78e32 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -11178,7 +11178,8 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit) "ColorSpace", "ExtGState", "Font", - "XObject" + "XObject", + "Shading" }; for (const auto& rKey : aKeys) aLine.append(copyExternalResources(*pPage, rKey, aCopiedResources)); @@ -11189,14 +11190,6 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit) aLine.append(aSize.Height()); aLine.append(" ]"); - // For now assume that all the content streams have the same filter. - auto pFilter = dynamic_cast<filter::PDFNameElement*>(aContentStreams[0]->Lookup("Filter")); - if (pFilter) - { - aLine.append(" /Filter /"); - aLine.append(pFilter->GetValue()); - } - aLine.append(" /Length "); sal_Int32 nLength = 0; @@ -11212,8 +11205,31 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit) SvMemoryStream& rPageStream = pPageStream->GetMemory(); - nLength += rPageStream.GetSize(); - aStream.append(static_cast<const sal_Char*>(rPageStream.GetData()), rPageStream.GetSize()); + auto pFilter = dynamic_cast<filter::PDFNameElement*>(pContent->Lookup("Filter")); + if (pFilter) + { + if (pFilter->GetValue() != "FlateDecode") + continue; + + SvMemoryStream aMemoryStream; + ZCodec aZCodec; + rPageStream.Seek(0); + aZCodec.BeginCompression(); + aZCodec.Decompress(rPageStream, aMemoryStream); + if (!aZCodec.EndCompression()) + { + SAL_WARN("vcl.pdfwriter", "PDFWriterImpl::writeReferenceXObject: decompression failed"); + continue; + } + + nLength += aMemoryStream.GetSize(); + aStream.append(static_cast<const sal_Char*>(aMemoryStream.GetData()), aMemoryStream.GetSize()); + } + else + { + nLength += rPageStream.GetSize(); + aStream.append(static_cast<const sal_Char*>(rPageStream.GetData()), rPageStream.GetSize()); + } } aLine.append(nLength); |