iTextSharp 中多行文本表单字段的对齐问题
Alignment issue with multiline text form fields in iTextSharp
我编写了一个应用程序,以编程方式从数据库中填写 PDF 模板中的表单,并将结果保存到磁盘。除了未按预期呈现的任何多行文本字段外,一切都正常工作。它们应该在顶部,左对齐,行与行之间没有间隙。
我得到的结果在这里:
但是,当我使用任何 PDF reader 单击进入表单字段时,该字段会自行更正为我所期望的。看 :
我使用的代码是非常样板的东西。
PdfStamper stamper = new PdfStamper(reader, ms, '[=10=]', false);
AcroFields form = stamper.AcroFields;
List<DocumentField> fields = GetData(id);
foreach (DocumentField field in fields)
{
form.SetField(field.FieldName, field.Value);
}
stamper.FormFlattening = true;
stamper.Close();
reader.Close();
我正在使用 System.Environment.NewLine
添加 carraige returns。有谁知道可能导致此行为的原因以及使左上角对齐而没有大间隙的解决方案。谢谢
更新解决方案
我删除了该字段并重新添加了它,它的行为符合预期。实际上问题似乎是我使用的是一种名为 'Cambria' 的字体,如果我将字段设置回使用该字体,则会返回该行为。
请看一下 MultiLineField 为验证您的指控而写的文章。在此示例中,我们创建了一个包含最简单的多行文本字段的表单:
Rectangle rect = new Rectangle(36, 720, 144, 806);
TextField tf = new TextField(writer, rect, "text");
tf.setOptions(TextField.MULTILINE);
writer.addAnnotation(tf.getTextField());
然后我们像这样填写并压平这个表格:
public void createPdf(String filename) throws DocumentException, IOException {
PdfReader reader = new PdfReader(createForm());
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename));
AcroFields form = stamper.getAcroFields();
form.setField("text", "A B C D E F\nG H I J K L M N\nO P Q R S T U\r\nV W X Y Z\n\nAlphabet street");
stamper.setFormFlattening(true);
stamper.close();
}
仔细看看 String
:
"A B C D E F\nG H I J K L M N\nO P Q R S T U\r\nV W X Y Z\n\nAlphabet street"
我介绍了一些换行符(\n
),甚至还有一个回车符return/newline序列(\r\n
)。这些引入了一个新行。只有当我引入多个换行符(\n\n
)时,才会引入一个额外的空隙:
您的代码行为不同的三个可能原因:
- 你的表格不一样。您的文本字段有一些非常具体的内容。如果是这样,请分享您的表格以供检查。 [更新: 如评论中所述,文本字段确实有一些特别之处;更新字段解决了问题。]
- 您添加的换行符过多。也许“21 High Street”后面已经跟了一个换行符。也许您系统上的换行顺序有些奇怪。请注意,这是 PDF:它是 OS 独立的,只需使用
/n
就足够了。
- 也许您使用的是非官方版本的 iText。这对我们(iText Group)来说非常令人沮丧,但有些人发现有必要创建包含代码的分支,这些代码的行为根本不像官方 iText 的行为方式。确保您使用的是 iText 的正版。
无论如何:您在示例中共享的屏幕截图与您的代码不匹配。在您的代码中,您有:
stamper.FormFlattening = true;
这与您显示交互性的屏幕截图不一致。这只有在您拥有以下条件时才有可能:
stamper.FormFlattening = false;
或者如果此行不存在。
我发现如果您将 PDF 上的文本框和 asp.net 上的文本框设置为相同的字体,它会修复格式。 asp.net 文本框中没有粗体。
我编写了一个应用程序,以编程方式从数据库中填写 PDF 模板中的表单,并将结果保存到磁盘。除了未按预期呈现的任何多行文本字段外,一切都正常工作。它们应该在顶部,左对齐,行与行之间没有间隙。
我得到的结果在这里:
但是,当我使用任何 PDF reader 单击进入表单字段时,该字段会自行更正为我所期望的。看 :
我使用的代码是非常样板的东西。
PdfStamper stamper = new PdfStamper(reader, ms, '[=10=]', false);
AcroFields form = stamper.AcroFields;
List<DocumentField> fields = GetData(id);
foreach (DocumentField field in fields)
{
form.SetField(field.FieldName, field.Value);
}
stamper.FormFlattening = true;
stamper.Close();
reader.Close();
我正在使用 System.Environment.NewLine
添加 carraige returns。有谁知道可能导致此行为的原因以及使左上角对齐而没有大间隙的解决方案。谢谢
更新解决方案
我删除了该字段并重新添加了它,它的行为符合预期。实际上问题似乎是我使用的是一种名为 'Cambria' 的字体,如果我将字段设置回使用该字体,则会返回该行为。
请看一下 MultiLineField 为验证您的指控而写的文章。在此示例中,我们创建了一个包含最简单的多行文本字段的表单:
Rectangle rect = new Rectangle(36, 720, 144, 806);
TextField tf = new TextField(writer, rect, "text");
tf.setOptions(TextField.MULTILINE);
writer.addAnnotation(tf.getTextField());
然后我们像这样填写并压平这个表格:
public void createPdf(String filename) throws DocumentException, IOException {
PdfReader reader = new PdfReader(createForm());
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename));
AcroFields form = stamper.getAcroFields();
form.setField("text", "A B C D E F\nG H I J K L M N\nO P Q R S T U\r\nV W X Y Z\n\nAlphabet street");
stamper.setFormFlattening(true);
stamper.close();
}
仔细看看 String
:
"A B C D E F\nG H I J K L M N\nO P Q R S T U\r\nV W X Y Z\n\nAlphabet street"
我介绍了一些换行符(\n
),甚至还有一个回车符return/newline序列(\r\n
)。这些引入了一个新行。只有当我引入多个换行符(\n\n
)时,才会引入一个额外的空隙:
您的代码行为不同的三个可能原因:
- 你的表格不一样。您的文本字段有一些非常具体的内容。如果是这样,请分享您的表格以供检查。 [更新: 如评论中所述,文本字段确实有一些特别之处;更新字段解决了问题。]
- 您添加的换行符过多。也许“21 High Street”后面已经跟了一个换行符。也许您系统上的换行顺序有些奇怪。请注意,这是 PDF:它是 OS 独立的,只需使用
/n
就足够了。 - 也许您使用的是非官方版本的 iText。这对我们(iText Group)来说非常令人沮丧,但有些人发现有必要创建包含代码的分支,这些代码的行为根本不像官方 iText 的行为方式。确保您使用的是 iText 的正版。
无论如何:您在示例中共享的屏幕截图与您的代码不匹配。在您的代码中,您有:
stamper.FormFlattening = true;
这与您显示交互性的屏幕截图不一致。这只有在您拥有以下条件时才有可能:
stamper.FormFlattening = false;
或者如果此行不存在。
我发现如果您将 PDF 上的文本框和 asp.net 上的文本框设置为相同的字体,它会修复格式。 asp.net 文本框中没有粗体。