vcl/qa/cppunit/pdfexport/data/form-font-name.odt |binary vcl/qa/cppunit/pdfexport/pdfexport.cxx | 46 +++++++++++++++++++++++ vcl/source/gdi/pdfwriter_impl.cxx | 13 +++++- 3 files changed, 56 insertions(+), 3 deletions(-)
New commits: commit 2a4dc0791e9c185926c9b5588d2d0d88d1d85442 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Mon Jul 20 11:36:13 2020 +0200 Commit: Gabor Kelemen <kelemen.gab...@nisz.hu> CommitDate: Wed Jan 6 10:49:00 2021 +0100 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 <vmik...@collabora.com> Tested-by: Jenkins (cherry picked from commit 6294ecd7b4da38de98b24ddfb9f201cef98c1f41) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108853 Tested-by: Gabor Kelemen <kelemen.gab...@nisz.hu> Reviewed-by: Gabor Kelemen <kelemen.gab...@nisz.hu> 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 Binary files /dev/null and b/vcl/qa/cppunit/pdfexport/data/form-font-name.odt differ diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index fe402b4ed8b8..33683ee75a7a 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -151,6 +151,7 @@ public: void testVersion15(); void testDefaultVersion(); void testMultiPagePDF(); + void testFormFontName(); CPPUNIT_TEST_SUITE(PdfExportTest); @@ -196,6 +197,7 @@ public: CPPUNIT_TEST(testVersion15); CPPUNIT_TEST(testDefaultVersion); CPPUNIT_TEST(testMultiPagePDF); + CPPUNIT_TEST(testFormFontName); CPPUNIT_TEST_SUITE_END(); }; @@ -2286,6 +2288,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); } diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 7e02762d6e36..811d2413f044 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -3502,6 +3502,13 @@ Font PDFWriterImpl::replaceFont( const vcl::Font& rControlFont, const vcl::Font& sal_Int32 PDFWriterImpl::getBestBuildinFont( const vcl::Font& rFont ) { sal_Int32 nBest = 4; // default to Helvetica + + if (rFont.GetFamilyType() == FAMILY_ROMAN) + { + // Serif: default to Times-Roman. + nBest = 8; + } + OUString aFontName( rFont.GetFamilyName() ); aFontName = aFontName.toAsciiLowerCase(); @@ -3648,14 +3655,14 @@ void PDFWriterImpl::createDefaultEditAppearance( PDFWidget& rEdit, const PDFWrit // prepare font to use, draw field border Font aFont = drawFieldBorder( rEdit, rWidget, rSettings ); - sal_Int32 nBest = getSystemFont( aFont ); + // Get the built-in font which is closest to aFont. + sal_Int32 nBest = getBestBuildinFont(aFont); // prepare DA string OStringBuffer aDA( 32 ); appendNonStrokingColor( replaceColor( rWidget.TextColor, rSettings.GetFieldTextColor() ), aDA ); aDA.append( ' ' ); - aDA.append( "/F" ); - aDA.append( nBest ); + aDA.append(pdf::BuildinFontFace::Get(nBest).getNameObject()); OStringBuffer aDR( 32 ); aDR.append( "/Font " ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits