В настоящее время iText 7 не позволяет легко / каким-либо образом установить цвет флажка, если он установлен, как это зафиксировано в исходном коде:
/**
* Performs the low-level drawing operations to draw a checkbox object.
*
* @param canvas the {@link PdfCanvas} of the page to draw on.
* @param width the width of the button
* @param height the width of the button
* @param fontSize the size of the font
* @param on the boolean value of the checkbox
*/
protected void drawCheckBox(PdfCanvas canvas, float width, float height, float fontSize, boolean on) {
if (!on) {
return;
}
if (checkType == TYPE_CROSS) {
DrawingUtil.drawCross(canvas, width, height, borderWidth);
return;
}
PdfFont ufont = getFont();
if (fontSize <= 0) {
fontSize = approximateFontSizeToFitBBox(ufont, new Rectangle(width, height), text);
}
// PdfFont gets all width in 1000 normalized units
canvas.
beginText().
setFontAndSize(ufont, fontSize).
resetFillColorRgb().
setTextMatrix((width - ufont.getWidth(text, fontSize)) / 2, (height - ufont.getAscent(text, fontSize)) / 2).
showText(text).
endText();
}
Есть ли вменяемый способ изменения флажка, установленногоцвет, о котором мы не знаем, без необходимости расширять класс PdfFormField и переопределять метод drawCheckBox (...) просто для замены вызова resetFillColorRgb () с setFillColor (ColorConstants.BLUE) ?
Проблема с этим подходом в нашем случае заключается в том, что нам также необходимо заменить существующий флажок в документе PDF, что означает, что мы должны скопировать всесвойства от этого флажка до вновь созданного флажка нашего подкласса PdfFormField.
Любая подсказка будет принята с благодарностью:)
РЕДАКТИРОВАТЬ: Вот временное решение доiText предоставляет API, или кто-то другой находит лучший способ взлома:
private static void overrideCheckboxCheckedColor(PdfDocument pdfDocument, PdfFormField pdfFormField, Color color) {
try {
// Get "Yes" state appearance object
PdfWidgetAnnotation pdfWidgetAnnotation = pdfFormField.getWidgets().get(0);
PdfDictionary normalAppearanceObject = pdfWidgetAnnotation.getNormalAppearanceObject();
PdfStream onStateObject = normalAppearanceObject.getAsStream(new PdfName("Yes"));
// Extract font size
ByteArrayOutputStream outputStream = (ByteArrayOutputStream) onStateObject.getOutputStream().getOutputStream();
String outputStreamContent = outputStream.toString();
Pattern fontSizePattern = Pattern.compile("(?s)^.*\\s+((\\d+\\.)?\\d+)\\s+Tf.*$");
Matcher fontSizeMatcher = fontSizePattern.matcher(outputStreamContent);
boolean fontSizeFound = fontSizeMatcher.find();
float fontSize = fontSizeFound ? Float.parseFloat(fontSizeMatcher.group(1)) : 10F;
// Get width, height, font & text
PdfFormXObject xObjectOn = (PdfFormXObject) PdfXObject.makeXObject(onStateObject);
float width = xObjectOn.getWidth();
float height = xObjectOn.getHeight();
PdfFont font = pdfFormField.getFont();
String text = "4";
// Override checked color
PdfCanvas canvasOn = new PdfCanvas(onStateObject, new PdfResources(), pdfDocument);
canvasOn.beginText()
.setFontAndSize(font, fontSize)
.setFillColor(color)
.setTextMatrix((width - font.getWidth(text, fontSize)) / 2, (height - font.getAscent(text, fontSize)) / 2)
.showText(text)
.endText();
} catch (Exception e) {
Message message = new FormattedMessage("Could not override '{}' field checked color", pdfFormField.getFieldName());
LOG.error(message, e);
}
}