使用iText向现有PDF添加只读多行文本域时丢失多行属性问题
解决iText中文本域同时设置MULTILINE和READ_ONLY选项失效的问题
这个问题的核心原因很明确:你调用setOptions()方法时,每次都会完全覆盖之前设置的选项,而不是将新选项叠加进去。比如先设置MULTILINE,之后再调用setOptions(READ_ONLY),就会把之前的MULTILINE替换掉,自然多行功能就失效了。
解决方案:合并选项位掩码
iText的文本域选项是通过位掩码控制的,多个选项可以用位或运算符(|)合并成一个整数,一次性传递给setOptions(),这样就能同时启用多个选项而不互相覆盖。
修正后的完整代码如下:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfReader reader = new PdfReader("PDF PATH"); PdfStamper stamper; stamper = new PdfStamper(reader, baos); AcroFields fields = stamper.getAcroFields(); TextField textField = new TextField(stamper.getWriter(), new Rectangle(18, 200, 380, 278), "newTextField"); // 合并MULTILINE和READ_ONLY两个选项 textField.setOptions(TextField.MULTILINE | TextField.READ_ONLY); textField.setFontSize(0f); textField.setText("VERY LONG TEXT"); stamper.addAnnotation(textField.getTextField(), 1); stamper.close();
分步添加选项的替代方式
如果你的业务需要动态分步添加选项(比如某些选项是根据条件决定的),可以先获取当前已设置的选项,再合并新选项后重新设置:
// 先设置基础多行选项 textField.setOptions(TextField.MULTILINE); // 后续动态添加只读选项 int currentOptions = textField.getOptions(); textField.setOptions(currentOptions | TextField.READ_ONLY);
这样修改后,文本域就能同时保持多行显示和只读状态,字体大小的设置也会正常生效。
内容的提问来源于stack exchange,提问作者crimson589
相关产品推荐
相关产品推荐

