From cddb5c5b08e20051a4384a7f2b6beaf5842ad8b6 Mon Sep 17 00:00:00 2001 From: Andrei Solntsev Date: Fri, 5 Jan 2024 22:27:28 +0200 Subject: [PATCH] #251 add debug logs for resolved/unresolved fonts --- flying-saucer-core/pom.xml | 2 +- flying-saucer-examples/pom.xml | 2 +- flying-saucer-fop/pom.xml | 2 +- flying-saucer-log4j/pom.xml | 2 +- flying-saucer-pdf-itext5/pom.xml | 2 +- flying-saucer-pdf-osgi/pom.xml | 2 +- flying-saucer-pdf/pom.xml | 2 +- .../xhtmlrenderer/pdf/FontDescription.java | 5 +++ .../org/xhtmlrenderer/pdf/ITextFSFont.java | 5 +++ .../xhtmlrenderer/pdf/ITextFontResolver.java | 22 ++++++---- .../pdf/ITextFontResolverTest.java | 41 +++++++++++++++++++ flying-saucer-swt-examples/pom.xml | 2 +- flying-saucer-swt/pom.xml | 2 +- pom.xml | 2 +- 14 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 flying-saucer-pdf/src/test/java/org/xhtmlrenderer/pdf/ITextFontResolverTest.java diff --git a/flying-saucer-core/pom.xml b/flying-saucer-core/pom.xml index 0bae9d9fa..f5f8d22b1 100644 --- a/flying-saucer-core/pom.xml +++ b/flying-saucer-core/pom.xml @@ -7,7 +7,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-examples/pom.xml b/flying-saucer-examples/pom.xml index 2ee057ab2..2106ffbd4 100644 --- a/flying-saucer-examples/pom.xml +++ b/flying-saucer-examples/pom.xml @@ -6,7 +6,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-fop/pom.xml b/flying-saucer-fop/pom.xml index 0786fa636..aec123050 100644 --- a/flying-saucer-fop/pom.xml +++ b/flying-saucer-fop/pom.xml @@ -7,7 +7,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-log4j/pom.xml b/flying-saucer-log4j/pom.xml index ef5727971..f16a17ba7 100644 --- a/flying-saucer-log4j/pom.xml +++ b/flying-saucer-log4j/pom.xml @@ -7,7 +7,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-pdf-itext5/pom.xml b/flying-saucer-pdf-itext5/pom.xml index 45feefbf8..44e68c956 100644 --- a/flying-saucer-pdf-itext5/pom.xml +++ b/flying-saucer-pdf-itext5/pom.xml @@ -7,7 +7,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-pdf-osgi/pom.xml b/flying-saucer-pdf-osgi/pom.xml index 85e26efe3..35c08f0b5 100644 --- a/flying-saucer-pdf-osgi/pom.xml +++ b/flying-saucer-pdf-osgi/pom.xml @@ -7,7 +7,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-pdf/pom.xml b/flying-saucer-pdf/pom.xml index d3457a914..5d48dd16c 100644 --- a/flying-saucer-pdf/pom.xml +++ b/flying-saucer-pdf/pom.xml @@ -6,7 +6,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontDescription.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontDescription.java index c60878e04..956bd0883 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontDescription.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/FontDescription.java @@ -111,4 +111,9 @@ public boolean isFromFontFace() { public void setFromFontFace(boolean isFromFontFace) { _isFromFontFace = isFromFontFace; } + + @Override + public String toString() { + return String.format("Font %s:%s", _font.getPostscriptFontName(), _weight); + } } diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFSFont.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFSFont.java index 009e22501..b15d207c0 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFSFont.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFSFont.java @@ -37,4 +37,9 @@ public float getSize2D() { public FontDescription getFontDescription() { return _font; } + + @Override + public String toString() { + return String.format("%s:%s", _font, _size); + } } diff --git a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java index 241350f0c..9e58bfca8 100644 --- a/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java +++ b/flying-saucer-pdf/src/main/java/org/xhtmlrenderer/pdf/ITextFontResolver.java @@ -21,6 +21,8 @@ import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.BaseFont; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xhtmlrenderer.css.constants.CSSName; import org.xhtmlrenderer.css.constants.IdentValue; import org.xhtmlrenderer.css.sheet.FontFaceRule; @@ -37,9 +39,11 @@ import org.xhtmlrenderer.util.XRLog; import org.xhtmlrenderer.util.XRRuntimeException; +import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.nio.file.Paths; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -52,6 +56,8 @@ import static java.util.Objects.requireNonNull; public class ITextFontResolver implements FontResolver { + private static final Logger log = LoggerFactory.getLogger(ITextFontResolver.class); + private final Map _fontFamilies = new HashMap<>(); private final Map _fontCache = new HashMap<>(); @@ -336,8 +342,8 @@ private FontFamily getFontFamily(String fontFamilyName) { return fontFamily; } - private FSFont resolveFont(String[] families, float size, IdentValue weight, IdentValue style) { - if (! (style == IdentValue.NORMAL || style == IdentValue.OBLIQUE + private FSFont resolveFont(@Nullable String[] families, float size, IdentValue weight, IdentValue style) { + if (!(style == IdentValue.NORMAL || style == IdentValue.OBLIQUE || style == IdentValue.ITALIC)) { style = IdentValue.NORMAL; } @@ -345,15 +351,17 @@ private FSFont resolveFont(String[] families, float size, IdentValue weight, Ide for (String family : families) { FSFont font = resolveFont(family, size, weight, style); if (font != null) { + log.debug("Resolved font {}:{}:{} -> {}", family, weight, style, font); return font; } } } + log.debug("Could not resolve font {}:{}:{} - fallback to Serif", Arrays.toString(families), weight, style); return resolveFont("Serif", size, weight, style); } - private String normalizeFontFamily(String fontFamily) { + String normalizeFontFamily(String fontFamily) { String result = fontFamily; // strip off the "s if they are there if (result.startsWith("\"")) { @@ -380,10 +388,11 @@ else if (result.equalsIgnoreCase("monospace")) { private FSFont resolveFont(String fontFamily, float size, IdentValue weight, IdentValue style) { String normalizedFontFamily = normalizeFontFamily(fontFamily); - String cacheKey = getHashName(normalizedFontFamily, weight, style); + String cacheKey = String.format("%s-%s-%s", normalizedFontFamily, weight, style); FontDescription result = _fontCache.get(cacheKey); if (result != null) { + log.debug("Resolved font {}:{}:{} -> {}", fontFamily, weight, style, result); return new ITextFSFont(result, size); } @@ -432,11 +441,6 @@ public static int convertWeightToInt(IdentValue weight) { throw new IllegalArgumentException("Cannot convert weight to integer: " + weight); } - protected static String getHashName( - String name, IdentValue weight, IdentValue style) { - return name + "-" + weight + "-" + style; - } - protected Map loadFonts() { Map result = new HashMap<>(); addCourier(result); diff --git a/flying-saucer-pdf/src/test/java/org/xhtmlrenderer/pdf/ITextFontResolverTest.java b/flying-saucer-pdf/src/test/java/org/xhtmlrenderer/pdf/ITextFontResolverTest.java new file mode 100644 index 000000000..e6eb064d3 --- /dev/null +++ b/flying-saucer-pdf/src/test/java/org/xhtmlrenderer/pdf/ITextFontResolverTest.java @@ -0,0 +1,41 @@ +package org.xhtmlrenderer.pdf; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ITextFontResolverTest { + private final ITextFontResolver resolver = new ITextFontResolver(); + + @Test + void normalizeFontFamily() { + assertThat(resolver.normalizeFontFamily("ArialUnicodeMS")).isEqualTo("ArialUnicodeMS"); + assertThat(resolver.normalizeFontFamily("\"ArialUnicodeMS")).isEqualTo("ArialUnicodeMS"); + assertThat(resolver.normalizeFontFamily("ArialUnicodeMS\"")).isEqualTo("ArialUnicodeMS"); + assertThat(resolver.normalizeFontFamily("\"ArialUnicodeMS\"")).isEqualTo("ArialUnicodeMS"); + } + + @Test + void normalizeFontFamily_serif() { + assertThat(resolver.normalizeFontFamily("serif")).isEqualTo("Serif"); + assertThat(resolver.normalizeFontFamily("SERIF")).isEqualTo("Serif"); + assertThat(resolver.normalizeFontFamily("sErIf")).isEqualTo("Serif"); + } + + @Test + void normalizeFontFamily_sans_serif() { + assertThat(resolver.normalizeFontFamily("sans-serif")).isEqualTo("SansSerif"); + assertThat(resolver.normalizeFontFamily("SANS-serif")).isEqualTo("SansSerif"); + assertThat(resolver.normalizeFontFamily("sans-SERIF")).isEqualTo("SansSerif"); + assertThat(resolver.normalizeFontFamily("\"sans-serif")).isEqualTo("SansSerif"); + assertThat(resolver.normalizeFontFamily("sans-serif\"")).isEqualTo("SansSerif"); + assertThat(resolver.normalizeFontFamily("\"sans-serif\"")).isEqualTo("SansSerif"); + } + + @Test + void normalizeFontFamily_monospace() { + assertThat(resolver.normalizeFontFamily("monospace")).isEqualTo("Monospaced"); + assertThat(resolver.normalizeFontFamily("MONOSPACE")).isEqualTo("Monospaced"); + assertThat(resolver.normalizeFontFamily("\"monospace\"")).isEqualTo("Monospaced"); + } +} \ No newline at end of file diff --git a/flying-saucer-swt-examples/pom.xml b/flying-saucer-swt-examples/pom.xml index 65a4f4756..84ff46953 100644 --- a/flying-saucer-swt-examples/pom.xml +++ b/flying-saucer-swt-examples/pom.xml @@ -6,7 +6,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/flying-saucer-swt/pom.xml b/flying-saucer-swt/pom.xml index e0c64b44b..dec8600e7 100644 --- a/flying-saucer-swt/pom.xml +++ b/flying-saucer-swt/pom.xml @@ -7,7 +7,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT ../pom.xml diff --git a/pom.xml b/pom.xml index d1b34e3cd..6fe466cb8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.xhtmlrenderer flying-saucer-parent - 9.4.0 + 9.4.1-SNAPSHOT pom