Skip to content

Commit 8d16d1d

Browse files
committed
Unify appearance generation for radio and check buttons
DEVSIX-2172
1 parent 0c65942 commit 8d16d1d

24 files changed

+153
-100
lines changed

forms/src/main/java/com/itextpdf/forms/fields/PdfFormField.java

Lines changed: 63 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -797,11 +797,7 @@ public static PdfFormField createRadioButton(PdfDocument doc, Rectangle rect, Pd
797797
} else {
798798
annot.setAppearanceState(new PdfName("Off"));
799799
}
800-
if (pdfAConformanceLevel != null && "1".equals(pdfAConformanceLevel.getPart())) {
801-
radio.drawPdfA1RadioAppearance(rect.getWidth(), rect.getHeight(), value);
802-
} else {
803-
radio.drawRadioAppearance(rect.getWidth(), rect.getHeight(), value);
804-
}
800+
radio.drawRadioAppearance(rect.getWidth(), rect.getHeight(), value);
805801

806802
radioGroup.addKid(radio);
807803
return radio;
@@ -922,27 +918,16 @@ public static PdfButtonFormField createCheckBox(PdfDocument doc, Rectangle rect,
922918
PdfWidgetAnnotation annot = new PdfWidgetAnnotation(rect);
923919
PdfButtonFormField check = new PdfButtonFormField(annot, doc);
924920
check.pdfAConformanceLevel = pdfAConformanceLevel;
925-
if (null != pdfAConformanceLevel) {
926-
annot.setFlag(PdfAnnotation.PRINT);
927-
}
928921
check.setCheckType(checkType);
929922
check.setFieldName(name);
930923
check.put(PdfName.V, new PdfName(value));
931924
annot.setAppearanceState(new PdfName(value));
932-
String pdfAVersion = pdfAConformanceLevel != null ? pdfAConformanceLevel.getPart() : "";
933-
switch (pdfAVersion) {
934-
case "1":
935-
check.drawPdfA1CheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value, checkType);
936-
break;
937-
case "2":
938-
check.drawPdfA2CheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value, checkType);
939-
break;
940-
case "3":
941-
check.drawPdfA2CheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value, checkType);
942-
break;
943-
default:
944-
check.drawCheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value);
945-
break;
925+
926+
if (pdfAConformanceLevel != null) {
927+
check.drawPdfA2CheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value, checkType);
928+
annot.setFlag(PdfAnnotation.PRINT);
929+
} else {
930+
check.drawCheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value);
946931
}
947932

