Как переопределить черный цвет по умолчанию для флажка itext? - PullRequest
0 голосов
/ 10 декабря 2018

В настоящее время 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...