Добавить интерактивный флажок в PDF, используя itext 7 - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь добавить флажок AcroField в PDF, который создается iText7 pdfHTML. По умолчанию это не работает, я видел, как кто-то предлагал использовать пользовательский тег работника, но я не мог заставить его работать. У кого-нибудь есть идеи, как это реализовать? Или пример?

1 Ответ

0 голосов
/ 15 января 2019

Я создал очень простой пример, чтобы показать вам, как можно создать пользовательский тег-работник и добавить акрополе к документу при обработке html-pdf.

Посмотрите на следующий фрагмент:

class CustomTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
    if (tag.name().equals("input")) {
        if (AttributeConstants.CHECKBOX.equals(tag.getAttribute(AttributeConstants.TYPE))) {
            return new AcroInputTagWorker(tag, context);
        }
    }
    return null;
}

Здесь я представил собственную фабрику рабочих тегов, которая будет создавать рабочие теги по умолчанию для всех тегов, кроме указанного мной (<input type="checkbox">).

Теперь давайте добавим акрополе к документу при обработке <input type="checkbox">:

class AcroInputTagWorker extends InputTagWorker {

public AcroInputTagWorker(IElementNode element, ProcessorContext context) {
    super(element, context);
    PdfAcroForm.getAcroForm(context.getPdfDocument(), true)
            .addField(PdfFormField.createCheckBox(context.getPdfDocument(), new Rectangle(100, 700, 30, 30), "checkbox", "Off"));
}

Вот и все. Результирующий PDF для очень простого HTML-файла (в основном, только одна строка: <input type="checkbox">) выглядит так:

enter image description here

Теперь давайте кратко обсудим, что можно улучшить:

1) вы можете проверить, установлен ли атрибут CHECKED, и учитывать его при настройке значения акрополя (в приведенном выше примере я просто установил его как «Выкл.»)

2) вам нужно создать разные значения имени акрополя (я только что использовал "флажок")

3) возможно, вы захотите визуализировать акрополе не в определенной позиции, предопределенной перед обработкой html в pdf. Вы можете позволить iText динамически определять свою позицию в зависимости от того, где находится тег input.

В этом случае решение будет более сложным. Вам нужно будет создать свой собственный элемент CheckBox (вероятно, расширенный с Paragraph) и визуализатор для него (возможно, расширенный с ParagraphRender). Затем вам нужно будет переопределить его метод layout (возможно, просто вызовите super.layout(), чтобы получить координаты абзаца и только затем добавить акрополе к документу). Это не легко, но это, безусловно, стоит попробовать! И если вы не добились успеха, вы всегда можете задать еще один вопрос:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...