summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/pdfwriter_impl.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-04-11 12:42:23 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-04-11 13:48:32 +0200
commit9e8598c42a1a6f2fbd88711aa9bea5961eaf7b4a (patch)
tree29a9edcb1be51273871573829c5677f42bb4b96f /vcl/source/gdi/pdfwriter_impl.cxx
parent24d935164f553bb4daa9be591c9cb392a86f06cd (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.cxx38
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);