使用iText5实现PDF中ComboBox选择后跳转至指定页面的方案咨询
iText5实现ComboBox下拉框选中跳转页码的解决方案
核心实现逻辑是给下拉框表单字段绑定值变更触发的JavaScript动作,调用PDF内置的JS API完成页面跳转,你只需要修改原有代码中创建下拉框的部分即可:
修改后的代码段如下:
PdfContentByte content = pdfStamper.getOverContent(pageNum); BaseFont bf = BaseFont.createFont(); PdfWriter writer = content.getPdfWriter(); Rectangle rect = new Rectangle(right-150f,top-15f,right-70f,top-2f); TextField tf = new TextField(writer, rect, "Headers"); PdfFormField select = PdfFormField.createEmpty(writer); tf.setFont(bf); tf.setBorderStyle(PdfBorderDictionary.STYLE_BEVELED); tf.setVisibility(TextField.VISIBLE_BUT_DOES_NOT_PRINT); tf.setBorderColor(BaseColor.GRAY); tf.setChoiceExports(exports); tf.setChoices(options); tf.setAlignment(Element.ALIGN_CENTER); try { PdfFormField comboField = tf.getComboField(); // 绑定值变更时的跳转JS动作 PdfAction jumpAction = PdfAction.createJavaScript( "if(event.value && !isNaN(parseInt(event.value))) {" + "this.pageNum = parseInt(event.value) - 1;" + "}" ); // PdfName.V 对应字段值变更触发事件 comboField.setAdditionalActions(PdfName.V, jumpAction); select.addKid(comboField); } catch (Exception e) { throw new ExceptionConverter(e); } pdfStamper.addAnnotation(select,pageNum);
注意事项
- 上述代码中JS逻辑默认你的
exports数组存储的是1-based的文档页码,PDF内置JS使用0-based页码索引,所以做了减1处理,如果你导出值本身就是0-based可以去掉减1逻辑 - 所有页面下拉框使用同一个字段名
Headers是合理的,可实现跨页选中状态同步,用户体验更好 - 部分轻量PDF阅读器(如部分浏览器内置阅读器)对内嵌JS支持不完善,建议使用Adobe Acrobat/Reader测试功能有效性
内容的提问来源于stack exchange,提问作者dunccam
相关产品推荐
相关产品推荐