948933
return check;
@@ -2125,11 +2110,7 @@ public boolean regenerateField() {
21252110
Rectangle rect = getRect(getPdfObject());
21262111
value = getRadioButtonValue(value);
21272112
if (rect != null && !"".equals(value)) {
2128-
if (pdfAConformanceLevel != null && "1".equals(pdfAConformanceLevel.getPart())) {
2129-
drawPdfA1RadioAppearance(rect.getWidth(), rect.getHeight(), value);
2130-
} else {
2131-
drawRadioAppearance(rect.getWidth(), rect.getHeight(), value);
2132-
}
2113+
drawRadioAppearance(rect.getWidth(), rect.getHeight(), value);
21332114
}
21342115
} else if (getKids() != null) {
21352116
for (PdfObject kid : getKids()) {
@@ -2149,29 +2130,18 @@ public boolean regenerateField() {
21492130
}
21502131
}
21512132
} else {
2152-
String onStateName = value;
2153-
if ("Off".equals(onStateName)) {
2154-
onStateName = "Yes";
2155-
}
21562133
Rectangle rect = getRect(getPdfObject());
21572134
setCheckType(checkType);
21582135

2159-
String pdfAVersion = pdfAConformanceLevel != null ? pdfAConformanceLevel.getPart() : "";
2160-
switch (pdfAVersion) {
2161-
case "1":
2162-
drawPdfA1CheckAppearance(rect.getWidth(), rect.getHeight(), value, checkType);
2163-
break;
2164-
case "2":
2165-
drawPdfA2CheckAppearance(rect.getWidth(), rect.getHeight(), onStateName, checkType);
2166-
break;
2167-
case "3":
2168-
drawPdfA2CheckAppearance(rect.getWidth(), rect.getHeight(), onStateName, checkType);
2169-
break;
2170-
default:
2171-
drawCheckAppearance(rect.getWidth(), rect.getHeight(), onStateName);
2172-
break;
2173-
}
21742136
PdfWidgetAnnotation widget = getWidgets().get(0);
2137+
2138+
if (pdfAConformanceLevel != null) {
2139+
drawPdfA2CheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value, checkType);
2140+
widget.setFlag(PdfAnnotation.PRINT);
2141+
} else {
2142+
drawCheckAppearance(rect.getWidth(), rect.getHeight(), "Off".equals(value) ? "Yes" : value);
2143+
}
2144+
21752145
if (widget.getNormalAppearanceObject() != null && widget.getNormalAppearanceObject().containsKey(new PdfName(value))) {
21762146
widget.setAppearanceState(new PdfName(value));
21772147
} else {
@@ -3075,7 +3045,9 @@ protected void drawRadioAppearance(float width, float height, String value) {
30753045
* @param width the width of the radio button to draw
30763046
* @param height the height of the radio button to draw
30773047
* @param value the value of the button
3048+
* @deprecated Please, use {@link #drawRadioAppearance(float, float, String)} instead.
30783049
*/
3050+
@Deprecated
30793051
protected void drawPdfA1RadioAppearance(float width, float height, String value) {
30803052
PdfStream stream = (PdfStream) new PdfStream().makeIndirect(getDocument());
30813053
PdfCanvas canvas = new PdfCanvas(stream, new PdfResources(), getDocument());
@@ -3120,54 +3092,65 @@ protected void drawRadioField(PdfCanvas canvas, float width, float height, boole
31203092
* @param onStateName the state of the form field that will be drawn
31213093
*/
31223094
protected void drawCheckAppearance(float width, float height, String onStateName) {
3095+
float fontSize = this.fontSize < 0 ? 0 : this.fontSize;
3096+
Rectangle rect = new Rectangle(0, 0, width, height);
3097+
31233098
PdfStream streamOn = (PdfStream) new PdfStream().makeIndirect(getDocument());
31243099
PdfCanvas canvasOn = new PdfCanvas(streamOn, new PdfResources(), getDocument());
3125-
Rectangle rect = new Rectangle(0, 0, width, height);
31263100
PdfFormXObject xObjectOn = new PdfFormXObject(rect);
3127-
PdfFormXObject xObjectOff = new PdfFormXObject(rect);
3128-
3129-
float fontSize = this.fontSize < 0 ? 0 : this.fontSize;
31303101
drawBorder(canvasOn, xObjectOn, width, height);
31313102
drawCheckBox(canvasOn, width, height, fontSize, true);
3103+
xObjectOn.getPdfObject().getOutputStream().writeBytes(streamOn.getBytes());
3104+
xObjectOn.getResources().addFont(getDocument(), getFont());
3105+
31323106

31333107
PdfStream streamOff = (PdfStream) new PdfStream().makeIndirect(getDocument());
31343108
PdfCanvas canvasOff = new PdfCanvas(streamOff, new PdfResources(), getDocument());
3109+
PdfFormXObject xObjectOff = new PdfFormXObject(rect);
31353110
drawBorder(canvasOff, xObjectOff, width, height);
31363111
drawCheckBox(canvasOff, width, height, fontSize, false);
3137-
3138-
PdfWidgetAnnotation widget = getWidgets().get(0);
3139-
3140-
xObjectOn.getPdfObject().getOutputStream().writeBytes(streamOn.getBytes());
3141-
xObjectOn.getResources().addFont(getDocument(), getFont());
3142-
setDefaultAppearance(generateDefaultAppearanceString(font, fontSize, color, xObjectOn.getResources()));
3143-
31443112
xObjectOff.getPdfObject().getOutputStream().writeBytes(streamOff.getBytes());
31453113
xObjectOff.getResources().addFont(getDocument(), getFont());
31463114

3115+
setDefaultAppearance(generateDefaultAppearanceString(font, fontSize, color, xObjectOn.getResources()));
3116+
31473117
PdfDictionary normalAppearance = new PdfDictionary();
31483118
normalAppearance.put(new PdfName(onStateName), xObjectOn.getPdfObject());
31493119
normalAppearance.put(new PdfName("Off"), xObjectOff.getPdfObject());
31503120

31513121
PdfDictionary mk = new PdfDictionary();
31523122
mk.put(PdfName.CA, new PdfString(text));
3123+
3124+
PdfWidgetAnnotation widget = getWidgets().get(0);
31533125
widget.getPdfObject().put(PdfName.MK, mk);
31543126
widget.setNormalAppearance(normalAppearance);
31553127
}
31563128

3157-
protected void drawPdfA1CheckAppearance(float width, float height, String selectedValue, int checkType) {
3158-
PdfStream stream = (PdfStream) new PdfStream().makeIndirect(getDocument());
3159-
PdfCanvas canvas = new PdfCanvas(stream, new PdfResources(), getDocument());
3129+
//Actually it's just PdfA check appearance. According to corrigendum there is no difference between them
3130+
protected void drawPdfA2CheckAppearance(float width, float height, String onStateName, int checkType) {
3131+
this.checkType = checkType;
31603132
Rectangle rect = new Rectangle(0, 0, width, height);
3161-
PdfFormXObject xObject = new PdfFormXObject(rect);
31623133

3163-
this.checkType = checkType;
3164-
drawBorder(canvas, xObject, width, height);
3165-
drawPdfACheckBox(canvas, width, height, !"Off".equals(selectedValue));
3134+
PdfStream streamOn = (PdfStream) new PdfStream().makeIndirect(getDocument());
3135+
PdfCanvas canvasOn = new PdfCanvas(streamOn, new PdfResources(), getDocument());
3136+
PdfFormXObject xObjectOn = new PdfFormXObject(rect);
3137+
xObjectOn.getResources();
31663138

3167-
xObject.getPdfObject().getOutputStream().writeBytes(stream.getBytes());
3139+
drawBorder(canvasOn, xObjectOn, width, height);
3140+
drawPdfACheckBox(canvasOn, width, height, true);
3141+
xObjectOn.getPdfObject().getOutputStream().writeBytes(streamOn.getBytes());
3142+
3143+
PdfStream streamOff = (PdfStream) new PdfStream().makeIndirect(getDocument());
3144+
PdfCanvas canvasOff = new PdfCanvas(streamOff, new PdfResources(), getDocument());
3145+
PdfFormXObject xObjectOff = new PdfFormXObject(rect);
3146+
xObjectOff.getResources();
3147+
3148+
drawBorder(canvasOff, xObjectOff, width, height);
3149+
xObjectOff.getPdfObject().getOutputStream().writeBytes(streamOff.getBytes());
31683150

31693151
PdfDictionary normalAppearance = new PdfDictionary();
3170-
normalAppearance.put(new PdfName(selectedValue), xObject.getPdfObject());
3152+
normalAppearance.put(new PdfName(onStateName), xObjectOn.getPdfObject());
3153+
normalAppearance.put(new PdfName("Off"), xObjectOff.getPdfObject());
31713154

31723155
PdfDictionary mk = new PdfDictionary();
31733156
mk.put(PdfName.CA, new PdfString(text));
@@ -3177,33 +3160,29 @@ protected void drawPdfA1CheckAppearance(float width, float height, String select
31773160
widget.setNormalAppearance(normalAppearance);
31783161
}
31793162

3180-
protected void drawPdfA2CheckAppearance(float width, float height, String onStateName, int checkType) {
3181-
PdfStream streamOn = (PdfStream) new PdfStream().makeIndirect(getDocument());
3182-
PdfCanvas canvasOn = new PdfCanvas(streamOn, new PdfResources(), getDocument());
3183-
PdfStream streamOff = (PdfStream) new PdfStream().makeIndirect(getDocument());
3184-
PdfCanvas canvasOff = new PdfCanvas(streamOff, new PdfResources(), getDocument());
3163+
/**
3164+
* @deprecated use {@link #drawPdfA2CheckAppearance(float, float, String, int)} instead.
3165+
*/
3166+
@Deprecated
3167+
protected void drawPdfA1CheckAppearance(float width, float height, String selectedValue, int checkType) {
3168+
PdfStream stream = (PdfStream) new PdfStream().makeIndirect(getDocument());
3169+
PdfCanvas canvas = new PdfCanvas(stream, new PdfResources(), getDocument());
31853170
Rectangle rect = new Rectangle(0, 0, width, height);
3186-
PdfFormXObject xObjectOn = new PdfFormXObject(rect);
3187-
PdfFormXObject xObjectOff = new PdfFormXObject(rect);
3171+
PdfFormXObject xObject = new PdfFormXObject(rect);
31883172

31893173
this.checkType = checkType;
3190-
drawBorder(canvasOn, xObjectOn, width, height);
3191-
drawPdfACheckBox(canvasOn, width, height, true);
3192-
drawBorder(canvasOff, xObjectOff, width, height);
3193-
3194-
PdfWidgetAnnotation widget = getWidgets().get(0);
3174+
drawBorder(canvas, xObject, width, height);
3175+
drawPdfACheckBox(canvas, width, height, !"Off".equals(selectedValue));
31953176

3196-
xObjectOn.getPdfObject().getOutputStream().writeBytes(streamOn.getBytes());
3197-
xObjectOff.getPdfObject().getOutputStream().writeBytes(streamOff.getBytes());
3198-
xObjectOn.getResources();
3199-
xObjectOff.getResources();
3177+
xObject.getPdfObject().getOutputStream().writeBytes(stream.getBytes());
32003178

32013179
PdfDictionary normalAppearance = new PdfDictionary();
3202-
normalAppearance.put(new PdfName(onStateName), xObjectOn.getPdfObject());
3203-
normalAppearance.put(new PdfName("Off"), xObjectOff.getPdfObject());
3180+
normalAppearance.put(new PdfName(selectedValue), xObject.getPdfObject());
32043181

32053182
PdfDictionary mk = new PdfDictionary();
32063183
mk.put(PdfName.CA, new PdfString(text));
3184+
3185+
PdfWidgetAnnotation widget = getWidgets().get(0);
32073186
widget.put(PdfName.MK, mk);
32083187
widget.setNormalAppearance(normalAppearance);
32093188
}

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfAConformanceLevel.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ public class PdfAConformanceLevel implements Serializable {
6565
public static final PdfAConformanceLevel PDF_A_3U = new PdfAConformanceLevel("3", "U");
6666
private static final long serialVersionUID = 1481878095812910587L;
6767

68-
private String conformance;
69-
private String part;
68+
private final String conformance;
69+
private final String part;
7070

7171
private PdfAConformanceLevel(String part, String conformance) {
7272
this.conformance = conformance;

0 commit comments

Comments
 (0)