[Libreoffice-commits] core.git: Branch 'distro/nisz/libreoffice-7-0' - vcl/qa vcl/source
Miklos Vajna (via logerrit)
logerrit at kemper.freedesktop.org
Wed Jan 6 09:49:34 UTC 2021
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 <vmiklos at collabora.com>
AuthorDate: Mon Jul 20 11:36:13 2020 +0200
Commit: Gabor Kelemen <kelemen.gabor2 at 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 <vmiklos at collabora.com>
Tested-by: Jenkins
(cherry picked from commit 6294ecd7b4da38de98b24ddfb9f201cef98c1f41)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108853
Tested-by: Gabor Kelemen <kelemen.gabor2 at nisz.hu>
Reviewed-by: Gabor Kelemen <kelemen.gabor2 at 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 " );
More information about the Libreoffice-commits
mailing list