iTextSharp

时间:2015-05-14 09:29:04

标签: c# itextsharp itext

我编写了一个应用程序,以编程方式从数据库中填写PDF模板中的表单并将结果保存到磁盘。除了没有按预期渲染的任何多行文本字段外,一切都正常工作。它们应该是顶部,左对齐,线之间没有间隙。

我得到的结果是: enter image description here

但是,当我使用任何PDF阅读器点击表单字段时,该字段会根据我的预期进行更正。见: enter image description here

我使用的代码很漂亮。

            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();

我正在使用System.Environment.NewLine添加carraige返回。有没有人知道可能导致这种行为的原因以及使左上方没有大间隙的解决方案。感谢。

使用解决方案更新

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

2 个答案:

答案 0 :(得分: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());

然后我们填写并展平这个表格:

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),甚至是回车/换行符(\r\n)。这些引入了一条新线。只有当我引入多个换行符(\n\n)时,才会引入额外的差距:

enter image description here

您的代码行为方式有三种可能原因:

  1. 你的表格不同。您的文本字段有一些非常具体的内容。如果是,请分享您的表格以供检查。 [更新:>如评论中所述,文本字段确实有一些特别之处;更新字段解决了问题。]
  2. 您添加了太多换行符。也许“21 High Street”已经出现了换行符。也许你的系统上的换行序列有些奇怪。请注意,这是PDF:它与操作系统无关,只需使用/n即可。
  3. 也许你正在使用非官方版的iText。这对我们(iText集团)来说非常令人沮丧,但有些人发现有必要创建包含代码的分叉,这些代码的行为与官方iText的行为方式不同。确保您使用的是iText的正版副本。
  4. 在任何情况下:您在示例中共享的屏幕截图与您的代码不匹配。在您的代码中,您有:

    stamper.FormFlattening = true;
    

    这与显示交互性的屏幕截图不一致。只有在您拥有:

    时才可以这样做
    stamper.FormFlattening = false;
    

    或者如果此行不存在。

答案 1 :(得分:0)

我发现如果你在PDF上的文本框和asp.net上的文本框形成相同的字体,它就会修复格式。在asp.net文本框中没有粗体。