summaryrefslogtreecommitdiff
path: root/vcl/qa
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-07-20 11:36:13 +0200
committerMiklos Vajna <vmiklos@collabora.com>2020-07-20 12:54:39 +0200
commit6294ecd7b4da38de98b24ddfb9f201cef98c1f41 (patch)
treeffbe32058c1886a0741ad7b0feb6a77769a4cb7e /vcl/qa
parent1db7decf3fb172542f5fce03ce7bf0cb310d1ffc (diff)
tdf#50879 PDF export: ensure only built-in fonts are used for forms
Alternative would be to embed the whole font, which is unusual: PDF typically just embeds the used subset. Change-Id: Ic0b7e121b3ae38804c1a396ea36104ebcc0b9588 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99032 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'vcl/qa')
-rw-r--r--vcl/qa/cppunit/pdfexport/data/form-font-name.odtbin0 -> 8548 bytes
-rw-r--r--vcl/qa/cppunit/pdfexport/pdfexport.cxx46
2 files changed, 46 insertions, 0 deletions
diff --git a/vcl/qa/cppunit/pdfexport/data/form-font-name.odt b/vcl/qa/cppunit/pdfexport/data/form-font-name.odt
new file mode 100644
index 000000000000..a7430c9a8a6e
--- /dev/null
+++ b/vcl/qa/cppunit/pdfexport/data/form-font-name.odt
Binary files differ
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
index dc6c01fcf719..607d89f8b630 100644
--- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx
+++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
@@ -130,6 +130,7 @@ public:
void testVersion15();
void testDefaultVersion();
void testMultiPagePDF();
+ void testFormFontName();
CPPUNIT_TEST_SUITE(PdfExportTest);
@@ -175,6 +176,7 @@ public:
CPPUNIT_TEST(testVersion15);
CPPUNIT_TEST(testDefaultVersion);
CPPUNIT_TEST(testMultiPagePDF);
+ CPPUNIT_TEST(testFormFontName);
CPPUNIT_TEST_SUITE_END();
};
@@ -2264,6 +2266,50 @@ void PdfExportTest::testMultiPagePDF()
#endif
}
+void PdfExportTest::testFormFontName()
+{
+ // Import the bugdoc and export as PDF.
+ OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "form-font-name.odt";
+ mxComponent = loadFromDesktop(aURL);
+
+ uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export");
+ xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+
+ // Parse the export result with pdfium.
+ SvFileStream aFile(maTempFile.GetURL(), StreamMode::READ);
+ SvMemoryStream aMemory;
+ aMemory.WriteStream(aFile);
+ ScopedFPDFDocument pPdfDocument(
+ FPDF_LoadMemDocument(aMemory.GetData(), aMemory.GetSize(), /*password=*/nullptr));
+ CPPUNIT_ASSERT(pPdfDocument);
+
+ // The document has one page.
+ CPPUNIT_ASSERT_EQUAL(1, FPDF_GetPageCount(pPdfDocument.get()));
+ ScopedFPDFPage pPdfPage(FPDF_LoadPage(pPdfDocument.get(), /*page_index=*/0));
+ CPPUNIT_ASSERT(pPdfPage);
+
+ // The page has one annotation.
+ CPPUNIT_ASSERT_EQUAL(1, FPDFPage_GetAnnotCount(pPdfPage.get()));
+ ScopedFPDFAnnotation pAnnot(FPDFPage_GetAnnot(pPdfPage.get(), 0));
+
+ // Examine the default appearance.
+ CPPUNIT_ASSERT(FPDFAnnot_HasKey(pAnnot.get(), "DA"));
+ CPPUNIT_ASSERT_EQUAL(FPDF_OBJECT_STRING, FPDFAnnot_GetValueType(pAnnot.get(), "DA"));
+ size_t nDALength = FPDFAnnot_GetStringValue(pAnnot.get(), "DA", nullptr, 0);
+ std::vector<FPDF_WCHAR> aDABuf(nDALength);
+ FPDFAnnot_GetStringValue(pAnnot.get(), "DA", aDABuf.data(), nDALength);
+ OUString aDA(reinterpret_cast<sal_Unicode*>(aDABuf.data()));
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 0 0 0 rg /TiRo 12 Tf
+ // - Actual : 0 0 0 rg /F2 12 Tf
+ // i.e. Liberation Serif was exposed as a form font as-is, without picking the closest built-in
+ // font.
+ CPPUNIT_ASSERT_EQUAL(OUString("0 0 0 rg /TiRo 12 Tf"), aDA);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(PdfExportTest);
}