我正在将iText7用于pdf签名工作流,我遵循了i7js-signatures提供的示例。但是,我的要求是获取一个输入pdf文件,向其添加顺序签名,然后进一步将其传递以进行签名。
我尝试将过程分为两个步骤。
在中间输出文件中输入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();
}
获取中间输出文件并签名。
在使用步骤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:
中级pdf第1页:
pdf中级页面2:
如果我在这里做错了,请引导我。
答案 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
)