为什么不打印iText 7表单字段值?

时间:2017-01-27 03:53:05

标签: pdf pdf-generation itext itext7

我有一张PDF,其中包含使用iText 7生成的表单。但是,当我填写表单并尝试打印时,表单值不会显示;只有表格大纲显示。如何生成将在打印时显示值的表单字段?

示例表单生成器:

import java.io.FileNotFoundException;
import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.forms.fields.PdfTextFormField;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.border.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.renderer.CellRenderer;
import com.itextpdf.layout.renderer.DrawContext;

/**
 * @author Lucas Vander Wal
 *
 */
public final class TestForm {

    private static final Logger log = LoggerFactory.getLogger(TestForm.class);

    private static final PageSize LETTER_SIZE = new PageSize(612, 792),
            LETTER_SIZE_LANDSCAPE = LETTER_SIZE.rotate();

    private static final PdfFont FONT;
    static {
        try {
            FONT = PdfFontFactory.createFont();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static final float FONT_SIZE_12 = 12;

    /**
     * @param args
     */
    public static void main(String[] args) {
        log.info("Running pdf generation...");
        new TestForm().generate("formTest.pdf");
        log.info("Done with pdf generation.");
    }

    private Document doc;
    private PdfDocument pdfDoc;
    private PdfAcroForm form;

    public TestForm() {
    }

    /**
     * Generates the timesheet pdf and saves it to the given file location
     * 
     * @param outputFile
     */
    public void generate(String outputFile) {
        try {
            pdfDoc = new PdfDocument(new PdfWriter(outputFile));
            doc = new Document(pdfDoc, LETTER_SIZE_LANDSCAPE);
            // set document properties
            doc.setFontSize(10);
            float marginSize = doc.getTopMargin();
            doc.setMargins(marginSize / 2, marginSize, marginSize / 2, marginSize);

            form = PdfAcroForm.getAcroForm(pdfDoc, true);

            // build the form
            buildUserInfo();
            // close the document
            doc.close();

        } catch (FileNotFoundException e) {
            log.warn("Unable to save to file: " + outputFile, e);
        }

    }

    private void buildUserInfo() {
        // build the user info table
        Table userTable = new Table(4).setBorder(Border.NO_BORDER).setWidthPercent(100).setMargin(0).setPadding(0);
        // add 4 text entry fields
        this.addFieldToTable(userTable, "nameEmployee", "Name of Employee:");

        // add the table to the document
        this.doc.add(userTable);

    }

    private void addFieldToTable(Table t, String fieldName, String fieldLabel) {
        t.addCell(new Cell().add(fieldLabel).setPadding(5));
        Cell cell = new Cell().setPadding(5);
        cell.setNextRenderer(new CellRenderer(cell) {

            @Override
            public void draw(DrawContext drawContext) {
                super.draw(drawContext);
                PdfTextFormField field = PdfFormField.createText(
                        drawContext.getDocument(), getOccupiedAreaBBox().decreaseHeight(5), fieldName, "",
                        FONT, FONT_SIZE_12);
                form.addField(field);
            }

        });
        t.addCell(cell);
    }
}

1 个答案:

答案 0 :(得分:0)

PDF表单字段的可见性设置会影响打印功能。有关详细信息,请参阅this Adobe page

表单字段需要使用setVisibility()对象上的PdfFormField方法设置为“可见”。 This iText 7 documentation解释了如何将表单设置为' HIDDEN' VISIBLE_BUT_DOES_NOT_PRINT'和' HIDDEN_BUT_PRINTABLE'但是它没有提到设置为可见,实际上,visible不是PdfFormField中的静态选项之一。

上面列出的三个值对应于整数1,2和3,并且在预感中,我将可见性设置为0,并在打印时显示表单字段!

总之,请致电PdfFormField.setVisibility(0)以创建可打印的表单字段。