如何将签名表单添加到现有的pdf(使用iText7),以便输出文件可以用作pdf(顺序签名)的输入?

时间:2018-07-17 10:18:56

标签: java pdf digital-signature itext7 sequential

我正在将iText7用于pdf签名工作流,我遵循了i7js-signatures提供的示例。但是,我的要求是获取一个输入pdf文件,向其添加顺序签名,然后进一步将其传递以进行签名。

我尝试将过程分为两个步骤。

  1. 在中间输出文件中输入pdf并添加顺序签名面板。

    public void createForm() throws IOException {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(FORM),new PdfWriter(TMP));
        //PdfDocument pdfDoc = new PdfDocument(new PdfWriter(FORM));
        pdfDoc.addNewPage();
        Document doc = new Document(pdfDoc);
        Table table = new Table(1);
        table.addCell("Signer 1: Alice");
        table.addCell(createSignatureFieldCell("sig1"));
        table.addCell("Signer 2: Bob");
        table.addCell(createSignatureFieldCell("sig2"));
        table.addCell("Signer 3: Carol");
        table.addCell(createSignatureFieldCell("sig3"));
        doc.add(table);
        doc.close();
    }
    
  2. 获取中间输出文件并签名。

在使用步骤1的输出运行第二步时,我遇到com.itextpdf.kernel.PdfException:error.reading.objstm

Exception in thread "main" com.itextpdf.kernel.PdfException: error.reading.objstm
    at com.itextpdf.kernel.pdf.PdfReader.readObjectStream(PdfReader.java:508)
    at com.itextpdf.kernel.pdf.PdfReader.readObject(PdfReader.java:1014)
    at com.itextpdf.kernel.pdf.PdfReader.readObject(PdfReader.java:533)
    at com.itextpdf.kernel.pdf.PdfIndirectReference.getRefersTo(PdfIndirectReference.java:128)
    at com.itextpdf.kernel.pdf.PdfIndirectReference.getRefersTo(PdfIndirectReference.java:132)
    at com.itextpdf.kernel.pdf.PdfArray.get(PdfArray.java:376)
    at com.itextpdf.kernel.pdf.PdfArray.get(PdfArray.java:237)

输入pdf:

Input pdf

中级pdf第1页:

Intermediate pdf page 1

pdf中级页面2:

Intermediate pdf page 2

如果我在这里做错了,请引导我。

1 个答案:

答案 0 :(得分:0)

iText 7的潜在错误/特殊性与in this answer中所述的相同,其中该表跨四个页面构建,但所有字段都出现在最后一页。

但是,正如您在注释中所阐明的,无论如何,您还是希望最后一页上的表和字段。因此,我们要做的就是将表也移到最后一页。

这实际上很简单,只需在添加表之前添加适当的AreaBreak

doc.add(new AreaBreak(AreaBreakType.LAST_PAGE));
doc.add(table);

AddSignatureField测试testAddSignaturesInTable


您在此问题的上下文中更新了iText版本。同时,表创建代码也进行了相当大的更改。因此,您可能还需要设置签名单元的宽度,例如

Cell cell = new Cell();
cell.setHeight(50);
cell.setWidth(200);
cell.setNextRenderer(new SignatureFieldCellRenderer(cell, name));
return cell;

AddSignatureField方法createSignatureFieldCell