From 16cedfeb6eca236129c51b71d4406c65259c95c1 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 27 Mar 2025 11:55:36 -0500 Subject: [PATCH] Update ConvertHtmlToPdfAction to use openhtmltopdf instead of flying-saucer-pdf-openpdf (gaining support for min/max-width/height --- qqq-backend-core/pom.xml | 13 +++-- .../templates/ConvertHtmlToPdfAction.java | 58 +++++++++++-------- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/qqq-backend-core/pom.xml b/qqq-backend-core/pom.xml index 21723b83..63a24365 100644 --- a/qqq-backend-core/pom.xml +++ b/qqq-backend-core/pom.xml @@ -151,16 +151,21 @@ 2.3 - + org.jsoup jsoup 1.15.3 - org.xhtmlrenderer - flying-saucer-pdf-openpdf - 9.1.22 + com.openhtmltopdf + openhtmltopdf-core + 1.0.10 + + + com.openhtmltopdf + openhtmltopdf-pdfbox + 1.0.10 diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/templates/ConvertHtmlToPdfAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/templates/ConvertHtmlToPdfAction.java index a7f9096f..d2dbdac1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/templates/ConvertHtmlToPdfAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/templates/ConvertHtmlToPdfAction.java @@ -26,22 +26,31 @@ import java.nio.file.Path; import java.util.Map; import com.kingsrook.qqq.backend.core.actions.AbstractQActionFunction; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.templates.ConvertHtmlToPdfInput; import com.kingsrook.qqq.backend.core.model.actions.templates.ConvertHtmlToPdfOutput; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; +import com.openhtmltopdf.css.constants.IdentValue; +import com.openhtmltopdf.pdfboxout.PdfBoxFontResolver; +import com.openhtmltopdf.pdfboxout.PdfBoxRenderer; +import com.openhtmltopdf.pdfboxout.PdfRendererBuilder; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; -import org.xhtmlrenderer.layout.SharedContext; -import org.xhtmlrenderer.pdf.ITextRenderer; /******************************************************************************* ** Action to convert a string of HTML to a PDF! ** ** Much credit to https://www.baeldung.com/java-html-to-pdf - *******************************************************************************/ + ** + ** Updated in March 2025 to go from flying-saucer-pdf-openpdf lib to openhtmltopdf, + ** mostly to get support for max-height on images... + ********************************************************************************/ public class ConvertHtmlToPdfAction extends AbstractQActionFunction { + private static final QLogger LOG = QLogger.getLogger(ConvertHtmlToPdfAction.class); + + /******************************************************************************* ** @@ -62,31 +71,32 @@ public class ConvertHtmlToPdfAction extends AbstractQActionFunction entry : CollectionUtils.nonNullMap(input.getCustomFonts()).entrySet()) - { - renderer.getFontResolver().addFont(entry.getValue().toAbsolutePath().toString(), entry.getKey(), "UTF-8", true, null); - } + for(Map.Entry entry : CollectionUtils.nonNullMap(input.getCustomFonts()).entrySet()) + { + LOG.warn("Note: Custom fonts appear to not be working in this class at this time..."); + pdfBoxRenderer.getFontResolver().addFont( + entry.getValue().toAbsolutePath().toFile(), // Path to the TrueType font file + entry.getKey(), // Font family name to use in CSS + 400, // Font weight (e.g., 400 for normal, 700 for bold) + IdentValue.NORMAL, // Font style (e.g., NORMAL, ITALIC) + true, // Whether to subset the font + PdfBoxFontResolver.FontGroup.MAIN // ?? + ); + } - renderer.layout(); - renderer.createPDF(input.getOutputStream()); + pdfBoxRenderer.createPDF(); + } return (output); }