计算PDF';使用iText创建表单文本框

计算PDF';使用iText创建表单文本框,pdf,itextsharp,itext,Pdf,Itextsharp,Itext,我正在使用iTextSharp填充一些包含表单的PDFs。这些表单由文本框(以及其他字段类型)组成,如果我在PDF阅读器中打开它们,我可以在没有任何限制的情况下键入任意数量的字符。但是,如果我在一个字段中输入太多字符时打印这样一个PDF表单,溢出的内容将不会被打印出来 现在我正在寻找一种方法来测量某个特定文本框中字符串的最大长度,而不会丢失任何打印数据。我知道理论上我需要做什么,我需要根据文本框的字体属性测量字符串的宽度(以像素/点为单位),然后将其与文本框的宽度进行比较(减去它可能具有的任何填

我正在使用iTextSharp填充一些包含表单的PDFs。这些表单由文本框(以及其他字段类型)组成,如果我在PDF阅读器中打开它们,我可以在没有任何限制的情况下键入任意数量的字符。但是,如果我在一个字段中输入太多字符时打印这样一个PDF表单,溢出的内容将不会被打印出来

现在我正在寻找一种方法来测量某个特定文本框中字符串的最大长度,而不会丢失任何打印数据。我知道理论上我需要做什么,我需要根据文本框的字体属性测量字符串的宽度(以像素/点为单位),然后将其与文本框的宽度进行比较(减去它可能具有的任何填充)。但我对PDF概念都是新手,我不知道从哪里开始。有人能告诉我正确的方向吗

还有一件事,我无法控制模板PDF,我无法以任何方式更改它们。我所能做的就是当用户要求一个扁平的PDF文件时,提示用户您输入的文本将不适合该字段

[更新]

还有另外一个场景,我希望同样的解决方案也适用于此,但似乎我需要在后面的场景中加入这个,以便将答案引导到正确的方向


我的PDF表单文件中有三个文本框,当我手动(使用PDF阅读器)填充它们时,我的责任是将我的输入分成三个文本框。一个例子是地址字段的三行。如果我在设计表单,我会使用多行文本字段,这样地址会自动换行,但不幸的是,我刚收到表单,因为表单有密码保护,我所能做的就是找到适当的点来拆分输入字符串,将它们输入三个字段。

通过组合对StackOverflow上已回答的不同问题的答案,您应该能够解决您的问题

第一步:您需要知道定义字段的矩形的大小。这在我对问题的回答中已作了解释

在这个回答中,我这样做:

AcroFields form = stamper.getAcroFields();
AcroFields.FieldPosition fieldPosition = form.getFieldPositions(field).get(0);
Rectangle rect = fieldPosition.position;
其中,
field
包含字段的名称,
rect
描述了一个矩形,您可以从中获取宽度和高度

第二步:您需要为字段定义的字体的
BaseFont
实例。克里斯·哈斯回答了这个问题:

我已将他的答案移植到Java:

您必须修改这个示例,因为它假定您已经知道字体的名称。在
/DR
字典中应该很容易找到这个名字

注意事项:此字体可能包含的信息不足以满足您的需要。这是最微妙的一步。如果您只使用Helvetica或更改字体,可能会更好。请注意,原始文档是否加密并不重要:如果您可以阅读,您可以更改正在填充的文档中的字体(您不需要更改原始模板中的字体;它只会在生成的文档中更改)

第三步:现在您有了字体和可用宽度,您可以使用此问题的答案来计算绘制特定字符串所需的大小:

您可以使用
BaseFont.getWidthPoint(字符串文本,float-fontSize)
获取pt中字符串的宽度。或者将字符串放入块中,然后执行
Chunk.getWidthPoint()


这三者的结合应该可以解决您的问题。

通过将StackOverflow上已回答的不同问题的答案结合起来,您应该能够解决您的问题

第一步:您需要知道定义字段的矩形的大小。这在我对问题的回答中已作了解释

在这个回答中,我这样做:

AcroFields form = stamper.getAcroFields();
AcroFields.FieldPosition fieldPosition = form.getFieldPositions(field).get(0);
Rectangle rect = fieldPosition.position;
其中,
field
包含字段的名称,
rect
描述了一个矩形,您可以从中获取宽度和高度

第二步:您需要为字段定义的字体的
BaseFont
实例。克里斯·哈斯回答了这个问题:

我已将他的答案移植到Java:

您必须修改这个示例,因为它假定您已经知道字体的名称。在
/DR
字典中应该很容易找到这个名字

注意事项:此字体可能包含的信息不足以满足您的需要。这是最微妙的一步。如果您只使用Helvetica或更改字体,可能会更好。请注意,原始文档是否加密并不重要:如果您可以阅读,您可以更改正在填充的文档中的字体(您不需要更改原始模板中的字体;它只会在生成的文档中更改)

第三步:现在您有了字体和可用宽度,您可以使用此问题的答案来计算绘制特定字符串所需的大小:

您可以使用
BaseFont.getWidthPoint(字符串文本,float-fontSize)
获取pt中字符串的宽度。或者将字符串放入块中,然后执行
Chunk.getWidthPoint()


这三者的结合应该能解决你的问题。

非常感谢你的帖子。这也是查找字段字体的正确方法吗<代码>var ft1=acroFields.GetFieldItem(“FillText1”);var dic=ft1.GetMerged(0);TextField tmp=新的TextField(null,null,null);acroFields.DecodeGenericDictionary(dic,tmp);BaseFont=tmp.font顺便说一句,
getWidthPoint
需要
fontSize
。如何检索字段的字体大小?我上下搜索了互联网,我所能找到的就是如何设置它。从来没有人说过要得到它!!通常存储字体大小