iTextSharp中多行文本表单字段的对齐问题

Ste*_*eve 2 c# itext itextsharp

我编写了一个应用程序,以编程方式从数据库中填写PDF模板中的表格并将结果保存到磁盘。除了未按预期呈现的任何多行文本字段之外,所有内容均正常运行。它们应该在顶部,并在行与行之间保持无间隔。

我得到的结果是在这里: 在此处输入图片说明

但是,当我使用任何PDF阅读器单击表单字段时,该字段都会根据我的期望进行自我更正。见: 在此处输入图片说明

我使用的代码非常漂亮。

            PdfStamper stamper = new PdfStamper(reader, ms, '\0', 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();
Run Code Online (Sandbox Code Playgroud)

System.Environment.NewLine用来添加回程报酬。有谁知道是什么原因导致这种现象,以及解决方案使左上角对齐而没有大的间隙。谢谢。

更新解决方案

我删除了该字段并重新添加它,它的行为符合预期。实际上似乎是问题出在,我使用的是一种名为“ Cambria”的字体,如果我将该字段设置回使用该字体,则会返回该行为。

Bru*_*gie 5

请查看为测试您的指控而编写的MultiLineField。在此示例中,我们使用最简单的多行文本字段创建一个表单:

Rectangle rect = new Rectangle(36, 720, 144, 806);
TextField tf = new TextField(writer, rect, "text");
tf.setOptions(TextField.MULTILINE);
writer.addAnnotation(tf.getTextField());
Run Code Online (Sandbox Code Playgroud)

然后我们像下面这样填充和展平该表格:

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();
}
Run Code Online (Sandbox Code Playgroud)

仔细看一下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"
Run Code Online (Sandbox Code Playgroud)

我介绍了一些换行符(\n)以及回车/换行符序列(\r\n)。这些引入了一条新行。仅当我引入多个换行符(\n\n)时,才会引入额外的间隔:

在此处输入图片说明

代码行为不同的三个可能原因:

  1. 您的形式不同。关于您的文本字段,有一些非常具体的内容。如果是这样,请分享您的表格以供检查。[ 更新:如评论中所述,文本字段确实存在一些特殊之处;更新领域解决了这个问题。]
  2. 您要添加太多换行符。也许“ 21 High Street”已经跟着换行符了。您的系统上的换行序列可能有些奇怪。请注意,这是PDF:它与操作系统无关,只需使用/n就足够了。
  3. 也许您正在使用iText的非官方版本。对于我们(iText组)来说,这非常令人沮丧,但有些人发现有必要创建包含代码的派生文件,这些代码根本无法像官方iText那样行事。确保您使用的是iText的正版。

无论如何:您在示例中共享的屏幕截图与您的代码不匹配。在您的代码中,您具有:

stamper.FormFlattening = true;
Run Code Online (Sandbox Code Playgroud)

这与显示交互性的屏幕截图不一致。仅在以下情况下才有可能:

stamper.FormFlattening = false;
Run Code Online (Sandbox Code Playgroud)

或者如果此行不存在。