From 57f46a5a64f4e3bca2f0a52309ca7d201c1e2372 Mon Sep 17 00:00:00 2001 From: Hossein Date: Wed, 26 Apr 2023 13:38:20 +0200 Subject: [PATCH] tdf#152246 Test position of RTL elements in PDF This test checks the position of RTL/LTR elements in the exported PDF files. Without the fix in place, the test fails because the RTL elements will position as LTR, and the "Rect" element will be something else: double equality assertion failed - Expected: 303.349 - Actual : 56.699 - Delta : 1e-06 The Sample DOCX file contains both RTL and LTR content controls for testing. One may run the test with: make CPPUNIT_TEST_NAME=testTdf152246 -sr CppunitTest_vcl_pdfexport For an overview on PDF fill-in forms, please refer to: James C. King, Introduction to the Insides of PDF, pages 81-85 https://www.adobe.com/technology/pdfs/presentations/KingPDFTutorial.pdf Change-Id: I6c15b49bffb1aef6f137f7bb518a291f4d88b888 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151228 Tested-by: Jenkins Reviewed-by: Hossein --- .../pdfexport/data/content-control-rtl.docx | Bin 0 -> 5178 bytes vcl/qa/cppunit/pdfexport/pdfexport.cxx | 53 ++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 vcl/qa/cppunit/pdfexport/data/content-control-rtl.docx diff --git a/vcl/qa/cppunit/pdfexport/data/content-control-rtl.docx b/vcl/qa/cppunit/pdfexport/data/content-control-rtl.docx new file mode 100644 index 0000000000000000000000000000000000000000..1b5fba455517d17402ad31ab4145b094a7aa5b6f GIT binary patch literal 5178 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 aPages = aDocument.GetPages(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), aPages.size()); + + // Position array + constexpr double aPos[5][4] = { { 56.699, 707.701, 131.401, 721.499 }, + { 198.499, 707.701, 273.201, 721.499 }, + { 303.349, 680.101, 378.051, 693.899 }, + { 480.599, 680.101, 555.301, 693.899 }, + { 56.699, 652.501, 131.401, 666.299 } }; + + // Get page annotations. + auto pAnnots = dynamic_cast(aPages[0]->Lookup("Annots")); + CPPUNIT_ASSERT(pAnnots); + CPPUNIT_ASSERT_EQUAL(static_cast(5), pAnnots->GetElements().size()); + for (sal_Int32 i = 0; i < 5; ++i) + { + auto pAnnotReference + = dynamic_cast(pAnnots->GetElements()[i]); + CPPUNIT_ASSERT(pAnnotReference); + vcl::filter::PDFObjectElement* pAnnot = pAnnotReference->LookupObject(); + CPPUNIT_ASSERT(pAnnot); + CPPUNIT_ASSERT_EQUAL( + OString("Annot"), + static_cast(pAnnot->Lookup("Type"))->GetValue()); + CPPUNIT_ASSERT_EQUAL( + OString("Widget"), + static_cast(pAnnot->Lookup("Subtype"))->GetValue()); + + auto pRect = dynamic_cast(pAnnot->Lookup("Rect")); + CPPUNIT_ASSERT(pRect); + const auto& rElements = pRect->GetElements(); + CPPUNIT_ASSERT_EQUAL(static_cast(4), rElements.size()); + for (sal_Int32 nIdx = 0; nIdx < 4; ++nIdx) + { + const auto* pNumElement = dynamic_cast(rElements[nIdx]); + CPPUNIT_ASSERT(pNumElement); + CPPUNIT_ASSERT_DOUBLES_EQUAL(aPos[i][nIdx], pNumElement->GetValue(), 1e-6); + } + } +} + } // end anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT();