如何使用 Java 生成具有 HTML 类似功能的 PDF

How to generate PDF having HTML like capabilities using Java

我需要使用一些 java API 创建 PDF,它具有 HTML 等功能。基本上,我想创建一个表单,它可以从用户那里获取输入,执行一些基本的客户端验证,还可以使用 Java 以编程方式生成此 PDF。我也在寻找丰富的 HTML 之类的功能,例如展开、折叠、超链接、在单击按钮时添加一个部分等。所以基本上我正在尝试创建一个 HTML 之类的页面,但在 PDF 中。

我尝试过使用 itext,但只能做少数事情,无法为 PDF 添加动态。有没有支持这个的tool/API?

PDF 本身允许您嵌入(的子集)javascript。

此嵌入式代码可以链接到文档事件(例如打开文档)或特定表单元素(例如单击按钮、更改文本输入字段中的文本)。

这是他们网站上名为“Making a PDF interactive”的页面,该页面专注于添加表单元素。

Bruno Lowagie(iText 的创始人)的书 (iText in Action) 也有非常详细的介绍。它甚至展示了如何在 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;
}