Skip to content

Commit f065c06

Browse files
committed
Support column-rule-width, column-rule-style and column-rule-color
DEVSIX-7562
1 parent 3995ccd commit f065c06

File tree

51 files changed

+362
-15
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+362
-15
lines changed

src/main/java/com/itextpdf/html2pdf/attach/impl/tags/TdTagWorker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ This file is part of the iText (R) project.
2727
import com.itextpdf.html2pdf.attach.util.AccessiblePropHelper;
2828
import com.itextpdf.html2pdf.attach.util.WaitingInlineElementsHelper;
2929
import com.itextpdf.html2pdf.css.CssConstants;
30-
import com.itextpdf.html2pdf.css.apply.impl.ColumnCssApplierUtil;
30+
import com.itextpdf.html2pdf.css.apply.impl.MultiColumnCssApplierUtil;
3131
import com.itextpdf.html2pdf.html.AttributeConstants;
3232
import com.itextpdf.layout.IPropertyContainer;
3333
import com.itextpdf.layout.element.Cell;
@@ -91,7 +91,7 @@ public TdTagWorker(IElementNode element, ProcessorContext context) {
9191
childOfMulticolContainer = new Div();
9292
multicolContainer.add(childOfMulticolContainer);
9393
// TODO DEVSIX-7564, DEVSIX-7562 apply other multicol properties
94-
ColumnCssApplierUtil.applyColumnCount(styles, context, multicolContainer);
94+
MultiColumnCssApplierUtil.applyMultiCol(styles, context, multicolContainer);
9595
cell.add(multicolContainer);
9696
}
9797

src/main/java/com/itextpdf/html2pdf/css/CssConstants.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ public class CssConstants extends CommonCssConstants {
5353
/** The Constant COUNTER_RESET. */
5454
public static final String COUNTER_RESET = "counter-reset";
5555

56+
/** The Constant COLUMN_RULE_WIDTH. */
57+
public static final String COLUMN_RULE_WIDTH = "column-rule-width";
58+
59+
/** The Constant COLUMN_RULE_STYLE. */
60+
public static final String COLUMN_RULE_STYLE = "column-rule-style";
61+
62+
/** The Constant COLUMN_RULE_COLOR. */
63+
public static final String COLUMN_RULE_COLOR = "column-rule-color";
64+
5665
/** The Constant DISPLAY. */
5766
public static final String DISPLAY = "display";
5867

src/main/java/com/itextpdf/html2pdf/css/apply/impl/BlockCssApplier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void apply(ProcessorContext context, IStylesContainer stylesContainer, IT
8080
OutlineApplierUtil.applyOutlines(cssProps, context, container);
8181
OrphansWidowsApplierUtil.applyOrphansAndWidows(cssProps, container);
8282
VerticalAlignmentApplierUtil.applyVerticalAlignmentForBlocks(cssProps, container, isInlineItem(tagWorker));
83-
ColumnCssApplierUtil.applyColumnCount(cssProps, context, container);
83+
MultiColumnCssApplierUtil.applyMultiCol(cssProps, context, container);
8484
if (isFlexItem(stylesContainer)) {
8585
FlexApplierUtil.applyFlexItemProperties(cssProps, context, container);
8686
} else {

src/main/java/com/itextpdf/html2pdf/css/apply/impl/DisplayFlexTagCssApplier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ public void apply(ProcessorContext context, IStylesContainer stylesContainer, IT
4646
container.deleteOwnProperty(Property.OVERFLOW_X);
4747
container.deleteOwnProperty(Property.OVERFLOW_Y);
4848
}
49-
ColumnCssApplierUtil.applyColumnCount(stylesContainer.getStyles(), context, container);
49+
MultiColumnCssApplierUtil.applyMultiCol(stylesContainer.getStyles(), context, container);
5050
}
5151
}

src/main/java/com/itextpdf/html2pdf/css/apply/impl/ColumnCssApplierUtil.java renamed to src/main/java/com/itextpdf/html2pdf/css/apply/impl/MultiColumnCssApplierUtil.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ This file is part of the iText (R) project.
2424

2525
import com.itextpdf.html2pdf.attach.ProcessorContext;
2626
import com.itextpdf.html2pdf.css.CssConstants;
27+
import com.itextpdf.html2pdf.css.apply.util.BorderStyleApplierUtil;
2728
import com.itextpdf.layout.IPropertyContainer;
29+
import com.itextpdf.layout.borders.Border;
2830
import com.itextpdf.layout.properties.Property;
2931
import com.itextpdf.layout.properties.UnitValue;
3032
import com.itextpdf.styledxmlparser.css.CommonCssConstants;
@@ -35,18 +37,19 @@ This file is part of the iText (R) project.
3537
/**
3638
* Utility class to apply column-count values.
3739
*/
38-
public class ColumnCssApplierUtil {
39-
private ColumnCssApplierUtil() {
40+
public class MultiColumnCssApplierUtil {
41+
private MultiColumnCssApplierUtil() {
4042
}
4143

4244
/**
4345
* Apply column-count to an element.
4446
*
4547
* @param cssProps the CSS properties
4648
* @param context the Processor context
47-
* @param element the styles container
49+
* @param element the styles container
4850
*/
49-
public static void applyColumnCount(Map<String, String> cssProps, ProcessorContext context, IPropertyContainer element) {
51+
public static void applyMultiCol(Map<String, String> cssProps, ProcessorContext context,
52+
IPropertyContainer element) {
5053
Integer columnCount = CssDimensionParsingUtils.parseInteger(cssProps.get(CssConstants.COLUMN_COUNT));
5154
if (columnCount != null) {
5255
element.setProperty(Property.COLUMN_COUNT, columnCount);
@@ -55,24 +58,40 @@ public static void applyColumnCount(Map<String, String> cssProps, ProcessorConte
5558
final float emValue = CssDimensionParsingUtils.parseAbsoluteFontSize(cssProps.get(CssConstants.FONT_SIZE));
5659
final float remValue = context.getCssContext().getRootFontSize();
5760

58-
UnitValue width = CssDimensionParsingUtils.parseLengthValueToPt(cssProps.get(CssConstants.COLUMN_WIDTH), emValue, remValue);
61+
UnitValue width = CssDimensionParsingUtils.parseLengthValueToPt(cssProps.get(CssConstants.COLUMN_WIDTH),
62+
emValue, remValue);
5963
if (width != null) {
60-
element.setProperty(Property.COLUMN_WIDTH, width.getValue());
64+
element.setProperty(Property.COLUMN_WIDTH, width.getValue());
6165
}
6266

63-
UnitValue gap = CssDimensionParsingUtils.parseLengthValueToPt(cssProps.get(CssConstants.COLUMN_GAP), emValue, remValue);
67+
UnitValue gap = CssDimensionParsingUtils.parseLengthValueToPt(cssProps.get(CssConstants.COLUMN_GAP), emValue,
68+
remValue);
6469
if (gap != null) {
65-
element.setProperty(Property.COLUMN_GAP, gap.getValue());
70+
element.setProperty(Property.COLUMN_GAP, gap.getValue());
6671
}
6772

6873
//Set default colum-gap to 1em
6974
if (!element.hasProperty(Property.COLUMN_GAP)) {
70-
element.setProperty(Property.COLUMN_GAP, CssDimensionParsingUtils.parseRelativeValue("1em", emValue));
75+
element.setProperty(Property.COLUMN_GAP, CssDimensionParsingUtils.parseRelativeValue("1em", emValue));
7176
}
7277
if (!element.hasProperty(Property.COLUMN_COUNT) && !element.hasProperty(Property.COLUMN_WIDTH)
7378
&& (CommonCssConstants.AUTO.equals(cssProps.get(CssConstants.COLUMN_COUNT))
7479
|| CommonCssConstants.AUTO.equals(cssProps.get(CssConstants.COLUMN_WIDTH)))) {
7580
element.setProperty(Property.COLUMN_COUNT, 1);
7681
}
82+
83+
String cssPropsColumnRuleWidth = cssProps.get(CssConstants.COLUMN_RULE_WIDTH);
84+
Border borderFromCssProperties = BorderStyleApplierUtil.getCertainBorder(
85+
cssProps.get(CssConstants.COLUMN_RULE_WIDTH), cssProps.get(CssConstants.COLUMN_RULE_STYLE),
86+
getColumnGapColorOrDefault(cssProps), emValue, remValue);
87+
element.setProperty(Property.COLUMN_GAP_BORDER, borderFromCssProperties);
88+
}
89+
90+
private static String getColumnGapColorOrDefault(Map<String, String> styles) {
91+
String borderColor = styles.get(CssConstants.COLUMN_RULE_COLOR);
92+
if (borderColor == null || CommonCssConstants.CURRENTCOLOR.equals(borderColor)) {
93+
borderColor = styles.get(CommonCssConstants.COLOR);
94+
}
95+
return borderColor;
7796
}
7897
}

src/main/java/com/itextpdf/html2pdf/css/apply/impl/UlOlTagCssApplier.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ This file is part of the iText (R) project.
2828
import com.itextpdf.html2pdf.css.apply.ICssApplier;
2929
import com.itextpdf.html2pdf.css.apply.util.ListStyleApplierUtil;
3030
import com.itextpdf.layout.IPropertyContainer;
31-
import com.itextpdf.layout.element.MulticolContainer;
3231
import com.itextpdf.layout.element.List;
32+
import com.itextpdf.layout.element.MulticolContainer;
3333
import com.itextpdf.layout.properties.BaseDirection;
3434
import com.itextpdf.layout.properties.ListSymbolPosition;
3535
import com.itextpdf.layout.properties.Property;
@@ -64,7 +64,7 @@ public void apply(ProcessorContext context, IStylesContainer stylesContainer, IT
6464

6565
ListStyleApplierUtil.applyListStyleTypeProperty(stylesContainer, css, context, list);
6666
ListStyleApplierUtil.applyListStyleImageProperty(css, context, list);
67-
ColumnCssApplierUtil.applyColumnCount(css, context, list);
67+
MultiColumnCssApplierUtil.applyMultiCol(css, context, list);
6868

6969
super.apply(context, stylesContainer, tagWorker);
7070

src/test/java/com/itextpdf/html2pdf/css/multicol/ColumnRuleTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ This file is part of the iText (R) project.
2424

2525
import com.itextpdf.html2pdf.ConverterProperties;
2626
import com.itextpdf.html2pdf.ExtendedHtmlConversionITextTest;
27+
import com.itextpdf.test.annotations.LogMessage;
28+
import com.itextpdf.test.annotations.LogMessages;
2729
import com.itextpdf.test.annotations.type.IntegrationTest;
2830

2931
import java.io.IOException;
3032
import org.junit.BeforeClass;
3133
import org.junit.Test;
3234
import org.junit.experimental.categories.Category;
35+
import static com.itextpdf.html2pdf.logs.Html2PdfLogMessageConstant.INVALID_CSS_PROPERTY_DECLARATION;
3336

3437
@Category(IntegrationTest.class)
3538
public class ColumnRuleTest extends ExtendedHtmlConversionITextTest {
@@ -102,6 +105,9 @@ public void convertRuleWidthHugeColumnsTest() throws IOException, InterruptedExc
102105
}
103106

104107
@Test
108+
@LogMessages(messages = {
109+
@LogMessage(messageTemplate = INVALID_CSS_PROPERTY_DECLARATION, count = 2)
110+
})
105111
public void convertRuleWidthIncorrectValuesTest() throws IOException, InterruptedException {
106112
runTest("ruleWidthIncorrectValuesTest");
107113
}
@@ -117,6 +123,9 @@ public void convertRuleColorRgbTest() throws IOException, InterruptedException {
117123
}
118124

119125
@Test
126+
@LogMessages(messages = {
127+
@LogMessage(messageTemplate = INVALID_CSS_PROPERTY_DECLARATION, count = 5)
128+
})
120129
public void convertRuleColorHslaTest() throws IOException, InterruptedException {
121130
runTest("ruleColorHslaTest");
122131
}
@@ -131,6 +140,28 @@ public void convertRuleShorthandTest() throws IOException, InterruptedException
131140
runTest("ruleShorthandTest");
132141
}
133142

143+
144+
@Test
145+
public void basicWidthTest() throws IOException, InterruptedException {
146+
runTest("basicWidthTest");
147+
}
148+
149+
@Test
150+
public void thinMediumThickTest() throws IOException, InterruptedException {
151+
runTest("thinMediumThick");
152+
}
153+
154+
@Test
155+
public void basicColorTest() throws IOException, InterruptedException {
156+
runTest("basicColorTest");
157+
}
158+
159+
@Test
160+
public void basicStyleTest() throws IOException, InterruptedException {
161+
runTest("basicStyleTest");
162+
}
163+
164+
134165
private void runTest(String testName) throws IOException, InterruptedException {
135166
convertToPdfAndCompare(testName,
136167
SOURCE_FOLDER, DESTINATION_FOLDER, false,

src/test/java/com/itextpdf/html2pdf/css/w3c/css_multicol/MulticolRulePercent001Test.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ This file is part of the iText (R) project.
2323
package com.itextpdf.html2pdf.css.w3c.css_multicol;
2424

2525
import com.itextpdf.html2pdf.css.w3c.W3CCssTest;
26+
import com.itextpdf.test.annotations.LogMessage;
27+
import com.itextpdf.test.annotations.LogMessages;
2628

29+
import static com.itextpdf.html2pdf.logs.Html2PdfLogMessageConstant.INVALID_CSS_PROPERTY_DECLARATION;
30+
31+
@LogMessages(messages = {
32+
@LogMessage(messageTemplate = INVALID_CSS_PROPERTY_DECLARATION, count = 1)
33+
})
2734
public class MulticolRulePercent001Test extends W3CCssTest {
2835
@Override
2936
protected String getHtmlFileName() {
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head></head>
4+
<body>
5+
<h2>Basic column-gap test</h2>
6+
<br>
7+
<div style="column-count: 3; column-rule-width: 6px;column-rule-color: green; column-rule-style: solid;border: solid">
8+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
9+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
10+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
11+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
12+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
13+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
14+
est laborum.
15+
</div>
16+
<br>
17+
<div style="column-count: 3; column-rule-width: 6px;column-rule-color: currentColor; column-rule-style: solid;border: solid">
18+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
19+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
20+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
21+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
22+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
23+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
24+
est laborum.
25+
</div>
26+
<br>
27+
<div style="column-count: 3; column-rule-width: 30px;column-rule-color: rgb(20,22,200); column-rule-style: solid;border: solid">
28+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
29+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
30+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
31+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
32+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
33+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
34+
est laborum.
35+
</div>
36+
37+
<br>
38+
<div style="column-count: 3; column-rule-width: 1em;column-rule-color:#00b0f0; column-rule-style: solid;border: solid">
39+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
40+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
41+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
42+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
43+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
44+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
45+
est laborum.
46+
</div>
47+
<br>
48+
<div style="column-count: 3; column-rule-width: 2em; column-rule-style: solid;border: solid">
49+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
50+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
51+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
52+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
53+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
54+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
55+
est laborum.
56+
</div>
57+
58+
<div style="column-count: 3; column-rule-width: 500px;column-rule-style: solid;column-rule-color: transparent; border: solid">
59+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
60+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
61+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
62+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
63+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
64+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
65+
est laborum.
66+
</div>
67+
68+
69+
<div style="column-count: 3; column-rule-width: 500px;column-rule-style: solid;column-rule-color: yellow; border: solid">
70+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
71+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
72+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
73+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
74+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
75+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
76+
est laborum.
77+
</div>
78+
<!--
79+
80+
-->
81+
</body>
82+
</html>

0 commit comments

Comments
 (0)