From c501436c3784e8ac7b3c42992b845cf2704064ed Mon Sep 17 00:00:00 2001 From: Kevin Sillerud Date: Tue, 5 Feb 2019 10:01:00 +0100 Subject: [PATCH] Load fonts on startup --- Dockerfile | 1 + build.gradle | 1 + {src/main/resources/fonts => fonts}/OFL.txt | 0 .../fonts => fonts}/SourceSansPro-Black.ttf | Bin .../SourceSansPro-BlackItalic.ttf | Bin .../fonts => fonts}/SourceSansPro-Bold.ttf | Bin .../SourceSansPro-BoldItalic.ttf | Bin .../SourceSansPro-ExtraLight.ttf | Bin .../SourceSansPro-ExtraLightItalic.ttf | Bin .../fonts => fonts}/SourceSansPro-Italic.ttf | Bin .../fonts => fonts}/SourceSansPro-Light.ttf | Bin .../SourceSansPro-LightItalic.ttf | Bin .../fonts => fonts}/SourceSansPro-Regular.ttf | Bin .../SourceSansPro-SemiBold.ttf | Bin .../SourceSansPro-SemiBoldItalic.ttf | Bin fonts/config.json | 16 +++++++++++++ src/main/kotlin/no/nav/pdfgen/Bootstrap.kt | 6 +++++ src/main/kotlin/no/nav/pdfgen/Utils.kt | 22 +++++++++++------- 18 files changed, 38 insertions(+), 8 deletions(-) rename {src/main/resources/fonts => fonts}/OFL.txt (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-Black.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-BlackItalic.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-Bold.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-BoldItalic.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-ExtraLight.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-ExtraLightItalic.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-Italic.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-Light.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-LightItalic.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-Regular.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-SemiBold.ttf (100%) rename {src/main/resources/fonts => fonts}/SourceSansPro-SemiBoldItalic.ttf (100%) create mode 100644 fonts/config.json diff --git a/Dockerfile b/Dockerfile index 7cad37d..16b712c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,3 +6,4 @@ ENV DISABLE_PDF_GET="true" RUN mkdir out COPY templates templates COPY resources resources +COPY fonts fonts diff --git a/build.gradle b/build.gradle index f2c91c1..a52add7 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,7 @@ dependencies { implementation "org.jsoup:jsoup:$jsoup_version" implementation "com.fasterxml.jackson.core:jackson-core:$jackson_version" + implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$jackson_version" implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version" implementation "javax.xml.bind:jaxb-api:2.1" implementation "org.glassfish.jaxb:jaxb-runtime:$jaxb_version" diff --git a/src/main/resources/fonts/OFL.txt b/fonts/OFL.txt similarity index 100% rename from src/main/resources/fonts/OFL.txt rename to fonts/OFL.txt diff --git a/src/main/resources/fonts/SourceSansPro-Black.ttf b/fonts/SourceSansPro-Black.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-Black.ttf rename to fonts/SourceSansPro-Black.ttf diff --git a/src/main/resources/fonts/SourceSansPro-BlackItalic.ttf b/fonts/SourceSansPro-BlackItalic.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-BlackItalic.ttf rename to fonts/SourceSansPro-BlackItalic.ttf diff --git a/src/main/resources/fonts/SourceSansPro-Bold.ttf b/fonts/SourceSansPro-Bold.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-Bold.ttf rename to fonts/SourceSansPro-Bold.ttf diff --git a/src/main/resources/fonts/SourceSansPro-BoldItalic.ttf b/fonts/SourceSansPro-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-BoldItalic.ttf rename to fonts/SourceSansPro-BoldItalic.ttf diff --git a/src/main/resources/fonts/SourceSansPro-ExtraLight.ttf b/fonts/SourceSansPro-ExtraLight.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-ExtraLight.ttf rename to fonts/SourceSansPro-ExtraLight.ttf diff --git a/src/main/resources/fonts/SourceSansPro-ExtraLightItalic.ttf b/fonts/SourceSansPro-ExtraLightItalic.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-ExtraLightItalic.ttf rename to fonts/SourceSansPro-ExtraLightItalic.ttf diff --git a/src/main/resources/fonts/SourceSansPro-Italic.ttf b/fonts/SourceSansPro-Italic.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-Italic.ttf rename to fonts/SourceSansPro-Italic.ttf diff --git a/src/main/resources/fonts/SourceSansPro-Light.ttf b/fonts/SourceSansPro-Light.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-Light.ttf rename to fonts/SourceSansPro-Light.ttf diff --git a/src/main/resources/fonts/SourceSansPro-LightItalic.ttf b/fonts/SourceSansPro-LightItalic.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-LightItalic.ttf rename to fonts/SourceSansPro-LightItalic.ttf diff --git a/src/main/resources/fonts/SourceSansPro-Regular.ttf b/fonts/SourceSansPro-Regular.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-Regular.ttf rename to fonts/SourceSansPro-Regular.ttf diff --git a/src/main/resources/fonts/SourceSansPro-SemiBold.ttf b/fonts/SourceSansPro-SemiBold.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-SemiBold.ttf rename to fonts/SourceSansPro-SemiBold.ttf diff --git a/src/main/resources/fonts/SourceSansPro-SemiBoldItalic.ttf b/fonts/SourceSansPro-SemiBoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/SourceSansPro-SemiBoldItalic.ttf rename to fonts/SourceSansPro-SemiBoldItalic.ttf diff --git a/fonts/config.json b/fonts/config.json new file mode 100644 index 0000000..61cd50c --- /dev/null +++ b/fonts/config.json @@ -0,0 +1,16 @@ +[ + { + "family": "Source Sans Pro", + "path": "SourceSansPro-Regular.ttf", + "weight": 400, + "style": "NORMAL", + "subset": false + }, + { + "family": "Source Sans Pro", + "path": "SourceSansPro-Bold.ttf", + "weight": 700, + "style": "NORMAL", + "subset": false + } +] diff --git a/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt b/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt index 3fd9067..113f288 100644 --- a/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt +++ b/src/main/kotlin/no/nav/pdfgen/Bootstrap.kt @@ -5,6 +5,8 @@ package no.nav.pdfgen import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import com.fasterxml.jackson.module.kotlin.registerKotlinModule import com.github.jknack.handlebars.Context import com.github.jknack.handlebars.Handlebars import com.github.jknack.handlebars.JsonNodeValueResolver @@ -53,16 +55,20 @@ val APPLICATION_PDF = ContentType.parse("application/pdf") val collectorRegistry: CollectorRegistry = CollectorRegistry.defaultRegistry val objectMapper: ObjectMapper = ObjectMapper() + .registerKotlinModule() val base64encoder: Encoder = Base64.getEncoder() val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") val templateRoot: Path = Paths.get("templates/") val imagesRoot: Path = Paths.get("resources/") +val fontsRoot: Path = Paths.get("fonts/") val images = loadImages() val handlebars: Handlebars = Handlebars(FileTemplateLoader(templateRoot.toFile())).apply { registerNavHelpers(this) infiniteLoops(true) } +val fonts: Array = objectMapper.readValue(Files.newInputStream(fontsRoot.resolve("config.json"))) + val log: Logger = LoggerFactory.getLogger("pdf-gen") fun main(args: Array) { diff --git a/src/main/kotlin/no/nav/pdfgen/Utils.kt b/src/main/kotlin/no/nav/pdfgen/Utils.kt index 9af4e1f..a1a60b9 100644 --- a/src/main/kotlin/no/nav/pdfgen/Utils.kt +++ b/src/main/kotlin/no/nav/pdfgen/Utils.kt @@ -15,7 +15,6 @@ import java.awt.geom.AffineTransform import java.awt.image.AffineTransformOp import java.awt.image.AffineTransformOp.TYPE_BILINEAR import java.awt.image.BufferedImage -import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.InputStream import java.io.OutputStream @@ -24,14 +23,21 @@ import javax.imageio.ImageIO class Utils val colorProfile: ByteArray = IOUtils.toByteArray(Utils::class.java.getResourceAsStream("/sRGB2014.icc")) -val sourceSansProRegular: ByteArray = IOUtils.toByteArray(Utils::class.java.getResourceAsStream("/fonts/SourceSansPro-Regular.ttf")) -val sourceSansProBold: ByteArray = IOUtils.toByteArray(Utils::class.java.getResourceAsStream("/fonts/SourceSansPro-Bold.ttf")) + +data class FontMetadata( + val family: String, + val path: String, + val weight: Int, + val style: BaseRendererBuilder.FontStyle, + val subset: Boolean +) fun createPDFA(w3doc: Document, outputStream: OutputStream) = PdfRendererBuilder() - .useFont({ ByteArrayInputStream(sourceSansProRegular) }, "Source Sans Pro", - 400, BaseRendererBuilder.FontStyle.NORMAL, false) - .useFont({ ByteArrayInputStream(sourceSansProBold) }, "Source Sans Pro", 700, - BaseRendererBuilder.FontStyle.NORMAL, false) + .apply { + for (font in fonts) { + useFont(fontsRoot.resolve(font.path).toFile(), font.family, font.weight, font.style, font.subset) + } + } // .useFastMode() wait with fast mode until it doesn't print a bunch of errors .useColorProfile(colorProfile) .useSVGDrawer(BatikSVGDrawer()) @@ -94,4 +100,4 @@ private fun scale(image: PDImageXObject, page: PDPage): ImageSize { } return ImageSize(width, height) -} \ No newline at end of file +}