vcl/qa/cppunit/pdfexport/data/tdf105954.odt |binary vcl/qa/cppunit/pdfexport/pdfexport.cxx | 47 ++++++++++++++++++++++++++++ vcl/source/gdi/pdfextoutdevdata.cxx | 5 ++ 3 files changed, 52 insertions(+)
New commits: commit efd59fd1d7fc9d955a2b924f247709201f2281c5 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed May 16 09:46:36 2018 +0200 tdf#105954 PDF export, ReduceImageResolution: fix re-compressing large images Expensive re-compress is not pointless when the user opts in to reduce resolution. (cherry picked from commit 9fd6b6b1f5b83d923a47252b744358721761d9cf) Conflicts: vcl/qa/cppunit/pdfexport/pdfexport.cxx vcl/source/gdi/pdfextoutdevdata.cxx Change-Id: I1e04c6d4f0d95d41808ef885082239645401b2e2 Reviewed-on: https://gerrit.libreoffice.org/54470 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/qa/cppunit/pdfexport/data/tdf105954.odt b/vcl/qa/cppunit/pdfexport/data/tdf105954.odt new file mode 100644 index 000000000000..ba5c96de68bd Binary files /dev/null and b/vcl/qa/cppunit/pdfexport/data/tdf105954.odt differ diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index c6de4b344503..b2ebb23cf6cd 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -79,6 +79,7 @@ public: /// Text extracting RTL text with ligatures. void testTdf115117_2a(); #endif + void testTdf105954(); #endif void testTdf109143(); @@ -104,6 +105,7 @@ public: CPPUNIT_TEST(testTdf115117_2); CPPUNIT_TEST(testTdf115117_2a); #endif + CPPUNIT_TEST(testTdf105954); #endif CPPUNIT_TEST(testTdf109143); CPPUNIT_TEST_SUITE_END(); @@ -1019,6 +1021,51 @@ void PdfExportTest::testTdf115117_2a() CPPUNIT_ASSERT_EQUAL(aExpectedText, aActualText); } #endif + +void PdfExportTest::testTdf105954() +{ + // Import the bugdoc and export as PDF. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf105954.odt"; + mxComponent = loadFromDesktop(aURL); + CPPUNIT_ASSERT(mxComponent.is()); + + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export"); + uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence( + { { "ReduceImageResolution", uno::Any(true) }, + { "MaxImageResolution", uno::Any(static_cast<sal_Int32>(300)) } })); + aMediaDescriptor["FilterData"] <<= aFilterData; + xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); + + // Parse the export result with pdfium. + SvFileStream aFile(aTempFile.GetURL(), StreamMode::READ); + SvMemoryStream aMemory; + aMemory.WriteStream(aFile); + mpPdfDocument + = FPDF_LoadMemDocument(aMemory.GetData(), aMemory.GetSize(), /*password=*/nullptr); + CPPUNIT_ASSERT(mpPdfDocument); + + // The document has one page. + CPPUNIT_ASSERT_EQUAL(1, FPDF_GetPageCount(mpPdfDocument)); + mpPdfPage = FPDF_LoadPage(mpPdfDocument, /*page_index=*/0); + CPPUNIT_ASSERT(mpPdfPage); + + // There is a single image on the page. + int nPageObjectCount = FPDFPage_CountObjects(mpPdfPage); + CPPUNIT_ASSERT_EQUAL(1, nPageObjectCount); + + // Check width of the image. + FPDF_PAGEOBJECT pPageObject = FPDFPage_GetObject(mpPdfPage, /*index=*/0); + FPDF_IMAGEOBJ_METADATA aMeta; + CPPUNIT_ASSERT(FPDFImageObj_GetImageMetadata(pPageObject, mpPdfPage, &aMeta)); + // This was 2000, i.e. the 'reduce to 300 DPI' request was ignored. + // This is now around 238 (228 on macOS). + CPPUNIT_ASSERT_LESS(static_cast<unsigned int>(250), aMeta.width); +} + #endif CPPUNIT_TEST_SUITE_REGISTRATION(PdfExportTest); diff --git a/vcl/source/gdi/pdfextoutdevdata.cxx b/vcl/source/gdi/pdfextoutdevdata.cxx index 71ef583cda58..3c689c3ccce0 100644 --- a/vcl/source/gdi/pdfextoutdevdata.cxx +++ b/vcl/source/gdi/pdfextoutdevdata.cxx @@ -810,6 +810,11 @@ bool PDFExtOutDevData::HasAdequateCompression( const Graphic &rGraphic, // rOutputRect is the crop rectangle, re-compress cropped image. return false; + if (mbReduceImageResolution) + // Reducing resolution was requested, implies that re-compressing is + // wanted. + return false; + if (rGraphic.GetLink().GetDataSize() == 0) return false; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits