Skip to content

Commit 026a004

Browse files
author
Eugene Bochilo
committed
Introduce way to pass MetaInfo to forms module
DEVSIX-6328
1 parent 4d9f46d commit 026a004

File tree

8 files changed

+150
-40
lines changed

8 files changed

+150
-40
lines changed

src/main/java/com/itextpdf/html2pdf/attach/impl/layout/form/renderer/AbstractFormFieldRenderer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ This file is part of the iText (R) project.
6060
import com.itextpdf.layout.renderer.BlockRenderer;
6161
import com.itextpdf.layout.renderer.DrawContext;
6262
import com.itextpdf.layout.renderer.IRenderer;
63+
import com.itextpdf.layout.renderer.MetaInfoContainer;
6364
import com.itextpdf.layout.tagging.IAccessibleElement;
6465

6566
import java.util.List;
@@ -263,6 +264,10 @@ protected void writeAcroFormFieldLangAttribute(PdfDocument pdfDoc) {
263264
}
264265
}
265266

267+
MetaInfoContainer getMetaInfo() {
268+
return this.<MetaInfoContainer>getProperty(Property.META_INFO);
269+
}
270+
266271
private void processLangAttribute() {
267272
IPropertyContainer propertyContainer = flatRenderer.getModelElement();
268273
if (propertyContainer instanceof IAccessibleElement) {

src/main/java/com/itextpdf/html2pdf/attach/impl/layout/form/renderer/ButtonRenderer.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,14 @@ This file is part of the iText (R) project.
4343
package com.itextpdf.html2pdf.attach.impl.layout.form.renderer;
4444

4545
import com.itextpdf.forms.PdfAcroForm;
46+
import com.itextpdf.forms.fields.FormsMetaInfoStaticContainer;
4647
import com.itextpdf.forms.fields.PdfButtonFormField;
4748
import com.itextpdf.forms.fields.PdfFormField;
4849
import com.itextpdf.html2pdf.attach.impl.layout.Html2PdfProperty;
4950
import com.itextpdf.html2pdf.attach.impl.layout.form.element.Button;
5051
import com.itextpdf.html2pdf.attach.impl.layout.form.element.IFormField;
52+
import com.itextpdf.kernel.colors.Color;
53+
import com.itextpdf.kernel.font.PdfFont;
5154
import com.itextpdf.kernel.geom.Rectangle;
5255
import com.itextpdf.kernel.pdf.PdfDocument;
5356
import com.itextpdf.kernel.pdf.PdfPage;
@@ -60,6 +63,7 @@ This file is part of the iText (R) project.
6063
import com.itextpdf.layout.renderer.BlockRenderer;
6164
import com.itextpdf.layout.renderer.DrawContext;
6265
import com.itextpdf.layout.renderer.IRenderer;
66+
import com.itextpdf.layout.renderer.MetaInfoContainer;
6367

6468
import java.util.List;
6569

@@ -88,19 +92,28 @@ public void draw(DrawContext drawContext) {
8892
Rectangle area = getOccupiedArea().getBBox().clone();
8993
applyMargins(area, false);
9094
PdfPage page = doc.getPage(occupiedArea.getPageNumber());
91-
PdfButtonFormField button = PdfFormField.createPushButton(doc, area, name, value, doc.getDefaultFont(), fontSize.getValue());
92-
button.getWidgets().get(0).setHighlightMode(PdfAnnotation.HIGHLIGHT_NONE);
93-
button.setBorderWidth(0);
94-
button.setBackgroundColor(null);
95-
TransparentColor color = getPropertyAsTransparentColor(Property.FONT_COLOR);
96-
if (color != null) {
97-
button.setColor(color.getColor());
98-
}
99-
PdfAcroForm forms = PdfAcroForm.getAcroForm(doc, true);
100-
//Add fields only if it isn't already added. This can happen on split.
101-
if (forms.getField(name) == null) {
102-
forms.addField(button, page);
103-
}
95+
96+
final TransparentColor transparentColor = getPropertyAsTransparentColor(Property.FONT_COLOR);
97+
final Color color = transparentColor == null ? null : transparentColor.getColor();
98+
final float fontSizeValue = fontSize.getValue();
99+
final PdfFont font = doc.getDefaultFont();
100+
101+
FormsMetaInfoStaticContainer.useMetaInfoDuringTheAction(
102+
this.<MetaInfoContainer>getProperty(Property.META_INFO), () -> {
103+
final PdfButtonFormField button =
104+
PdfFormField.createPushButton(doc, area, name, value, font, fontSizeValue);
105+
button.getWidgets().get(0).setHighlightMode(PdfAnnotation.HIGHLIGHT_NONE);
106+
button.setBorderWidth(0);
107+
button.setBackgroundColor(null);
108+
if (color != null) {
109+
button.setColor(color);
110+
}
111+
PdfAcroForm forms = PdfAcroForm.getAcroForm(doc, true);
112+
//Add fields only if it isn't already added. This can happen on split.
113+
if (forms.getField(name) == null) {
114+
forms.addField(button, page);
115+
}
116+
});
104117

105118
if (doc.isTagged()) {
106119
TagTreePointer formParentPointer = doc.getTagStructureContext().getAutoTaggingPointer();

src/main/java/com/itextpdf/html2pdf/attach/impl/layout/form/renderer/InputButtonRenderer.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,15 @@ This file is part of the iText (R) project.
4343
package com.itextpdf.html2pdf.attach.impl.layout.form.renderer;
4444

4545
import com.itextpdf.forms.PdfAcroForm;
46+
import com.itextpdf.forms.fields.FormsMetaInfoStaticContainer;
4647
import com.itextpdf.forms.fields.PdfButtonFormField;
4748
import com.itextpdf.forms.fields.PdfFormField;
4849
import com.itextpdf.html2pdf.logs.Html2PdfLogMessageConstant;
4950
import com.itextpdf.html2pdf.attach.impl.layout.Html2PdfProperty;
5051
import com.itextpdf.html2pdf.attach.impl.layout.form.element.InputButton;
5152
import com.itextpdf.commons.utils.MessageFormatUtil;
5253
import com.itextpdf.io.logs.IoLogMessageConstant;
54+
import com.itextpdf.kernel.colors.Color;
5355
import com.itextpdf.kernel.geom.Rectangle;
5456
import com.itextpdf.kernel.pdf.PdfDocument;
5557
import com.itextpdf.kernel.pdf.PdfPage;
@@ -145,13 +147,20 @@ protected void applyAcroField(DrawContext drawContext) {
145147
Rectangle area = flatRenderer.getOccupiedArea().getBBox().clone();
146148
applyPaddings(area, true);
147149
PdfPage page = doc.getPage(occupiedArea.getPageNumber());
148-
PdfButtonFormField button = PdfFormField.createPushButton(doc, area, name, value, font, fontSize.getValue());
150+
149151
Background background = this.<Background>getProperty(Property.BACKGROUND);
150-
if (background != null && background.getColor() != null) {
151-
button.setBackgroundColor(background.getColor());
152-
}
153-
applyDefaultFieldProperties(button);
154-
PdfAcroForm.getAcroForm(doc, true).addField(button, page);
152+
final Color backgroundColor = background == null ? null : background.getColor();
153+
final float fontSizeValue = fontSize.getValue();
154+
155+
FormsMetaInfoStaticContainer.useMetaInfoDuringTheAction(getMetaInfo(), () -> {
156+
final PdfButtonFormField button =
157+
PdfFormField.createPushButton(doc, area, name, value, font, fontSizeValue);
158+
if (backgroundColor != null) {
159+
button.setBackgroundColor(backgroundColor);
160+
}
161+
applyDefaultFieldProperties(button);
162+
PdfAcroForm.getAcroForm(doc, true).addField(button, page);
163+
});
155164

156165
writeAcroFormFieldLangAttribute(doc);
157166
}

src/main/java/com/itextpdf/html2pdf/attach/impl/layout/form/renderer/InputFieldRenderer.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ This file is part of the iText (R) project.
4343
package com.itextpdf.html2pdf.attach.impl.layout.form.renderer;
4444

4545
import com.itextpdf.forms.PdfAcroForm;
46+
import com.itextpdf.forms.fields.FormsMetaInfoStaticContainer;
4647
import com.itextpdf.forms.fields.PdfFormField;
4748
import com.itextpdf.html2pdf.logs.Html2PdfLogMessageConstant;
4849
import com.itextpdf.html2pdf.attach.impl.layout.Html2PdfProperty;
@@ -159,29 +160,30 @@ protected IRenderer createFlatRenderer() {
159160
@Override
160161
protected void applyAcroField(DrawContext drawContext) {
161162
font.setSubset(false);
162-
String value = getDefaultValue();
163+
boolean password = isPassword();
164+
final String value = password ? "" : getDefaultValue();
163165
String name = getModelId();
164166
UnitValue fontSize = (UnitValue) this.getPropertyAsUnitValue(Property.FONT_SIZE);
165167
if (!fontSize.isPointValue()) {
166168
Logger logger = LoggerFactory.getLogger(InputFieldRenderer.class);
167169
logger.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
168170
Property.FONT_SIZE));
169171
}
170-
PdfDocument doc = drawContext.getDocument();
171-
Rectangle area = flatRenderer.getOccupiedArea().getBBox().clone();
172-
PdfPage page = doc.getPage(occupiedArea.getPageNumber());
173-
boolean password = isPassword();
174-
if (password) {
175-
value = "";
176-
}
177-
PdfFormField inputField = PdfFormField.createText(doc, area, name, value, font, fontSize.getValue());
178-
if (password) {
179-
inputField.setFieldFlag(PdfFormField.FF_PASSWORD, true);
180-
} else {
181-
inputField.setDefaultValue(new PdfString(value));
182-
}
183-
applyDefaultFieldProperties(inputField);
184-
PdfAcroForm.getAcroForm(doc, true).addField(inputField, page);
172+
final PdfDocument doc = drawContext.getDocument();
173+
final Rectangle area = flatRenderer.getOccupiedArea().getBBox().clone();
174+
final PdfPage page = doc.getPage(occupiedArea.getPageNumber());
175+
final float fontSizeValue = fontSize.getValue();
176+
177+
FormsMetaInfoStaticContainer.useMetaInfoDuringTheAction(getMetaInfo(), () -> {
178+
final PdfFormField inputField = PdfFormField.createText(doc, area, name, value, font, fontSizeValue);
179+
if (password) {
180+
inputField.setFieldFlag(PdfFormField.FF_PASSWORD, true);
181+
} else {
182+
inputField.setDefaultValue(new PdfString(value));
183+
}
184+
applyDefaultFieldProperties(inputField);
185+
PdfAcroForm.getAcroForm(doc, true).addField(inputField, page);
186+
});
185187

186188
writeAcroFormFieldLangAttribute(doc);
187189
}

src/main/java/com/itextpdf/html2pdf/attach/impl/layout/form/renderer/TextAreaRenderer.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ This file is part of the iText (R) project.
4343
package com.itextpdf.html2pdf.attach.impl.layout.form.renderer;
4444

4545
import com.itextpdf.forms.PdfAcroForm;
46+
import com.itextpdf.forms.fields.FormsMetaInfoStaticContainer;
4647
import com.itextpdf.forms.fields.PdfFormField;
4748
import com.itextpdf.html2pdf.logs.Html2PdfLogMessageConstant;
4849
import com.itextpdf.html2pdf.attach.impl.layout.Html2PdfProperty;
@@ -176,11 +177,16 @@ protected void applyAcroField(DrawContext drawContext) {
176177
PdfDocument doc = drawContext.getDocument();
177178
Rectangle area = flatRenderer.getOccupiedArea().getBBox().clone();
178179
PdfPage page = doc.getPage(occupiedArea.getPageNumber());
179-
PdfFormField inputField = PdfFormField.createText(doc, area, name, value, font, fontSize.getValue());
180-
inputField.setFieldFlag(PdfFormField.FF_MULTILINE, true);
181-
inputField.setDefaultValue(new PdfString(getDefaultValue()));
182-
applyDefaultFieldProperties(inputField);
183-
PdfAcroForm.getAcroForm(doc, true).addField(inputField, page);
180+
final float fontSizeValue = fontSize.getValue();
181+
final PdfString defaultValue = new PdfString(getDefaultValue());
182+
183+
FormsMetaInfoStaticContainer.useMetaInfoDuringTheAction(getMetaInfo(), () -> {
184+
final PdfFormField inputField = PdfFormField.createText(doc, area, name, value, font, fontSizeValue);
185+
inputField.setFieldFlag(PdfFormField.FF_MULTILINE, true);
186+
inputField.setDefaultValue(defaultValue);
187+
applyDefaultFieldProperties(inputField);
188+
PdfAcroForm.getAcroForm(doc, true).addField(inputField, page);
189+
});
184190

185191
writeAcroFormFieldLangAttribute(doc);
186192
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.itextpdf.html2pdf.attach.impl.layout.form.renderer;
2+
3+
import com.itextpdf.html2pdf.attach.impl.layout.Html2PdfProperty;
4+
import com.itextpdf.html2pdf.attach.impl.layout.form.element.Button;
5+
import com.itextpdf.html2pdf.attach.impl.layout.form.element.InputButton;
6+
import com.itextpdf.kernel.colors.Color;
7+
import com.itextpdf.kernel.colors.ColorConstants;
8+
import com.itextpdf.kernel.pdf.PdfDocument;
9+
import com.itextpdf.kernel.pdf.PdfWriter;
10+
import com.itextpdf.kernel.utils.CompareTool;
11+
import com.itextpdf.layout.Document;
12+
import com.itextpdf.layout.element.Paragraph;
13+
import com.itextpdf.layout.properties.Background;
14+
import com.itextpdf.layout.properties.Property;
15+
import com.itextpdf.layout.properties.TransparentColor;
16+
import com.itextpdf.test.ExtendedITextTest;
17+
import com.itextpdf.test.annotations.type.IntegrationTest;
18+
import org.junit.Assert;
19+
import org.junit.BeforeClass;
20+
import org.junit.Test;
21+
import org.junit.experimental.categories.Category;
22+
23+
import java.io.FileOutputStream;
24+
import java.io.IOException;
25+
26+
@Category(IntegrationTest.class)
27+
public class ButtonColorTest extends ExtendedITextTest {
28+
29+
public static final String SOURCE_FOLDER =
30+
"./src/test/resources/com/itextpdf/html2pdf/attach/impl/layout/form/renderer/ButtonColorTest/";
31+
public static final String DESTINATION_FOLDER =
32+
"./target/test/com/itextpdf/html2pdf/attach/impl/layout/form/renderer/ButtonColorTest/";
33+
34+
@BeforeClass
35+
public static void beforeClass() {
36+
createOrClearDestinationFolder(DESTINATION_FOLDER);
37+
}
38+
39+
@Test
40+
public void buttonsWithColorTest() throws IOException, InterruptedException {
41+
String outPdf = DESTINATION_FOLDER + "buttonsWithColor.pdf";
42+
String cmpPdf = SOURCE_FOLDER + "cmp_buttonsWithColor.pdf";
43+
44+
drawButtons(outPdf, cmpPdf, ColorConstants.RED);
45+
}
46+
47+
@Test
48+
public void buttonsWithoutColorTest() throws IOException, InterruptedException {
49+
String outPdf = DESTINATION_FOLDER + "buttonsWithoutColor.pdf";
50+
String cmpPdf = SOURCE_FOLDER + "cmp_buttonsWithoutColor.pdf";
51+
52+
drawButtons(outPdf, cmpPdf, null);
53+
}
54+
55+
private static void drawButtons(String outPdf, String cmpPdf, Color color) throws IOException, InterruptedException {
56+
try (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new FileOutputStream(outPdf)));
57+
Document document = new Document(pdfDocument)) {
58+
59+
Button button = new Button("button");
60+
button.add(new Paragraph("button child"));
61+
InputButton inputButton = new InputButton("input button");
62+
button.setProperty(Html2PdfProperty.FORM_FIELD_FLATTEN, false);
63+
inputButton.setProperty(Html2PdfProperty.FORM_FIELD_FLATTEN, false);
64+
button.setProperty(Html2PdfProperty.FORM_FIELD_VALUE, "button value");
65+
inputButton.setProperty(Html2PdfProperty.FORM_FIELD_VALUE, "input button value");
66+
button.setProperty(Property.FONT_COLOR, color == null ? null : new TransparentColor(color));
67+
inputButton.setProperty(Property.BACKGROUND, color == null ? null : new Background(color));
68+
69+
document.add(button);
70+
document.add(inputButton);
71+
}
72+
73+
Assert.assertNull(new CompareTool().compareByContent(outPdf, cmpPdf, DESTINATION_FOLDER));
74+
}
75+
}

0 commit comments

Comments
 (0)