Как генерировать PDF, имеющий HTML-подобные возможности, используя Java - PullRequest
0 голосов
/ 01 апреля 2019

Мне нужно создать PDF с использованием некоторого API Java, который имеет такие возможности, как HTML. По сути, я хочу создать форму, которая может принимать данные от пользователей, выполнять некоторые основные проверки на стороне клиента, а также генерировать этот PDF-файл программно с использованием Java. Я также ищу многофункциональные HTML-подобные функции, такие как раскрытие, свертывание, гиперссылки, добавление раздела по нажатию кнопки и т. Д. Поэтому в основном я пытаюсь создать страницу, похожую на HTML, но в формате PDF.

Я пытался использовать itext, но смог сделать только несколько вещей и не смог добавить динамичности в PDF. Есть ли инструмент / API, который поддерживает это?

1 Ответ

3 голосов
/ 02 апреля 2019

PDF сам по себе позволяет встраивать (подмножество) javascript.

Этот встроенный код может быть связан с событиями документа (например, открытием документа) или определенными элементами формы (например, нажатием кнопки, изменением текста).в поле ввода текста).

Это страница их веб-сайта, озаглавленная « Создание интерактивного PDF-файла », посвященная добавлению элементов формы.

Книга ( iText в действии ) Бруно Лоуаги (первоначальный основатель iText) также подробно описан.Он даже показывает, как программировать калькулятор в документе PDF, стр. 232.

Я просто собираюсь скопировать и вставить соответствующий раздел здесь.

Листинг 7.29 Калькулятор

public void addTextField(PdfWriter writer, Rectangle rect, String name) {
    PdfFormField field = PdfFormField.createTextField(writer, false, false, 0);
     field.setFieldName(name);
     field.setWidget(rect, PdfAnnotation.HIGHLIGHT_NONE);
     field.setQuadding(PdfFormField.Q_RIGHT);
     field.setFieldFlags(PdfFormField.FF_READ_ONLY);
     writer.addAnnotation(field);
}    

public void addPushButton(PdfWriter writer, Rectangle rect, String btn, String script) {
    float w = rect.getWidth();
    float h = rect.getHeight();
    PdfFormField pushbutton = PdfFormField.createPushButton(writer);
    pushbutton.setFieldName("btn_" + btn);
    pushbutton.setWidget(rect, PdfAnnotation.HIGHLIGHT_PUSH);
    PdfContentByte cb = writer.getDirectContent();
    pushbutton.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, createAppearance(cb, btn, BaseColor.GRAY, w, h));
    pushbutton.setAppearance(PdfAnnotation.APPEARANCE_ROLLOVER, createAppearance(cb, btn, BaseColor.RED, w, h));
    pushbutton.setAppearance(PdfAnnotation.APPEARANCE_DOWN, createAppearance(cb, btn, BaseColor.BLUE, w, h));
    pushbutton.setAdditionalActions(PdfName.U, PdfAction.javaScript(script, writer));
    pushbutton.setAdditionalActions(PdfName.E, PdfAction.javaScript( "this.showMove('" + btn + "');", writer));
    pushbutton.setAdditionalActions(PdfName.X, PdfAction.javaScript( "this.showMove(' ');", writer));
    writer.addAnnotation(pushbutton);
}

public PdfAppearance createAppearance(PdfContentByte cb, String btn, BaseColor color, float w, float h) {
    PdfAppearance app = cb.createAppearance(w, h);
    app.setColorFill(color);
    app.rectangle(2, 2, w - 4, h - 4);
    app.fill();
    app.beginText();
    app.setColorFill(BaseColor.BLACK);
    app.setFontAndSize(bf, h / 2);
    app.showTextAligned(Element.ALIGN_CENTER, btn, w / 2, h / 4, 0);
    app.endText();
    return app;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...