From 9eef6f68529d6e3f2e696b0cbb3c947f7e643971 Mon Sep 17 00:00:00 2001 From: masartbenji Date: Wed, 4 May 2022 20:57:13 +0200 Subject: [PATCH 1/4] update pom --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index b90825a90..72410e9bb 100644 --- a/pom.xml +++ b/pom.xml @@ -111,6 +111,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 14 + 14 + + \ No newline at end of file From e8004a0c9f5e737c8cf4c30fe0fa095664a8253d Mon Sep 17 00:00:00 2001 From: masartbenji Date: Wed, 4 May 2022 20:57:37 +0200 Subject: [PATCH 2/4] little refactoring of css applier util --- .../apply/util/BorderStyleApplierUtil.java | 209 ++++++++---------- .../css/apply/util/MarginApplierUtil.java | 2 +- .../css/apply/util/enums/BorderEnum.java | 8 + .../css/apply/util/enums/BorderRadii.java | 8 + .../apply/util/enums/RgbaColorProperty.java | 8 + 5 files changed, 121 insertions(+), 114 deletions(-) create mode 100644 src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderEnum.java create mode 100644 src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderRadii.java create mode 100644 src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/RgbaColorProperty.java diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java index f8a1c3e93..a5a9a0a03 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java @@ -44,6 +44,9 @@ This file is part of the iText (R) project. import com.itextpdf.html2pdf.attach.ProcessorContext; import com.itextpdf.html2pdf.css.CssConstants; +import com.itextpdf.html2pdf.css.apply.util.enums.BorderEnum; +import com.itextpdf.html2pdf.css.apply.util.enums.BorderRadii; +import com.itextpdf.html2pdf.css.apply.util.enums.RgbaColorProperty; import com.itextpdf.kernel.colors.ColorConstants; import com.itextpdf.kernel.colors.DeviceRgb; import com.itextpdf.layout.IPropertyContainer; @@ -63,6 +66,7 @@ This file is part of the iText (R) project. import com.itextpdf.styledxmlparser.css.util.CssDimensionParsingUtils; import java.util.Map; +import java.util.Objects; /** * Utilities class to apply border styles. @@ -86,39 +90,8 @@ public static void applyBorders(Map cssProps, ProcessorContext c float em = CssDimensionParsingUtils.parseAbsoluteLength(cssProps.get(CssConstants.FONT_SIZE)); float rem = context.getCssContext().getRootFontSize(); - Border[] bordersArray = getBordersArray(cssProps, em, rem); - if (bordersArray[0] != null) { - element.setProperty(Property.BORDER_TOP, bordersArray[0]); - } - - if (bordersArray[1] != null) { - element.setProperty(Property.BORDER_RIGHT, bordersArray[1]); - } - - if (bordersArray[2] != null) { - element.setProperty(Property.BORDER_BOTTOM, bordersArray[2]); - } - - if (bordersArray[3] != null) { - element.setProperty(Property.BORDER_LEFT, bordersArray[3]); - } - - BorderRadius[] borderRadii = getBorderRadiiArray(cssProps, em, rem); - if (borderRadii[0] != null) { - element.setProperty(Property.BORDER_TOP_LEFT_RADIUS, borderRadii[0]); - } - - if (borderRadii[1] != null) { - element.setProperty(Property.BORDER_TOP_RIGHT_RADIUS, borderRadii[1]); - } - - if (borderRadii[2] != null) { - element.setProperty(Property.BORDER_BOTTOM_RIGHT_RADIUS, borderRadii[2]); - } - - if (borderRadii[3] != null) { - element.setProperty(Property.BORDER_BOTTOM_LEFT_RADIUS, borderRadii[3]); - } + setBorderProperties(cssProps, element, em, rem); + setBorderRadiusProperties(cssProps, element, em, rem); } /** @@ -131,21 +104,14 @@ public static void applyBorders(Map cssProps, ProcessorContext c */ public static Border[] getBordersArray(Map styles, float em, float rem) { Border[] borders = new Border[4]; - Border topBorder = getCertainBorder(styles.get(CssConstants.BORDER_TOP_WIDTH), - styles.get(CssConstants.BORDER_TOP_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_TOP_COLOR), em, rem); - borders[0] = topBorder; - - Border rightBorder = getCertainBorder(styles.get(CssConstants.BORDER_RIGHT_WIDTH), - styles.get(CssConstants.BORDER_RIGHT_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_RIGHT_COLOR), em, rem); - borders[1] = rightBorder; - - Border bottomBorder = getCertainBorder(styles.get(CssConstants.BORDER_BOTTOM_WIDTH), - styles.get(CssConstants.BORDER_BOTTOM_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_BOTTOM_COLOR), em, rem); - borders[2] = bottomBorder; - - Border leftBorder = getCertainBorder(styles.get(CssConstants.BORDER_LEFT_WIDTH), - styles.get(CssConstants.BORDER_LEFT_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_LEFT_COLOR), em, rem); - borders[3] = leftBorder; + borders[BorderEnum.TOP.ordinal()] = getCertainBorder(CssConstants.BORDER_TOP_WIDTH, CssConstants.BORDER_TOP_STYLE, + CssConstants.BORDER_TOP_COLOR, em, rem, styles); + borders[BorderEnum.RIGHT.ordinal()] = getCertainBorder(CssConstants.BORDER_RIGHT_WIDTH, CssConstants.BORDER_RIGHT_STYLE, + CssConstants.BORDER_RIGHT_COLOR, em, rem, styles); + borders[BorderEnum.BOTTOM.ordinal()] = getCertainBorder(CssConstants.BORDER_BOTTOM_WIDTH, CssConstants.BORDER_BOTTOM_STYLE, + CssConstants.BORDER_BOTTOM_COLOR, em, rem, styles); + borders[BorderEnum.LEFT.ordinal()] = getCertainBorder(CssConstants.BORDER_LEFT_WIDTH, CssConstants.BORDER_LEFT_STYLE, + CssConstants.BORDER_LEFT_COLOR, em, rem, styles); return borders; } @@ -161,30 +127,25 @@ public static Border[] getBordersArray(Map styles, float em, flo * @return the border */ public static Border getCertainBorder(String borderWidth, String borderStyle, String borderColor, float em, float rem) { - if (borderStyle == null || CssConstants.NONE.equals(borderStyle)) { + if (Objects.isNull(borderStyle) || CssConstants.NONE.equals(borderStyle)) { return null; } - if (borderWidth == null) { + if (Objects.isNull(borderWidth)) { borderWidth = CssDefaults.getDefaultValue(CssConstants.BORDER_WIDTH); } float borderWidthValue; if (CssConstants.BORDER_WIDTH_VALUES.contains(borderWidth)) { - if (CssConstants.THIN.equals(borderWidth)) { - borderWidth = "1px"; - } else if (CssConstants.MEDIUM.equals(borderWidth)) { - borderWidth = "2px"; - } else if (CssConstants.THICK.equals(borderWidth)) { - borderWidth = "3px"; + switch (borderWidth) { + case CssConstants.THIN -> borderWidth = "1px"; + case CssConstants.MEDIUM -> borderWidth = "2px"; + case CssConstants.THICK -> borderWidth = "3px"; } } UnitValue unitValue = CssDimensionParsingUtils.parseLengthValueToPt(borderWidth, em, rem); - if (unitValue == null) { - return null; - } - if (unitValue.isPercentValue()) { + if (Objects.isNull(unitValue) || unitValue.isPercentValue()) { return null; } @@ -196,8 +157,11 @@ public static Border getCertainBorder(String borderWidth, String borderStyle, St if (borderColor != null) { if (!CssConstants.TRANSPARENT.equals(borderColor)) { float[] rgbaColor = CssDimensionParsingUtils.parseRgbaColor(borderColor); - color = new DeviceRgb(rgbaColor[0], rgbaColor[1], rgbaColor[2]); - opacity = rgbaColor[3]; + color = new DeviceRgb(rgbaColor[ + RgbaColorProperty.RED.ordinal()], + rgbaColor[RgbaColorProperty.GREEN.ordinal()], + rgbaColor[RgbaColorProperty.BLUE.ordinal()]); + opacity = rgbaColor[RgbaColorProperty.ALPHA.ordinal()]; } else { opacity = 0f; } @@ -205,35 +169,17 @@ public static Border getCertainBorder(String borderWidth, String borderStyle, St || CssConstants.INSET.equals(borderStyle) || CssConstants.OUTSET.equals(borderStyle)) { color = new DeviceRgb(212, 208, 200); } - switch (borderStyle) { - case CssConstants.SOLID: - border = new SolidBorder(color, borderWidthValue, opacity); - break; - case CssConstants.DASHED: - border = new DashedBorder(color, borderWidthValue, opacity); - break; - case CssConstants.DOTTED: - border = new RoundDotsBorder(color, borderWidthValue, opacity); - break; - case CssConstants.DOUBLE: - border = new DoubleBorder(color, borderWidthValue, opacity); - break; - case CssConstants.GROOVE: - border = new GrooveBorder(color, borderWidthValue, opacity); - break; - case CssConstants.RIDGE: - border = new RidgeBorder(color, borderWidthValue, opacity); - break; - case CssConstants.INSET: - border = new InsetBorder(color, borderWidthValue, opacity); - break; - case CssConstants.OUTSET: - border = new OutsetBorder(color, borderWidthValue, opacity); - break; - default: - border = null; - break; - } + border = switch (borderStyle) { + case CssConstants.SOLID -> new SolidBorder(color, borderWidthValue, opacity); + case CssConstants.DASHED -> new DashedBorder(color, borderWidthValue, opacity); + case CssConstants.DOTTED -> new RoundDotsBorder(color, borderWidthValue, opacity); + case CssConstants.DOUBLE -> new DoubleBorder(color, borderWidthValue, opacity); + case CssConstants.GROOVE -> new GrooveBorder(color, borderWidthValue, opacity); + case CssConstants.RIDGE -> new RidgeBorder(color, borderWidthValue, opacity); + case CssConstants.INSET -> new InsetBorder(color, borderWidthValue, opacity); + case CssConstants.OUTSET -> new OutsetBorder(color, borderWidthValue, opacity); + default -> null; + }; } return border; } @@ -252,30 +198,17 @@ public static BorderRadius[] getBorderRadiiArray(Map styles, flo BorderRadius borderRadius = null; UnitValue borderRadiusUV = CssDimensionParsingUtils .parseLengthValueToPt(styles.get(CssConstants.BORDER_RADIUS), em, rem); - if (null != borderRadiusUV) { + if (Objects.nonNull(borderRadiusUV)) { borderRadius = new BorderRadius(borderRadiusUV); } - - UnitValue[] borderTopLeftRadiusUV = CssDimensionParsingUtils - .parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_TOP_LEFT_RADIUS), em, rem); - borderRadii[0] = null == borderTopLeftRadiusUV - ? borderRadius - : new BorderRadius(borderTopLeftRadiusUV[0], borderTopLeftRadiusUV[1]); - UnitValue[] borderTopRightRadiusUV = CssDimensionParsingUtils - .parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_TOP_RIGHT_RADIUS), em, rem); - borderRadii[1] = null == borderTopRightRadiusUV - ? borderRadius - : new BorderRadius(borderTopRightRadiusUV[0], borderTopRightRadiusUV[1]); - UnitValue[] borderBottomRightRadiusUV = CssDimensionParsingUtils - .parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_BOTTOM_RIGHT_RADIUS), em, rem); - borderRadii[2] = null == borderBottomRightRadiusUV - ? borderRadius - : new BorderRadius(borderBottomRightRadiusUV[0], borderBottomRightRadiusUV[1]); - UnitValue[] borderBottomLeftRadiusUV = CssDimensionParsingUtils - .parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_BOTTOM_LEFT_RADIUS), em, rem); - borderRadii[3] = null == borderBottomLeftRadiusUV - ? borderRadius - : new BorderRadius(borderBottomLeftRadiusUV[0], borderBottomLeftRadiusUV[1]); + borderRadii[BorderRadii.TOP_LEFT.ordinal()] = getBorderRadius(CssConstants.BORDER_TOP_LEFT_RADIUS, + borderRadius, em, rem, styles); + borderRadii[BorderRadii.TOP_RIGHT.ordinal()] = getBorderRadius(CssConstants.BORDER_TOP_RIGHT_RADIUS, + borderRadius, em, rem, styles); + borderRadii[BorderRadii.BOTTOM_RIGHT.ordinal()] = getBorderRadius(CssConstants.BORDER_BOTTOM_RIGHT_RADIUS, + borderRadius, em, rem, styles); + borderRadii[BorderRadii.BOTTOM_LEFT.ordinal()] = getBorderRadius(CssConstants.BORDER_BOTTOM_LEFT_RADIUS, + borderRadius, em, rem, styles); return borderRadii; } @@ -288,4 +221,54 @@ private static String getSpecificBorderColorOrDefaultColor(Map s return borderColor; } + private static Border getCertainBorder(String widthConstant, String styleConstant, String colorConstant, + float em, float rem, Map styles) { + String widthCssValue = styles.get(widthConstant); + String styleCssValue = styles.get(styleConstant); + String colorCssValue = getSpecificBorderColorOrDefaultColor(styles, colorConstant); + return getCertainBorder(widthCssValue, styleCssValue, colorCssValue, em, rem); + } + + private static BorderRadius getBorderRadius(UnitValue[] borderRadiusUnitValue, BorderRadius borderRadius) { + if(Objects.isNull(borderRadiusUnitValue)) { + return borderRadius; + } + return new BorderRadius(borderRadiusUnitValue[0], borderRadiusUnitValue[1]); + } + + private static BorderRadius getBorderRadius(String cssConstant, BorderRadius borderRadius, float em, float rem, + Map cssProps) { + UnitValue[] borderRadiusUnitValue = CssDimensionParsingUtils + .parseSpecificCornerBorderRadius(cssProps.get(cssConstant), em, rem); + return getBorderRadius(borderRadiusUnitValue, borderRadius); + } + + private static void setBorderRadiusProperties(Map cssProps, IPropertyContainer element, float em, float rem) { + BorderRadius[] borderRadii = getBorderRadiiArray(cssProps, em, rem); + setBorderRadiusProperty(element, borderRadii[BorderRadii.TOP_LEFT.ordinal()], Property.BORDER_TOP_LEFT_RADIUS); + setBorderRadiusProperty(element, borderRadii[BorderRadii.TOP_RIGHT.ordinal()], Property.BORDER_TOP_RIGHT_RADIUS); + setBorderRadiusProperty(element, borderRadii[BorderRadii.BOTTOM_RIGHT.ordinal()], Property.BORDER_BOTTOM_RIGHT_RADIUS); + setBorderRadiusProperty(element, borderRadii[BorderRadii.BOTTOM_LEFT.ordinal()], Property.BORDER_BOTTOM_LEFT_RADIUS); + } + + private static void setBorderProperties(Map cssProps, IPropertyContainer element, float em, float rem) { + Border[] borders = getBordersArray(cssProps, em, rem); + setBorderProperty(element, borders[BorderEnum.TOP.ordinal()], Property.BORDER_TOP); + setBorderProperty(element, borders[BorderEnum.RIGHT.ordinal()], Property.BORDER_RIGHT); + setBorderProperty(element, borders[BorderEnum.BOTTOM.ordinal()], Property.BORDER_BOTTOM); + setBorderProperty(element, borders[BorderEnum.LEFT.ordinal()], Property.BORDER_LEFT); + } + + private static void setBorderRadiusProperty(IPropertyContainer element, BorderRadius borderRadius, int propertyValue) { + if(Objects.nonNull(borderRadius)) { + element.setProperty(propertyValue, borderRadius); + } + } + + private static void setBorderProperty(IPropertyContainer element, Border border, int propertyValue) { + if (Objects.nonNull(border)) { + element.setProperty(propertyValue, border); + } + } + } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java index 040e70c97..324853a69 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java @@ -163,7 +163,7 @@ private static Float parseMarginValue(String marginValString, float em, float re if (marginUnitVal != null) { if (!marginUnitVal.isPointValue()) { if (baseValue != 0.0f) { - return new Float(baseValue * marginUnitVal.getValue() * 0.01); + return baseValue * marginUnitVal.getValue() * 0.01f; } logger.error(Html2PdfLogMessageConstant.MARGIN_VALUE_IN_PERCENT_NOT_SUPPORTED); return null; diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderEnum.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderEnum.java new file mode 100644 index 000000000..01a09b9aa --- /dev/null +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderEnum.java @@ -0,0 +1,8 @@ +package com.itextpdf.html2pdf.css.apply.util.enums; + +public enum BorderEnum { + TOP, + RIGHT, + BOTTOM, + LEFT; +} diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderRadii.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderRadii.java new file mode 100644 index 000000000..d70499eca --- /dev/null +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/BorderRadii.java @@ -0,0 +1,8 @@ +package com.itextpdf.html2pdf.css.apply.util.enums; + +public enum BorderRadii { + TOP_LEFT, + TOP_RIGHT, + BOTTOM_RIGHT, + BOTTOM_LEFT; +} diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/RgbaColorProperty.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/RgbaColorProperty.java new file mode 100644 index 000000000..4f95f33f2 --- /dev/null +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/RgbaColorProperty.java @@ -0,0 +1,8 @@ +package com.itextpdf.html2pdf.css.apply.util.enums; + +public enum RgbaColorProperty { + RED, + GREEN, + BLUE, + ALPHA; +} From c3a9c38fcc734b91c1305936de47b271b24cf6c2 Mon Sep 17 00:00:00 2001 From: masartbenji Date: Wed, 4 May 2022 21:55:07 +0200 Subject: [PATCH 3/4] using strictly java 8 --- pom.xml | 8 ---- .../apply/util/BorderStyleApplierUtil.java | 47 +++++++++++++------ 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 72410e9bb..b90825a90 100644 --- a/pom.xml +++ b/pom.xml @@ -111,14 +111,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - - 14 - 14 - - \ No newline at end of file diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java index a5a9a0a03..35d1e473f 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/BorderStyleApplierUtil.java @@ -138,9 +138,15 @@ public static Border getCertainBorder(String borderWidth, String borderStyle, St float borderWidthValue; if (CssConstants.BORDER_WIDTH_VALUES.contains(borderWidth)) { switch (borderWidth) { - case CssConstants.THIN -> borderWidth = "1px"; - case CssConstants.MEDIUM -> borderWidth = "2px"; - case CssConstants.THICK -> borderWidth = "3px"; + case CssConstants.THIN: + borderWidth = "1px"; + break; + case CssConstants.MEDIUM: + borderWidth = "2px"; + break; + case CssConstants.THICK: + borderWidth = "3px"; + break; } } @@ -169,21 +175,34 @@ public static Border getCertainBorder(String borderWidth, String borderStyle, St || CssConstants.INSET.equals(borderStyle) || CssConstants.OUTSET.equals(borderStyle)) { color = new DeviceRgb(212, 208, 200); } - border = switch (borderStyle) { - case CssConstants.SOLID -> new SolidBorder(color, borderWidthValue, opacity); - case CssConstants.DASHED -> new DashedBorder(color, borderWidthValue, opacity); - case CssConstants.DOTTED -> new RoundDotsBorder(color, borderWidthValue, opacity); - case CssConstants.DOUBLE -> new DoubleBorder(color, borderWidthValue, opacity); - case CssConstants.GROOVE -> new GrooveBorder(color, borderWidthValue, opacity); - case CssConstants.RIDGE -> new RidgeBorder(color, borderWidthValue, opacity); - case CssConstants.INSET -> new InsetBorder(color, borderWidthValue, opacity); - case CssConstants.OUTSET -> new OutsetBorder(color, borderWidthValue, opacity); - default -> null; - }; + border = getBorder(borderStyle, borderWidthValue, color, opacity); } return border; } + private static Border getBorder(String borderStyle, float borderWidthValue, DeviceRgb color, float opacity) { + switch (borderStyle) { + case CssConstants.SOLID: + return new SolidBorder(color, borderWidthValue, opacity); + case CssConstants.DASHED: + return new DashedBorder(color, borderWidthValue, opacity); + case CssConstants.DOTTED: + return new RoundDotsBorder(color, borderWidthValue, opacity); + case CssConstants.DOUBLE: + return new DoubleBorder(color, borderWidthValue, opacity); + case CssConstants.GROOVE: + return new GrooveBorder(color, borderWidthValue, opacity); + case CssConstants.RIDGE: + return new RidgeBorder(color, borderWidthValue, opacity); + case CssConstants.INSET: + return new InsetBorder(color, borderWidthValue, opacity); + case CssConstants.OUTSET: + return new OutsetBorder(color, borderWidthValue, opacity); + default: + return null; + } + } + /** * Gets the array that defines the borders. * From 57edd4c1a234b099f628ecd69cece2b12d25005a Mon Sep 17 00:00:00 2001 From: masartbenji Date: Thu, 5 May 2022 19:54:23 +0200 Subject: [PATCH 4/4] refactoring of css applier util --- .../css/apply/util/CounterProcessorUtil.java | 42 +++++----- .../css/apply/util/FlexApplierUtil.java | 1 - .../css/apply/util/FloatApplierUtil.java | 28 ++++--- .../apply/util/HyphenationApplierUtil.java | 25 +++--- .../css/apply/util/ListStyleApplierUtil.java | 82 +++++++++++-------- .../css/apply/util/MarginApplierUtil.java | 1 - .../apply/util/OrphansWidowsApplierUtil.java | 4 +- .../css/apply/util/OutlineApplierUtil.java | 16 ++-- .../css/apply/util/OverflowApplierUtil.java | 26 ++++-- .../css/apply/util/PaddingApplierUtil.java | 61 ++++---------- .../css/apply/util/PageBreakApplierUtil.java | 16 ++-- .../css/apply/util/PositionApplierUtil.java | 70 ++++++---------- .../SupportedColColgroupPropertiesUtil.java | 2 +- .../apply/util/TransformationApplierUtil.java | 10 +-- .../enums/CssCounterManagerOperation.java | 5 ++ 15 files changed, 192 insertions(+), 197 deletions(-) create mode 100644 src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/CssCounterManagerOperation.java diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/CounterProcessorUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/CounterProcessorUtil.java index c440fb55e..13a5cdf42 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/CounterProcessorUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/CounterProcessorUtil.java @@ -43,6 +43,7 @@ This file is part of the iText (R) project. package com.itextpdf.html2pdf.css.apply.util; import com.itextpdf.html2pdf.css.CssConstants; +import com.itextpdf.html2pdf.css.apply.util.enums.CssCounterManagerOperation; import com.itextpdf.html2pdf.css.resolve.CssContext; import com.itextpdf.html2pdf.css.resolve.func.counter.CssCounterManager; import com.itextpdf.styledxmlparser.css.util.CssDimensionParsingUtils; @@ -63,10 +64,10 @@ public class CounterProcessorUtil { */ public static void processCounters(Map cssProps, CssContext context) { String counterReset = cssProps.get(CssConstants.COUNTER_RESET); - processReset(counterReset, context); + processCounter(counterReset, context, CssCounterManagerOperation.RESET); String counterIncrement = cssProps.get(CssConstants.COUNTER_INCREMENT); - processIncrement(counterIncrement, context); + processCounter(counterIncrement, context, CssCounterManagerOperation.INCREMENT); } /** @@ -93,38 +94,37 @@ public static void endProcessingCounters(CssContext context, IElementNode elemen counterManager.popEveryCounterFromCounters(element); } - private static void processReset(String counterReset, CssContext context) { - if (counterReset != null) { + private static void processCounter(String counter, CssContext context, CssCounterManagerOperation operation) { + if (counter != null) { final CssCounterManager counterManager = context.getCounterManager(); - final String[] params = counterReset.split(" "); + final String[] params = counter.split(" "); for (int i = 0; i < params.length; i++) { final String counterName = params[i]; final Integer possibleCounterValue; if (i + 1 < params.length && (possibleCounterValue = CssDimensionParsingUtils.parseInteger(params[i + 1])) != null) { - counterManager.resetCounter(counterName, (int) possibleCounterValue); + processCounter(counterManager, counterName, operation, possibleCounterValue); i++; } else { - counterManager.resetCounter(counterName); + processCounter(counterManager, counterName, operation); } } } } - private static void processIncrement(String counterIncrement, CssContext context) { - if (counterIncrement != null) { - final CssCounterManager counterManager = context.getCounterManager(); - final String[] params = counterIncrement.split(" "); - for (int i = 0; i < params.length; i++) { - final String counterName = params[i]; - final Integer possibleIncrementValue; - if (i + 1 < params.length && (possibleIncrementValue = CssDimensionParsingUtils.parseInteger(params[i + 1])) != null) { - counterManager.incrementCounter(counterName, (int) possibleIncrementValue); - i++; - } else { - counterManager.incrementCounter(counterName); - } - } + private static void processCounter(CssCounterManager counterManager, String counterName, + CssCounterManagerOperation operation, Integer possibleCounterValue) { + switch (operation) { + case RESET: + counterManager.resetCounter(counterName, possibleCounterValue); + break; + case INCREMENT: + counterManager.incrementCounter(counterName, possibleCounterValue); } } + private static void processCounter(CssCounterManager counterManager, String counterName, + CssCounterManagerOperation operation) { + processCounter(counterManager, counterName, operation, null); + } + } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/FlexApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/FlexApplierUtil.java index bb12576c0..873069ca7 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/FlexApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/FlexApplierUtil.java @@ -171,7 +171,6 @@ private static void applyAlignItems(Map cssProps, IPropertyConta LOGGER.warn(MessageFormatUtil.format(Html2PdfLogMessageConstant.FLEX_PROPERTY_IS_NOT_SUPPORTED_YET, CommonCssConstants.ALIGN_ITEMS, alignItemsString)); alignItems = AlignmentPropertyValue.STRETCH; - break; } element.setProperty(Property.ALIGN_ITEMS, alignItems); } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/FloatApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/FloatApplierUtil.java index e536ddd90..77a0ec5c8 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/FloatApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/FloatApplierUtil.java @@ -72,22 +72,28 @@ private FloatApplierUtil() { public static void applyFloating(Map cssProps, ProcessorContext context, IPropertyContainer element) { String floatValue = cssProps.get(CssConstants.FLOAT); if (floatValue != null) { - if (CssConstants.LEFT.equals(floatValue)) { - element.setProperty(Property.FLOAT, FloatPropertyValue.LEFT); - - } else if (CssConstants.RIGHT.equals(floatValue)) { - element.setProperty(Property.FLOAT, FloatPropertyValue.RIGHT); + switch (floatValue) { + case CssConstants.LEFT: + element.setProperty(Property.FLOAT, FloatPropertyValue.LEFT); + break; + case CssConstants.RIGHT: + element.setProperty(Property.FLOAT, FloatPropertyValue.RIGHT); + break; } } String clearValue = cssProps.get(CssConstants.CLEAR); if (clearValue != null) { - if(CssConstants.LEFT.equals(clearValue)) { - element.setProperty(Property.CLEAR, ClearPropertyValue.LEFT); - } else if (CssConstants.RIGHT.equals(clearValue)) { - element.setProperty(Property.CLEAR, ClearPropertyValue.RIGHT); - } else if (CssConstants.BOTH.equals(clearValue)) { - element.setProperty(Property.CLEAR, ClearPropertyValue.BOTH); + switch (clearValue) { + case CssConstants.LEFT: + element.setProperty(Property.CLEAR, ClearPropertyValue.LEFT); + break; + case CssConstants.RIGHT: + element.setProperty(Property.CLEAR, ClearPropertyValue.RIGHT); + break; + case CssConstants.BOTH: + element.setProperty(Property.CLEAR, ClearPropertyValue.BOTH); + break; } } } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/HyphenationApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/HyphenationApplierUtil.java index ca0d050fa..d2a0c206c 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/HyphenationApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/HyphenationApplierUtil.java @@ -85,16 +85,21 @@ public static void applyHyphenation(Map cssProps, ProcessorConte if (value == null) { value = CssDefaults.getDefaultValue(CssConstants.HYPHENS); } - - if (CssConstants.NONE.equals(value)) { - element.setProperty(Property.HYPHENATION, null); - } else if (CssConstants.MANUAL.equals(value)) { - element.setProperty(Property.HYPHENATION, new HyphenationConfig(HYPHENATE_BEFORE, HYPHENATE_AFTER)); - } else if (CssConstants.AUTO.equals(value) && stylesContainer instanceof IElementNode) { - String lang = ((IElementNode)stylesContainer).getLang(); - if (lang != null && lang.length() > 0) { - element.setProperty(Property.HYPHENATION, new HyphenationConfig(lang.substring(0, 2), "", HYPHENATE_BEFORE, HYPHENATE_AFTER)); - } + switch (value) { + case CssConstants.NONE: + element.setProperty(Property.HYPHENATION, null); + break; + case CssConstants.MANUAL: + element.setProperty(Property.HYPHENATION, new HyphenationConfig(HYPHENATE_BEFORE, HYPHENATE_AFTER)); + break; + case CssConstants.AUTO: + if(stylesContainer instanceof IElementNode) { + String lang = ((IElementNode)stylesContainer).getLang(); + if (lang != null && !lang.isEmpty()) { + element.setProperty(Property.HYPHENATION, new HyphenationConfig(lang.substring(0, 2), "", HYPHENATE_BEFORE, HYPHENATE_AFTER)); + } + } + break; } } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/ListStyleApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/ListStyleApplierUtil.java index dbe2521d8..8f8d969cf 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/ListStyleApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/ListStyleApplierUtil.java @@ -188,43 +188,56 @@ public static void applyListStyleTypeProperty(IStylesContainer stylesContainer, float em = CssDimensionParsingUtils.parseAbsoluteLength(cssProps.get(CssConstants.FONT_SIZE)); String style = cssProps.get(CssConstants.LIST_STYLE_TYPE); - if (CssConstants.DISC.equals(style)) { - setDiscStyle(element, em); - } else if (CssConstants.CIRCLE.equals(style)) { - setCircleStyle(element, em); - } else if (CssConstants.SQUARE.equals(style)) { - setSquareStyle(element, em); - } else if (CssConstants.DECIMAL.equals(style)) { - setListSymbol(element, ListNumberingType.DECIMAL); - } else if (CssConstants.DECIMAL_LEADING_ZERO.equals(style)) { - setListSymbol(element, ListNumberingType.DECIMAL_LEADING_ZERO); - } else if (CssConstants.UPPER_ALPHA.equals(style) || CssConstants.UPPER_LATIN.equals(style)) { - setListSymbol(element, ListNumberingType.ENGLISH_UPPER); - } else if (CssConstants.LOWER_ALPHA.equals(style) || CssConstants.LOWER_LATIN.equals(style)) { - setListSymbol(element, ListNumberingType.ENGLISH_LOWER); - } else if (CssConstants.UPPER_ROMAN.equals(style)) { - setListSymbol(element, ListNumberingType.ROMAN_UPPER); - } else if (CssConstants.LOWER_ROMAN.equals(style)) { - setListSymbol(element, ListNumberingType.ROMAN_LOWER); - } else if (CssConstants.LOWER_GREEK.equals(style)) { - element.setProperty(Property.LIST_SYMBOL, new HtmlAlphabetSymbolFactory(GREEK_LOWERCASE)); - } else if (CssConstants.NONE.equals(style)) { - setListSymbol(element, new Text("")); - } else { - if (style != null) { + switch (style) { + case CssConstants.DISC: + setDiscStyle(element, em); + break; + case CssConstants.CIRCLE: + setCircleStyle(element, em); + break; + case CssConstants.SQUARE: + setSquareStyle(element, em); + break; + case CssConstants.DECIMAL: + setListSymbol(element, ListNumberingType.DECIMAL); + break; + case CssConstants.DECIMAL_LEADING_ZERO: + setListSymbol(element, ListNumberingType.DECIMAL_LEADING_ZERO); + break; + case CssConstants.UPPER_ALPHA: + case CssConstants.UPPER_LATIN: + setListSymbol(element, ListNumberingType.ENGLISH_UPPER); + break; + case CssConstants.LOWER_ALPHA: + case CssConstants.LOWER_LATIN: + setListSymbol(element, ListNumberingType.ENGLISH_LOWER); + break; + case CssConstants.LOWER_ROMAN: + setListSymbol(element, ListNumberingType.ROMAN_LOWER); + break; + case CssConstants.UPPER_ROMAN: + setListSymbol(element, ListNumberingType.ROMAN_UPPER); + break; + case CssConstants.LOWER_GREEK: + element.setProperty(Property.LIST_SYMBOL, new HtmlAlphabetSymbolFactory(GREEK_LOWERCASE)); + break; + case CssConstants.NONE: + setListSymbol(element, new Text("")); + break; + default: Logger logger = LoggerFactory.getLogger(ListStyleApplierUtil.class); logger.error(MessageFormatUtil.format(Html2PdfLogMessageConstant.NOT_SUPPORTED_LIST_STYLE_TYPE, style)); - } - // Fallback style - if (stylesContainer instanceof IElementNode) { - String elementName = ((IElementNode)stylesContainer).name(); - if (TagConstants.UL.equals(elementName)) { - setDiscStyle(element, em); - } else if (TagConstants.OL.equals(elementName)) { - setListSymbol(element, ListNumberingType.DECIMAL); + // Fallback style + if (stylesContainer instanceof IElementNode) { + String elementName = ((IElementNode)stylesContainer).name(); + if (TagConstants.UL.equals(elementName)) { + setDiscStyle(element, em); + } else if (TagConstants.OL.equals(elementName)) { + setListSymbol(element, ListNumberingType.DECIMAL); + } } - } + break; } } @@ -334,8 +347,7 @@ public HtmlAlphabetSymbolFactory(char[] alphabet) { public IElement createSymbol(int index, IPropertyContainer list, IPropertyContainer listItem) { Object preValue = getListItemOrListProperty(listItem, list, Property.LIST_SYMBOL_PRE_TEXT); Object postValue = getListItemOrListProperty(listItem, list, Property.LIST_SYMBOL_POST_TEXT); - Text result = new Text(preValue + AlphabetNumbering.toAlphabetNumber(index, alphabet) + postValue); - return result; + return new Text(preValue + AlphabetNumbering.toAlphabetNumber(index, alphabet) + postValue); } /** diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java index 324853a69..2bf3521a0 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/MarginApplierUtil.java @@ -168,7 +168,6 @@ private static Float parseMarginValue(String marginValString, float em, float re logger.error(Html2PdfLogMessageConstant.MARGIN_VALUE_IN_PERCENT_NOT_SUPPORTED); return null; } - return marginUnitVal.getValue(); } else { return null; diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/OrphansWidowsApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/OrphansWidowsApplierUtil.java index fb20bd7e7..ddbdefea7 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/OrphansWidowsApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/OrphansWidowsApplierUtil.java @@ -58,7 +58,7 @@ public static void applyOrphansAndWidows(Map cssProps, IProperty Integer minWidows = CssDimensionParsingUtils.parseInteger(cssProps.get(CssConstants.WIDOWS)); if (minWidows != null && minWidows > 0) { element.setProperty(Property.WIDOWS_CONTROL, - new ParagraphWidowsControl(minWidows.intValue(), MAX_LINES_TO_MOVE, OVERFLOW_PARAGRAPH_ON_VIOLATION)); + new ParagraphWidowsControl(minWidows, MAX_LINES_TO_MOVE, OVERFLOW_PARAGRAPH_ON_VIOLATION)); } } @@ -66,7 +66,7 @@ public static void applyOrphansAndWidows(Map cssProps, IProperty Integer minOrphans = CssDimensionParsingUtils.parseInteger(cssProps.get(CssConstants.ORPHANS)); if (minOrphans != null && minOrphans > 0) { element.setProperty(Property.ORPHANS_CONTROL, - new ParagraphOrphansControl(minOrphans.intValue())); + new ParagraphOrphansControl(minOrphans)); } } } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/OutlineApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/OutlineApplierUtil.java index 0f049613e..614ebd405 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/OutlineApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/OutlineApplierUtil.java @@ -130,12 +130,16 @@ public static Border getCertainBorder(String outlineWidth, String outlineStyle, float outlineWidthValue; if (CssConstants.BORDER_WIDTH_VALUES.contains(outlineWidth)) { - if (CssConstants.THIN.equals(outlineWidth)) { - outlineWidth = "1px"; - } else if (CssConstants.MEDIUM.equals(outlineWidth)) { - outlineWidth = "2px"; - } else if (CssConstants.THICK.equals(outlineWidth)) { - outlineWidth = "3px"; + switch (outlineWidth) { + case CssConstants.THIN: + outlineWidth = "1px"; + break; + case CssConstants.MEDIUM: + outlineWidth = "2px"; + break; + case CssConstants.THICK: + outlineWidth = "3px"; + break; } } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/OverflowApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/OverflowApplierUtil.java index e8e737b38..307603b77 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/OverflowApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/OverflowApplierUtil.java @@ -70,17 +70,27 @@ public static void applyOverflow(Map cssProps, IPropertyContaine String overflow = null != cssProps && CssConstants.OVERFLOW_VALUES.contains(cssProps.get(CssConstants.OVERFLOW)) ? cssProps.get(CssConstants.OVERFLOW) : null; String overflowX = null != cssProps && CssConstants.OVERFLOW_VALUES.contains(cssProps.get(CssConstants.OVERFLOW_X)) ? cssProps.get(CssConstants.OVERFLOW_X) : overflow; - if (CssConstants.HIDDEN.equals(overflowX) || CssConstants.AUTO.equals(overflowX) || CssConstants.SCROLL.equals(overflowX)) { - element.setProperty(Property.OVERFLOW_X, OverflowPropertyValue.HIDDEN); - } else { - element.setProperty(Property.OVERFLOW_X, OverflowPropertyValue.VISIBLE); + switch (overflowX) { + case CssConstants.HIDDEN: + case CssConstants.SCROLL: + case CssConstants.AUTO: + element.setProperty(Property.OVERFLOW_X, OverflowPropertyValue.HIDDEN); + break; + default: + element.setProperty(Property.OVERFLOW_X, OverflowPropertyValue.VISIBLE); + break; } String overflowY = null != cssProps && CssConstants.OVERFLOW_VALUES.contains(cssProps.get(CssConstants.OVERFLOW_Y)) ? cssProps.get(CssConstants.OVERFLOW_Y) : overflow; - if (CssConstants.HIDDEN.equals(overflowY) || CssConstants.AUTO.equals(overflowY) || CssConstants.SCROLL.equals(overflowY)) { - element.setProperty(Property.OVERFLOW_Y, OverflowPropertyValue.HIDDEN); - } else { - element.setProperty(Property.OVERFLOW_Y, OverflowPropertyValue.VISIBLE); + switch (overflowY) { + case CssConstants.HIDDEN: + case CssConstants.SCROLL: + case CssConstants.AUTO: + element.setProperty(Property.OVERFLOW_Y, OverflowPropertyValue.HIDDEN); + break; + default: + element.setProperty(Property.OVERFLOW_Y, OverflowPropertyValue.VISIBLE); + break; } } } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/PaddingApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/PaddingApplierUtil.java index 1f522ed65..5e244952c 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/PaddingApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/PaddingApplierUtil.java @@ -90,57 +90,26 @@ public static void applyPaddings(Map cssProps, ProcessorContext * @param baseValueVertical value used by default for vertical dimension */ public static void applyPaddings(Map cssProps, ProcessorContext context, IPropertyContainer element, float baseValueVertical, float baseValueHorizontal) { - String paddingTop = cssProps.get(CssConstants.PADDING_TOP); - String paddingBottom = cssProps.get(CssConstants.PADDING_BOTTOM); - String paddingLeft = cssProps.get(CssConstants.PADDING_LEFT); - String paddingRight = cssProps.get(CssConstants.PADDING_RIGHT); float em = CssDimensionParsingUtils.parseAbsoluteLength(cssProps.get(CssConstants.FONT_SIZE)); float rem = context.getCssContext().getRootFontSize(); - UnitValue paddingTopVal = CssDimensionParsingUtils.parseLengthValueToPt(paddingTop, em, rem); - UnitValue paddingBottomVal = CssDimensionParsingUtils.parseLengthValueToPt(paddingBottom, em, rem); - UnitValue paddingLeftVal = CssDimensionParsingUtils.parseLengthValueToPt(paddingLeft, em, rem); - UnitValue paddingRightVal = CssDimensionParsingUtils.parseLengthValueToPt(paddingRight, em, rem); - - if (paddingTopVal != null) { - if (paddingTopVal.isPointValue()) { - element.setProperty(Property.PADDING_TOP, paddingTopVal); - } else { - if (baseValueVertical != 0.0f) - element.setProperty(Property.PADDING_TOP, new UnitValue(UnitValue.POINT, baseValueVertical * paddingTopVal.getValue() * 0.01f)); - else - logger.error(Html2PdfLogMessageConstant.PADDING_VALUE_IN_PERCENT_NOT_SUPPORTED); - } - } - - if (paddingBottomVal != null) { - if (paddingBottomVal.isPointValue()) { - element.setProperty(Property.PADDING_BOTTOM, paddingBottomVal); - } else { - if (baseValueVertical != 0.0f) - element.setProperty(Property.PADDING_BOTTOM, new UnitValue(UnitValue.POINT, baseValueVertical * paddingBottomVal.getValue() * 0.01f)); - else - logger.error(Html2PdfLogMessageConstant.PADDING_VALUE_IN_PERCENT_NOT_SUPPORTED); - } - } - - if (paddingLeftVal != null) { - if (paddingLeftVal.isPointValue()) { - element.setProperty(Property.PADDING_LEFT, paddingLeftVal); - } else { - if (baseValueHorizontal != 0.0f) - element.setProperty(Property.PADDING_LEFT, new UnitValue(UnitValue.POINT, baseValueHorizontal * paddingLeftVal.getValue() * 0.01f)); - else - logger.error(Html2PdfLogMessageConstant.PADDING_VALUE_IN_PERCENT_NOT_SUPPORTED); - } - } + applyPaddings(cssProps, CssConstants.PADDING_TOP, em, rem, Property.PADDING_TOP, element, baseValueVertical); + applyPaddings(cssProps, CssConstants.PADDING_BOTTOM, em, rem, Property.PADDING_BOTTOM, element, baseValueVertical); + applyPaddings(cssProps, CssConstants.PADDING_LEFT, em, rem, Property.PADDING_LEFT, element, baseValueHorizontal); + applyPaddings(cssProps, CssConstants.PADDING_RIGHT, em, rem, Property.PADDING_RIGHT, element, baseValueHorizontal); + } - if (paddingRightVal != null) { - if (paddingRightVal.isPointValue()) { - element.setProperty(Property.PADDING_RIGHT, paddingRightVal); + private static void applyPaddings(Map cssProps, String cssConstants, + float em, float rem, int paddingProperty, + IPropertyContainer element, float baseValue) { + String paddingPropertyValue = cssProps.get(cssConstants); + UnitValue paddingVal = CssDimensionParsingUtils.parseLengthValueToPt(paddingPropertyValue, em, rem); + if (paddingVal != null) { + if (paddingVal.isPointValue()) { + element.setProperty(paddingProperty, paddingVal); } else { - if (baseValueHorizontal != 0.0f) - element.setProperty(Property.PADDING_RIGHT, new UnitValue(UnitValue.POINT, baseValueHorizontal * paddingRightVal.getValue() * 0.01f)); + if (baseValue != 0.0f) + element.setProperty(paddingProperty, new UnitValue(UnitValue.POINT, baseValue * paddingVal.getValue() * 0.01f)); else logger.error(Html2PdfLogMessageConstant.PADDING_VALUE_IN_PERCENT_NOT_SUPPORTED); } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/PageBreakApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/PageBreakApplierUtil.java index 103751734..692524ef4 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/PageBreakApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/PageBreakApplierUtil.java @@ -132,12 +132,16 @@ private static boolean isEligibleForBreakBeforeAfter(ITagWorker parentTagWorker, */ private static HtmlPageBreak createHtmlPageBreak(String pageBreakVal) { HtmlPageBreak pageBreak = null; - if (CssConstants.ALWAYS.equals(pageBreakVal)) { - pageBreak = new HtmlPageBreak(HtmlPageBreakType.ALWAYS); - } else if (CssConstants.LEFT.equals(pageBreakVal)) { - pageBreak = new HtmlPageBreak(HtmlPageBreakType.LEFT); - } else if (CssConstants.RIGHT.equals(pageBreakVal)) { - pageBreak = new HtmlPageBreak(HtmlPageBreakType.RIGHT); + switch (pageBreakVal) { + case CssConstants.ALWAYS: + pageBreak = new HtmlPageBreak(HtmlPageBreakType.ALWAYS); + break; + case CssConstants.LEFT: + pageBreak = new HtmlPageBreak(HtmlPageBreakType.LEFT); + break; + case CssConstants.RIGHT: + pageBreak = new HtmlPageBreak(HtmlPageBreakType.RIGHT); + break; } return pageBreak; } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/PositionApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/PositionApplierUtil.java index c242cedf6..590ff4368 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/PositionApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/PositionApplierUtil.java @@ -81,18 +81,22 @@ private PositionApplierUtil() { */ public static void applyPosition(Map cssProps, ProcessorContext context, IPropertyContainer element) { String position = cssProps.get(CssConstants.POSITION); - if (CssConstants.ABSOLUTE.equals(position)) { - element.setProperty(Property.POSITION, LayoutPosition.ABSOLUTE); - applyLeftRightTopBottom(cssProps, context, element, position); - } else if (CssConstants.RELATIVE.equals(position)) { - element.setProperty(Property.POSITION, LayoutPosition.RELATIVE); - applyLeftRightTopBottom(cssProps, context, element, position); - } else if (CssConstants.FIXED.equals(position)) { + switch (position) { + case CssConstants.ABSOLUTE: + element.setProperty(Property.POSITION, LayoutPosition.ABSOLUTE); + applyLeftRightTopBottom(cssProps, context, element, position); + break; + case CssConstants.RELATIVE: + element.setProperty(Property.POSITION, LayoutPosition.RELATIVE); + applyLeftRightTopBottom(cssProps, context, element, position); + break; + case CssConstants.FIXED: // element.setProperty(Property.POSITION, LayoutPosition.FIXED); // float em = CssUtils.parseAbsoluteLength(cssProps.get(CommonCssConstants.FONT_SIZE)); // applyLeftProperty(cssProps, element, em, Property.X); // applyTopProperty(cssProps, element, em, Property.Y); - // TODO DEVSIX-4104 support "fixed" value of position property + // TODO DEVSIX-4104 support "fixed" value of position property + break; } } @@ -135,16 +139,7 @@ private static void applyLeftRightTopBottom(Map cssProps, Proces * @param layoutPropertyMapping the layout property mapping */ private static void applyLeftProperty(Map cssProps, IPropertyContainer element, float em, float rem, int layoutPropertyMapping) { - String left = cssProps.get(CssConstants.LEFT); - UnitValue leftVal = CssDimensionParsingUtils.parseLengthValueToPt(left, em, rem); - if (leftVal != null) { - if (leftVal.isPointValue()) { - element.setProperty(layoutPropertyMapping, leftVal.getValue()); - } else { - logger.error(MessageFormatUtil.format( - Html2PdfLogMessageConstant.CSS_PROPERTY_IN_PERCENTS_NOT_SUPPORTED, CommonCssConstants.LEFT)); - } - } + applyProperty(cssProps, element, em, rem, layoutPropertyMapping, CssConstants.LEFT, CommonCssConstants.LEFT); } /** @@ -157,16 +152,7 @@ private static void applyLeftProperty(Map cssProps, IPropertyCon * @param layoutPropertyMapping the layout property mapping */ private static void applyRightProperty(Map cssProps, IPropertyContainer element, float em, float rem, int layoutPropertyMapping) { - String right = cssProps.get(CssConstants.RIGHT); - UnitValue rightVal = CssDimensionParsingUtils.parseLengthValueToPt(right, em, rem); - if (rightVal != null) { - if (rightVal.isPointValue()) { - element.setProperty(layoutPropertyMapping, rightVal.getValue()); - } else { - logger.error(MessageFormatUtil.format( - Html2PdfLogMessageConstant.CSS_PROPERTY_IN_PERCENTS_NOT_SUPPORTED, CommonCssConstants.RIGHT)); - } - } + applyProperty(cssProps, element, em, rem, layoutPropertyMapping, CssConstants.RIGHT, CommonCssConstants.RIGHT); } /** @@ -179,16 +165,7 @@ private static void applyRightProperty(Map cssProps, IPropertyCo * @param layoutPropertyMapping the layout property mapping */ private static void applyTopProperty(Map cssProps, IPropertyContainer element, float em, float rem, int layoutPropertyMapping) { - String top = cssProps.get(CssConstants.TOP); - UnitValue topVal = CssDimensionParsingUtils.parseLengthValueToPt(top, em, rem); - if (topVal != null) { - if (topVal.isPointValue()) { - element.setProperty(layoutPropertyMapping, topVal.getValue()); - } else { - logger.error(MessageFormatUtil.format( - Html2PdfLogMessageConstant.CSS_PROPERTY_IN_PERCENTS_NOT_SUPPORTED, CommonCssConstants.TOP)); - } - } + applyProperty(cssProps, element, em, rem, layoutPropertyMapping, CssConstants.TOP, CommonCssConstants.TOP); } /** @@ -201,14 +178,19 @@ private static void applyTopProperty(Map cssProps, IPropertyCont * @param layoutPropertyMapping the layout property mapping */ private static void applyBottomProperty(Map cssProps, IPropertyContainer element, float em, float rem, int layoutPropertyMapping) { - String bottom = cssProps.get(CssConstants.BOTTOM); - UnitValue bottomVal = CssDimensionParsingUtils.parseLengthValueToPt(bottom, em, rem); - if (bottomVal != null) { - if (bottomVal.isPointValue()) { - element.setProperty(layoutPropertyMapping, bottomVal.getValue()); + applyProperty(cssProps, element, em, rem, layoutPropertyMapping, CssConstants.BOTTOM, CommonCssConstants.BOTTOM); + } + + private static void applyProperty(Map cssProps, IPropertyContainer element, float em, float rem, + int layoutPropertyMapping, String cssConstant, String commonCssConstant) { + String value = cssProps.get(cssConstant); + UnitValue val = CssDimensionParsingUtils.parseLengthValueToPt(value, em, rem); + if (val != null) { + if (val.isPointValue()) { + element.setProperty(layoutPropertyMapping, val.getValue()); } else { logger.error(MessageFormatUtil.format( - Html2PdfLogMessageConstant.CSS_PROPERTY_IN_PERCENTS_NOT_SUPPORTED, CommonCssConstants.BOTTOM)); + Html2PdfLogMessageConstant.CSS_PROPERTY_IN_PERCENTS_NOT_SUPPORTED, commonCssConstant)); } } } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/SupportedColColgroupPropertiesUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/SupportedColColgroupPropertiesUtil.java index e234988ab..455c46e37 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/SupportedColColgroupPropertiesUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/SupportedColColgroupPropertiesUtil.java @@ -134,6 +134,6 @@ private static Map getFilteredMap(Map map, Set 0 ? result : null; + return !result.isEmpty() ? result : null; } } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/TransformationApplierUtil.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/TransformationApplierUtil.java index 7e09d3c7d..b12159aae 100644 --- a/src/main/java/com/itextpdf/html2pdf/css/apply/util/TransformationApplierUtil.java +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/TransformationApplierUtil.java @@ -51,6 +51,7 @@ This file is part of the iText (R) project. import com.itextpdf.styledxmlparser.css.util.CssDimensionParsingUtils; import java.util.Map; +import java.util.Objects; import static java.lang.Math.toRadians; import static java.lang.Math.cos; @@ -73,11 +74,10 @@ private TransformationApplierUtil() { * @param element the element */ public static void applyTransformation(Map cssProps, ProcessorContext context, IPropertyContainer element) { - String transformationFunction; - if (cssProps.get(CssConstants.TRANSFORM) != null) - transformationFunction = cssProps.get(CssConstants.TRANSFORM).toLowerCase(); - else + if(Objects.isNull(cssProps.get(CssConstants.TRANSFORM))) { return; + } + String transformationFunction = cssProps.get(CssConstants.TRANSFORM).toLowerCase(); String[] components = transformationFunction.split("\\)"); Transform multipleFunction = new Transform(components.length); for (String component : components) { @@ -226,7 +226,7 @@ private static Transform.SingleTransform getSingleTransform(float a, float b, fl * * @param floats the transformation matrix (flattened) as array */ - private static Transform.SingleTransform getSingleTransform(float floats[]) { + private static Transform.SingleTransform getSingleTransform(float[] floats) { return new Transform.SingleTransform(floats[0], floats[1], floats[2], floats[3], new UnitValue(UnitValue.POINT, floats[4]), new UnitValue(UnitValue.POINT, floats[5])); } diff --git a/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/CssCounterManagerOperation.java b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/CssCounterManagerOperation.java new file mode 100644 index 000000000..5e127823b --- /dev/null +++ b/src/main/java/com/itextpdf/html2pdf/css/apply/util/enums/CssCounterManagerOperation.java @@ -0,0 +1,5 @@ +package com.itextpdf.html2pdf.css.apply.util.enums; + +public enum CssCounterManagerOperation { + RESET, INCREMENT +}