[Libreoffice-commits] core.git: sc/qa sc/source

László Németh (via logerrit) logerrit at kemper.freedesktop.org
Wed Sep 18 10:23:53 UTC 2019


 sc/qa/extras/scpdfexport.cxx   |  114 +++++++++++++++++++++++++++++++++++------
 sc/source/ui/view/printfun.cxx |   18 ++++++
 2 files changed, 117 insertions(+), 15 deletions(-)

New commits:
commit 26c83053b8fb4421bf48452fb5a7801b16f6bca0
Author:     László Németh <nemeth at numbertext.org>
AuthorDate: Tue Sep 17 13:53:58 2019 +0200
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Wed Sep 18 12:22:47 2019 +0200

    tdf#103516 Calc: fit columns to page similarly to Excel
    
    With the page setting "Fit print range(s) to width/height",
    "Width in pages" > 0, and no "Height in pages" selected,
    apply slightly smaller zoom (~98% of the selected zoom),
    when this adjustment results printing fewer pages,
    ie. no more pages printed, than MSO.
    
    Note: a very annoying problem was that Calc printed almost
    blank extra pages (containing only one or a few table rows)
    from documents that Excel printed "correctly".
    
    Change-Id: I527f7084d22fc2ef60780492fbe24791d6ab30ca
    Reviewed-on: https://gerrit.libreoffice.org/79063
    Tested-by: Jenkins
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/sc/qa/extras/scpdfexport.cxx b/sc/qa/extras/scpdfexport.cxx
index 2bc2ed76f3ba..4e471e48d0cb 100644
--- a/sc/qa/extras/scpdfexport.cxx
+++ b/sc/qa/extras/scpdfexport.cxx
@@ -42,11 +42,11 @@ public:
 
     // helpers
 private:
-    std::shared_ptr<utl::TempFile> exportToPdf(uno::Reference<frame::XModel>& xModel,
+    std::shared_ptr<utl::TempFile> exportToPDF(uno::Reference<frame::XModel>& xModel,
                                                const ScRange& range);
 
-    static bool hasFontInPdf(const std::shared_ptr<utl::TempFile>& pXPathFile,
-                             const char* sFontName, bool& bFound);
+    static bool hasTextInPdf(const std::shared_ptr<utl::TempFile>& pPDFFile, const char* sText,
+                             bool& bFound);
 
     void setFont(ScFieldEditEngine& rEE, sal_Int32 nStart, sal_Int32 nEnd,
                  const OUString& rFontName);
@@ -54,9 +54,11 @@ private:
     // unit tests
 public:
     void testExportRange_Tdf120161();
+    void testExportFitToPage_Tdf103516();
 
     CPPUNIT_TEST_SUITE(ScPDFExportTest);
     CPPUNIT_TEST(testExportRange_Tdf120161);
+    CPPUNIT_TEST(testExportFitToPage_Tdf103516);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -109,10 +111,10 @@ void ScPDFExportTest::tearDown()
     test::BootstrapFixture::tearDown();
 }
 
