From 69d11d037019f6bb865158a7ac118813020c97bf Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sat, 12 Feb 2022 13:27:12 +0100 Subject: [PATCH] IDEMPIERE-4893 NPE on PDF report of Test record (#1180) - Fix NPE trying to print any HTML content in PDF as form using internal engine - Fix problem printing HTML content as plain text --- .../compiere/print/layout/HTMLElement.java | 21 ++++++++++++------- .../compiere/print/layout/HTMLRenderer.java | 9 ++++++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/print/layout/HTMLElement.java b/org.adempiere.base/src/org/compiere/print/layout/HTMLElement.java index a59782fffc..deac6c0cb1 100644 --- a/org.adempiere.base/src/org/compiere/print/layout/HTMLElement.java +++ b/org.adempiere.base/src/org/compiere/print/layout/HTMLElement.java @@ -21,6 +21,7 @@ import java.awt.Rectangle; import java.awt.geom.Point2D; import java.util.Properties; import java.util.logging.Level; +import java.util.regex.Pattern; /** * HTML Form Print ELement. @@ -141,13 +142,19 @@ public class HTMLElement extends PrintElement { if (content == null) return false; - String s = content.toString(); - if (s.length() < 20) // assumption - return false; - s = s.trim().toUpperCase(); - if (s.startsWith("")) - return true; - return false; + // code borrowed from https://denofdevelopers.com/how-to-detect-if-string-is-html-or-not-in-android/ + final String TAG_START = "<\\w+((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)>"; + final String TAG_END = ""; + final String TAG_SELF_CLOSING = "<\\w+((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)/>"; + final String HTML_ENTITY = "&[a-zA-Z][a-zA-Z0-9]+;"; + final Pattern htmlPattern = Pattern + .compile("(" + TAG_START + ".*" + TAG_END + ")|(" + TAG_SELF_CLOSING + ")|(" + HTML_ENTITY + ")", Pattern.DOTALL); + boolean isHTML = false; + String htmlString = content.toString(); + if (htmlString != null) { + isHTML = htmlPattern.matcher(htmlString).find(); + } + return isHTML; } // isHTML } // HTMLElement diff --git a/org.adempiere.base/src/org/compiere/print/layout/HTMLRenderer.java b/org.adempiere.base/src/org/compiere/print/layout/HTMLRenderer.java index 1fafdc6842..0fe50bd98f 100644 --- a/org.adempiere.base/src/org/compiere/print/layout/HTMLRenderer.java +++ b/org.adempiere.base/src/org/compiere/print/layout/HTMLRenderer.java @@ -16,6 +16,7 @@ *****************************************************************************/ package org.compiere.print.layout; +import java.awt.Container; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Shape; @@ -98,6 +99,7 @@ public class HTMLRenderer extends View implements Externalizable m_factory = f; m_view = v; m_view.setParent(this); + m_container = new Container(); m_element = m_view.getElement(); // initially layout to the preferred size setSize(m_view.getPreferredSpan(X_AXIS), m_view.getPreferredSpan(Y_AXIS)); @@ -106,6 +108,7 @@ public class HTMLRenderer extends View implements Externalizable private int m_width; private View m_view; private ViewFactory m_factory; + private Container m_container; private Element m_element; private Rectangle m_allocation; private float m_viewWidth; @@ -436,4 +439,10 @@ public class HTMLRenderer extends View implements Externalizable float height = in.readFloat(); setSize(width, height); } + + @Override + public Container getContainer() { + return m_container; + } + } // HTMLRenderer