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/qa | |
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/qa')
-rw-r--r-- | vcl/qa/cppunit/pdfexport/data/tdf107089.odt | bin | 0 -> 20171 bytes | |||
-rw-r--r-- | vcl/qa/cppunit/pdfexport/pdfexport.cxx | 38 |
2 files changed, 38 insertions, 0 deletions
diff --git a/vcl/qa/cppunit/pdfexport/data/tdf107089.odt b/vcl/qa/cppunit/pdfexport/data/tdf107089.odt Binary files differnew file mode 100644 index 000000000000..5aaaab944a98 --- /dev/null +++ b/vcl/qa/cppunit/pdfexport/data/tdf107089.odt diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index aacf36b2796b..1b9eaf153d2c 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -54,6 +54,7 @@ public: void testTdf106972Pdf17(); void testTdf107013(); void testTdf107018(); + void testTdf107089(); #endif CPPUNIT_TEST_SUITE(PdfExportTest); @@ -67,6 +68,7 @@ public: CPPUNIT_TEST(testTdf106972Pdf17); CPPUNIT_TEST(testTdf107013); CPPUNIT_TEST(testTdf107018); + CPPUNIT_TEST(testTdf107089); #endif CPPUNIT_TEST_SUITE_END(); }; @@ -452,6 +454,42 @@ void PdfExportTest::testTdf107018() // copying the page stream of a PDF image. CPPUNIT_ASSERT_EQUAL(OString("Pages"), pName->GetValue()); } + +void PdfExportTest::testTdf107089() +{ + vcl::filter::PDFDocument aDocument; + load("tdf107089.odt", aDocument); + + // Get access to the only image on the only page. + std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aPages.size()); + vcl::filter::PDFObjectElement* pResources = aPages[0]->LookupObject("Resources"); + CPPUNIT_ASSERT(pResources); + auto pXObjects = dynamic_cast<vcl::filter::PDFDictionaryElement*>(pResources->Lookup("XObject")); + CPPUNIT_ASSERT(pXObjects); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pXObjects->GetItems().size()); + vcl::filter::PDFObjectElement* pXObject = pXObjects->LookupObject(pXObjects->GetItems().begin()->first); + CPPUNIT_ASSERT(pXObject); + + // Get access to the form object inside the image. + auto pXObjectResources = dynamic_cast<vcl::filter::PDFDictionaryElement*>(pXObject->Lookup("Resources")); + CPPUNIT_ASSERT(pXObjectResources); + auto pXObjectForms = dynamic_cast<vcl::filter::PDFDictionaryElement*>(pXObjectResources->LookupElement("XObject")); + CPPUNIT_ASSERT(pXObjectForms); + vcl::filter::PDFObjectElement* pForm = pXObjectForms->LookupObject(pXObjectForms->GetItems().begin()->first); + CPPUNIT_ASSERT(pForm); + + // Make sure 'Hello' is part of the form object's stream. + vcl::filter::PDFStreamElement* pStream = pForm->GetStream(); + CPPUNIT_ASSERT(pStream); + SvMemoryStream& rObjectStream = pStream->GetMemory(); + OString aHello("Hello"); + auto pStart = static_cast<const char*>(rObjectStream.GetData()); + const char* pEnd = pStart + rObjectStream.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); +} #endif CPPUNIT_TEST_SUITE_REGISTRATION(PdfExportTest); |