-bool ScPDFExportTest::hasFontInPdf(const std::shared_ptr<utl::TempFile>& pXPathFile,
-                                   const char* sFontName, bool& bFound)
+bool ScPDFExportTest::hasTextInPdf(const std::shared_ptr<utl::TempFile>& pPDFFile,
+                                   const char* sText, bool& bFound)
 {
-    SvStream* pStream = pXPathFile->GetStream(StreamMode::STD_READ);
+    SvStream* pStream = pPDFFile->GetStream(StreamMode::STD_READ);
     CPPUNIT_ASSERT(pStream);
 
     // get file size
@@ -128,7 +130,7 @@ bool ScPDFExportTest::hasFontInPdf(const std::shared_ptr<utl::TempFile>& pXPathF
     if (nRead == nFileSize)
     {
         const std::string haystack(pBuffer, pBuffer + nFileSize);
-        const std::string needle(sFontName);
+        const std::string needle(sText);
         const std::size_t n = haystack.find(needle);
         bFound = (n != std::string::npos);
     }
@@ -136,11 +138,11 @@ bool ScPDFExportTest::hasFontInPdf(const std::shared_ptr<utl::TempFile>& pXPathF
 
     // close and return the status
     pStream = nullptr;
-    pXPathFile->CloseStream();
+    pPDFFile->CloseStream();
     return (nRead == nFileSize);
 }
 
-std::shared_ptr<utl::TempFile> ScPDFExportTest::exportToPdf(uno::Reference<frame::XModel>& xModel,
+std::shared_ptr<utl::TempFile> ScPDFExportTest::exportToPDF(uno::Reference<frame::XModel>& xModel,
                                                             const ScRange& range)
 {
     // create temp file name
@@ -249,27 +251,109 @@ void ScPDFExportTest::testExportRange_Tdf120161()
     // A1:G1
     {
         ScRange range1(0, 0, 0, 6, 0, 0);
-        std::shared_ptr<utl::TempFile> pXPathFile = exportToPdf(xModel, range1);
+        std::shared_ptr<utl::TempFile> pPDFFile = exportToPDF(xModel, range1);
         bool bFound = false;
-        CPPUNIT_ASSERT(hasFontInPdf(pXPathFile, "DejaVuSans", bFound));
+        CPPUNIT_ASSERT(hasTextInPdf(pPDFFile, "DejaVuSans", bFound));
         CPPUNIT_ASSERT_EQUAL(false, bFound);
     }
 
     // G1:H1
     {
         ScRange range1(6, 0, 0, 7, 0, 0);
-        std::shared_ptr<utl::TempFile> pXPathFile = exportToPdf(xModel, range1);
+        std::shared_ptr<utl::TempFile> pPDFFile = exportToPDF(xModel, range1);
         bool bFound = false;
-        CPPUNIT_ASSERT(hasFontInPdf(pXPathFile, "DejaVuSans", bFound));
+        CPPUNIT_ASSERT(hasTextInPdf(pPDFFile, "DejaVuSans", bFound));
         CPPUNIT_ASSERT_EQUAL(true, bFound);
     }
 
     // H1:I1
     {
         ScRange range1(7, 0, 0, 8, 0, 0);
-        std::shared_ptr<utl::TempFile> pXPathFile = exportToPdf(xModel, range1);
+        std::shared_ptr<utl::TempFile> pPDFFile = exportToPDF(xModel, range1);
         bool bFound = false;
-        CPPUNIT_ASSERT(hasFontInPdf(pXPathFile, "DejaVuSans", bFound));
+        CPPUNIT_ASSERT(hasTextInPdf(pPDFFile, "DejaVuSans", bFound));
+        CPPUNIT_ASSERT_EQUAL(true, bFound);
+    }
+}
+
+void ScPDFExportTest::testExportFitToPage_Tdf103516()
+{
+    // create test document
+    uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+    uno::Reference<sheet::XSpreadsheetDocument> xDoc(xModel, uno::UNO_QUERY_THROW);
+    uno::Reference<sheet::XSpreadsheets> xSheets(xDoc->getSheets(), UNO_SET_THROW);
+    uno::Reference<container::XIndexAccess> xIndex(xSheets, uno::UNO_QUERY_THROW);
+    xSheets->insertNewByName("First Sheet", 0);
+    uno::Reference<sheet::XSpreadsheet> rSheet(xIndex->getByIndex(0), UNO_QUERY_THROW);
+
+    // 2. Setup data
+    {
+        SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent);
+        CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell);
+        ScDocShellRef xDocSh = dynamic_cast<ScDocShell*>(pFoundShell);
+        CPPUNIT_ASSERT(xDocSh.get() != nullptr);
+
+        // put some content into the table
+        ScDocument& rDoc = xDocSh->GetDocument();
+        for (unsigned int r = 0; r < 80; ++r)
+            for (unsigned int c = 0; c < 12; ++c)
+                rDoc.SetValue(ScAddress(c, r, 0), (r + 1) * (c + 1));
+    }
+
+    // A1:G50: 2-page export
+    {
+        ScRange range1(0, 0, 0, 6, 49, 0);
+        std::shared_ptr<utl::TempFile> pPDFFile = exportToPDF(xModel, range1);
+        bool bFound = false;
+        CPPUNIT_ASSERT(hasTextInPdf(pPDFFile, "/Count 2>>", bFound));
+        CPPUNIT_ASSERT_EQUAL(true, bFound);
+    }
+
+    // A1:L80: 4-page export
+    {
+        ScRange range1(0, 0, 0, 11, 79, 0);
+        std::shared_ptr<utl::TempFile> pPDFFile = exportToPDF(xModel, range1);
+        bool bFound = false;
+        CPPUNIT_ASSERT(hasTextInPdf(pPDFFile, "/Count 4>>", bFound));
+        CPPUNIT_ASSERT_EQUAL(true, bFound);
+    }
+
+    // set fit to page: width=1 page, height=0 (automatic)
+    uno::Reference<style::XStyleFamiliesSupplier> xStyleFamSupp(xDoc, UNO_QUERY_THROW);
+    uno::Reference<container::XNameAccess> xStyleFamiliesNames(xStyleFamSupp->getStyleFamilies(),
+                                                               UNO_SET_THROW);
+    uno::Reference<container::XNameAccess> xPageStyles(xStyleFamiliesNames->getByName("PageStyles"),
+                                                       UNO_QUERY_THROW);
+    uno::Any aDefaultStyle = xPageStyles->getByName("Default");
+    uno::Reference<beans::XPropertySet> xProp(aDefaultStyle, UNO_QUERY_THROW);
+
+    uno::Any aScaleX, aScaleY;
+    sal_Int16 nScale;
+    aScaleX <<= static_cast<sal_Int16>(1);
+    xProp->setPropertyValue("ScaleToPagesX", aScaleX);
+    aScaleX = xProp->getPropertyValue("ScaleToPagesX");
+    aScaleX >>= nScale;
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nScale);
+
+    aScaleY = xProp->getPropertyValue("ScaleToPagesY");
+    aScaleY >>= nScale;
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nScale);
+
+    // A1:G50 with fit to page width=1: slightly smaller zoom results only 1-page export
+    {
+        ScRange range1(0, 0, 0, 6, 49, 0);
+        std::shared_ptr<utl::TempFile> pPDFFile = exportToPDF(xModel, range1);
+        bool bFound = false;
+        CPPUNIT_ASSERT(hasTextInPdf(pPDFFile, "/Count 1>>", bFound));
+        CPPUNIT_ASSERT_EQUAL(true, bFound);
+    }
+
+    // A1:L80 with fit to page width=1: slightly smaller zoom results only 1-page export
+    {
+        ScRange range1(0, 0, 0, 11, 79, 0);
+        std::shared_ptr<utl::TempFile> pPDFFile = exportToPDF(xModel, range1);
+        bool bFound = false;
+        CPPUNIT_ASSERT(hasTextInPdf(pPDFFile, "/Count 1>>", bFound));
         CPPUNIT_ASSERT_EQUAL(true, bFound);
     }
 }
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index 71f29e3f6778..352012b093fa 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -2898,6 +2898,24 @@ void ScPrintFunc::CalcZoom( sal_uInt16 nRangeNo )                       // calcu
                 nZoom = (nLastFitZoom + nZoom) / 2;
             }
         }
+        // tdf#103516 remove the almost blank page(s) for better
+        // interoperability by using slightly smaller zoom
+        if (nW > 0 && nH == 0 && m_aRanges.m_nPagesY > 1)
+        {
+            sal_uInt32 nLastPagesY = m_aRanges.m_nPagesY;
+            nLastFitZoom = nZoom;
+            nZoom *= 0.98;
+            if (nZoom < nLastFitZoom)
+            {
+                CalcPages();
+                // same page count with smaller zoom: use the original zoom
+                if (m_aRanges.m_nPagesY == nLastPagesY)
+                {
+                    nZoom = nLastFitZoom;
+                    CalcPages();
+                }
+            }
+        }
     }
     else if (aTableParam.bScaleAll)
     {


More information about the Libreoffice-commits mailing list