Я создал очень простой пример, чтобы показать вам, как можно создать пользовательский тег-работник и добавить акрополе к документу при обработке 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">
) выглядит так:
Теперь давайте кратко обсудим, что можно улучшить:
1) вы можете проверить, установлен ли атрибут CHECKED, и учитывать его при настройке значения акрополя (в приведенном выше примере я просто установил его как «Выкл.»)
2) вам нужно создать разные значения имени акрополя (я только что использовал "флажок")
3) возможно, вы захотите визуализировать акрополе не в определенной позиции, предопределенной перед обработкой html в pdf. Вы можете позволить iText динамически определять свою позицию в зависимости от того, где находится тег input
.
В этом случае решение будет более сложным. Вам нужно будет создать свой собственный элемент CheckBox (вероятно, расширенный с Paragraph
) и визуализатор для него (возможно, расширенный с ParagraphRender
). Затем вам нужно будет переопределить его метод layout
(возможно, просто вызовите super.layout()
, чтобы получить координаты абзаца и только затем добавить акрополе к документу). Это не легко, но это, безусловно, стоит попробовать! И если вы не добились успеха, вы всегда можете задать еще один вопрос:)