IText AcroField 字符大小
IText AcroField Character size
我正在 java 中使用压模创建 acrofields(如下所示),我想找到一种方法来了解 acrofield 的长度。我希望能够确定要在 acrofield 中输入的字符串的长度,如果它太长,那么我将拆分该字符串并将其放入溢出 acrofield。这可能吗?要了解我可以在特定的 arcofield 中放置多少个字符?
OutputStream output = FacesContext.getCurrentInstance().getExternalContext().getResponseOutputStream();
PdfStamper stamper = new PdfStamper(pdfTemplate, output);
stamper.setFormFlattening(true);
AcroFields fields = stamper.getAcroFields();
setFields(document, fields);
我也用fields.setField("AcroFieldName","Value");设置值。
您的要求有很多选择:
1.) 您知道字段提供自动调整字体大小吗?如果将字体大小设置为 0,字体将自动调整大小以适应字段。
2.) 你知道文本表单域可以包含多行吗? (多行文本字段 Ff 位位置 13)
3.) 有maxlen
属性,可以自己定义一个字段可以写入多少。定义如下:
MaxLen (integer) - The maximum length of the field’s text, in characters.
4.) 如果以上都不能满足您的需求,您可以按照自己的意愿去做。
你必须做三件事:
a.) 获取字段的长度。关键是方法 getFieldPositions()
。基本做的地方返回一个定位信息数组:
upperRightX coordinate - lowerLeftX coordinate
这是打印出所有字段的所有长度的代码:
AcroFields fields = stamper.getAcroFields();
Map<String, AcroFields.Item> fields = acroFields.getFields();
Iterator<Entry<String,Item>> it = fields.entrySet().iterator();
//iterate over form fields
while(it.hasNext()){
Entry<String,Item> entry = it.next();
float[] position = acroFields.getFieldPositions(entry.getKey());
int pageNumber = (int) position[0];
float lowerLeftX = position[1];
float lowerLeftY = position[2];
float upperRightX = position[3];
float upperRightY = position[4];
float fieldLength = Math.abs(upperRightX-lowerLeftX)
}
b.) 从字段外观中获取字体和字体大小(/DA)
//code within the above while()
PdfDictionary d = entry.getValue().getMerged(0);
PdfString fieldDA = d.getAsString(PdfName.DA);
//in case of no form field default appearance create a default one
if(fieldDA==null) ...
Object[] infos = AcroFields.splitDAelements(fieldDA.toString());
if(infos[0]!=null) String fontName = (String)infos[0];
if(infos[1]!=null) float fontSize= (((Float)infos[1]).floatValue());
c) 使用字体和字体大小计算字符串的宽度:
Font font = new Font(fontName,Font.PLAIN,fontSize);
FontMetrics fm = new Canvas().getFontMetrics(font);
int stringWidth = fm.stringWidth("yourString");
现在,如果您比较这两个值,您就会知道该字符串是否适合您的字段。
更新:MKL 是正确的 - 如果字体是嵌入的并且在操作系统中不可用,您不能执行 4.) 因为您无法从 PDF 中提取字体定义文件 (法律和技术 reasons)
更新二:你的意思是你已经有了多行文本框?在那种情况下还要测量高度:
fontMaxHeight = fm.getMaxAscent()+fm.getMaxDescent()+fm.getLeading();
和文本字段的高度:
float fieldHeight = Math.abs(upperRightY-lowerLeftY)
然后你就知道有多少行适合文本字段...
我正在 java 中使用压模创建 acrofields(如下所示),我想找到一种方法来了解 acrofield 的长度。我希望能够确定要在 acrofield 中输入的字符串的长度,如果它太长,那么我将拆分该字符串并将其放入溢出 acrofield。这可能吗?要了解我可以在特定的 arcofield 中放置多少个字符?
OutputStream output = FacesContext.getCurrentInstance().getExternalContext().getResponseOutputStream();
PdfStamper stamper = new PdfStamper(pdfTemplate, output);
stamper.setFormFlattening(true);
AcroFields fields = stamper.getAcroFields();
setFields(document, fields);
我也用fields.setField("AcroFieldName","Value");设置值。
您的要求有很多选择:
1.) 您知道字段提供自动调整字体大小吗?如果将字体大小设置为 0,字体将自动调整大小以适应字段。
2.) 你知道文本表单域可以包含多行吗? (多行文本字段 Ff 位位置 13)
3.) 有maxlen
属性,可以自己定义一个字段可以写入多少。定义如下:
MaxLen (integer) - The maximum length of the field’s text, in characters.
4.) 如果以上都不能满足您的需求,您可以按照自己的意愿去做。 你必须做三件事:
a.) 获取字段的长度。关键是方法 getFieldPositions()
。基本做的地方返回一个定位信息数组:
upperRightX coordinate - lowerLeftX coordinate
这是打印出所有字段的所有长度的代码:
AcroFields fields = stamper.getAcroFields();
Map<String, AcroFields.Item> fields = acroFields.getFields();
Iterator<Entry<String,Item>> it = fields.entrySet().iterator();
//iterate over form fields
while(it.hasNext()){
Entry<String,Item> entry = it.next();
float[] position = acroFields.getFieldPositions(entry.getKey());
int pageNumber = (int) position[0];
float lowerLeftX = position[1];
float lowerLeftY = position[2];
float upperRightX = position[3];
float upperRightY = position[4];
float fieldLength = Math.abs(upperRightX-lowerLeftX)
}
b.) 从字段外观中获取字体和字体大小(/DA)
//code within the above while()
PdfDictionary d = entry.getValue().getMerged(0);
PdfString fieldDA = d.getAsString(PdfName.DA);
//in case of no form field default appearance create a default one
if(fieldDA==null) ...
Object[] infos = AcroFields.splitDAelements(fieldDA.toString());
if(infos[0]!=null) String fontName = (String)infos[0];
if(infos[1]!=null) float fontSize= (((Float)infos[1]).floatValue());
c) 使用字体和字体大小计算字符串的宽度:
Font font = new Font(fontName,Font.PLAIN,fontSize);
FontMetrics fm = new Canvas().getFontMetrics(font);
int stringWidth = fm.stringWidth("yourString");
现在,如果您比较这两个值,您就会知道该字符串是否适合您的字段。
更新:MKL 是正确的 - 如果字体是嵌入的并且在操作系统中不可用,您不能执行 4.) 因为您无法从 PDF 中提取字体定义文件 (法律和技术 reasons)
更新二:你的意思是你已经有了多行文本框?在那种情况下还要测量高度:
fontMaxHeight = fm.getMaxAscent()+fm.getMaxDescent()+fm.getLeading();
和文本字段的高度:
float fieldHeight = Math.abs(upperRightY-lowerLeftY)
然后你就知道有多少行适合文本字段...