使用iText5 Java生成的PDF表单域上传至Adobe Sign出现重复问题
iText5生成PDF上传Adobe Sign后表单域重复问题
问题现象


使用iText5库为PDF创建日期域与签名域并生成PDF文件。下载后的PDF在Adobe Acrobat Reader中打开仅能看到1个已创建的域,但将该PDF上传至Adobe Sign时,表单域会出现重复现象。
原实现代码如下:
Document document = new Document(PageSize.A4,40,40,60,50); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter writer = PdfWriter.getInstance(document,baos); PdfPTable signatureTable = createPdfTable(2); signatureTable.setWidths(new int[] {1,1}); PdfPCell signatureCell = new PdfPCell(); TextField signatureText = new TextField(writer,signatureCell,"TCSig1_es_:signer1:signature"); signatureText.setBackgroundColor(BaseColor.WHITE); PdfFormField signField = signatureText.getTextField(); signField.setPlaceInPage(4); FieldPositioningEvents signatureEvent = new FieldPositioningEvents(writer, signField); signatureCell.setCellEvent(signatureEvent); signatureTable.addCell(signatureCell); document.add(signatureTable);
问题原因
FieldPositioningEvents事件本身会在单元格渲染到对应页面时,自动将绑定的表单域添加到PDF的AcroForm集合中并设置正确坐标。额外调用signField.setPlaceInPage(4)相当于手动将同一个表单域重复添加到了第4页,Adobe Acrobat Reader会自动合并同名表单域所以仅显示1个,但Adobe Sign的表单域解析逻辑不会合并同名域,因此会识别出两个重复的表单域。
解决方法
删除signField.setPlaceInPage(4);这行代码即可,表单域的位置和所属页面会由FieldPositioningEvents自动处理。
修正后的代码:
Document document = new Document(PageSize.A4,40,40,60,50); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter writer = PdfWriter.getInstance(document,baos); PdfPTable signatureTable = createPdfTable(2); signatureTable.setWidths(new int[] {1,1}); PdfPCell signatureCell = new PdfPCell(); TextField signatureText = new TextField(writer,signatureCell,"TCSig1_es_:signer1:signature"); signatureText.setBackgroundColor(BaseColor.WHITE); PdfFormField signField = signatureText.getTextField(); FieldPositioningEvents signatureEvent = new FieldPositioningEvents(writer, signField); signatureCell.setCellEvent(signatureEvent); signatureTable.addCell(signatureCell); document.add(signatureTable);
内容的提问来源于stack exchange,提问作者Charu Anand
相关产品推荐
相关产品推荐

