当前位置: 首页 > 知识库问答 >
问题:

iTextSharp填充现有的pdf,但多行文本字段不会换行

申屠浩歌
2023-03-14

我在Adobe Acrobat Pro 2017中创建/编辑了一个PDF。目标是在我们的网站上动态填写它。除了一部分外,它对所有人都是成功的;其中一个表单字段不会按预期包装文本。

    var TheForm = PdfAcroForm.GetAcroForm(TheDocument, true);
    var Fields = TheForm.GetFormFields();

    //* just trying some stuff, it didn't pan out
    //Fields["MyField"].SetFieldFlag(PdfTextFormField.FF_MULTILINE).SetFontSizeAutoScale();

    //#This set the value correctly, but it doesn't wrap
    Fields["MyField"].SetValue("Field Office Wide - Fuelwood");

    //# proof the field is multiline, this is true in debugging
    var helpme = Fields["MyField"].IsMultiline();   

    //# proof the field is set correctly, just the display won't wrap
    var grrrrr = Fields["MyField"].GetValue();

    //# make the PDF read-only and remove the form fields
    TheForm.FlattenFields();

这是我用Acrobat Reader 2017手动输入的PDF表单输出

这是代码的输出

这是一个希望匿名的文件版本https://github.com/Wyseguys/wyseguys.github.io/blob/Wyseguys-patch-1/form.pdf(这不是什么大秘密,只是保持安静)

此外,这可能是一个相关的问题,我现在正在探索这个文本不适合表单字段(iTextSharp)

共有1个答案

干弘深
2023-03-14

iText 7尚未确定整个文本适合表单字段的字体大小:

/// <summary>Adjust font in case autosize.</summary>
private float GetFontSize(PdfArray bBox, String value) {
    if (this.fontSize == 0) {
        //We do not support autosize with multiline.
        if (IsMultiline() || bBox == null || value == null || String.IsNullOrEmpty(value)) {
            return DEFAULT_FONT_SIZE;
        }
        else {
            return Math.Max(ApproximateFontSizeToFitBBox(this.font, bBox.ToRectangle(), value), MIN_FONT_SIZE);
        }
    }
    return this.fontSize;
}

PdfFormFieldhelper方法)

(如您所见,DEFAULT_FONT_SIZE用作字体大小。该值定义为12

尤其是iText 7不支持您在表单字段上设置的DoNotScroll表单字段标志。

因此,“整个现场办公室-Fuelwood”分为两行。但是,由于field widget外观流包含沿field widget边框的剪辑路径,因此您只能看到第一行。此剪辑路径还允许您仅在展开视图中看到第一行,但您可以将光标导航到第二行,并在那里选择文本。

因此,要填充多行字段,请将它们的字体大小设置为一个可能会完成这项工作的值,即允许所有可能的输入适合小部件区域。或者,如果您无法控制PDF表单,请在填充之前删除多行标志,使iText自动调整为一行。

 类似资料:
  • 我有PDF模板文件与字段。客户创建的模板。它有一些文本、字段标签和字段本身。文本和标签使用嵌入在模板中的某种字体。 当我尝试用西里尔文值填充字段时会出现问题-结果文档中没有西里尔文符号。 所以问题是:1。如果我可以嵌入字体在Adobe Acrobat只用于字段,那么如何做?2.如果我可以用iTextSharp为现有字段定义字体族,那么该怎么做?

  • 我试图用fdf或xfdf中的汉字填充pdf字段。 到目前为止,我已经尝试了pdftk、mcpdf、pdfbox和fpdm。 它们都可以将字符输入字段,但不会显示。当我点击要编辑的字段时,字符按预期显示,但当我再次点击字段外时,字符消失。如果我输入的是英语,它们就会显示错误,例如“hello”变成“IFMMP”。 这一切都让我怀疑这是字体/字符映射的问题,我尝试过将完整的字体嵌入到pdf中,但没有任

  • 字体Adobe希伯来文 文本方向RTL 我试过平场和不平场。 当字段没有平坦化时,在使用Acrobat Reader打开生成的PDF后,我看到了我的字段,但它是空的。只有在我点击该字段后,该字段的内容才会正确出现。当我在Chrome上查看PDF时,字段不会出现(或者它可能在那里,但里面没有文本)。 编辑:测试PDF可从这里下载

  • 问题内容: 您能告诉我如何使RequestFactory填充实体代理的实体代理字段吗? 这是父母代理 如您所见,它包含另一个代理作为字段。这是PersonProxy的样子 在我的界面中,我有method 。从数据存储区获取真实组织的DAO类设置其字段,但在客户端中始终为。实际上,RequestFactory甚至从不调用Organization.getContactPerson()。 我的客户电话看

  • 问题内容: 我正在一个数据库项目上,任务之一是在新创建的字段“ institution”中填充“ course_id”字段的第一部分,即“ HarvardX / CB22x / 2013_Spring”。因此,我只需要使用第一部分’HarvardX填充机构字段。如何在MySQL工作台中做到这一点? 问题答案: 您可以使用: 如果还要提取中段和末端部分,则:

  • 问题内容: 我有一个将列表写入文件的程序。该列表是由管道分隔的行的列表,这些行应按如下所示写入文件: 但是它写了他们这行啊: 该程序将所有行写成一行,而没有任何换行符。.这让我非常痛苦,我必须弄清楚如何将其反转,但是无论如何,我的程序在哪里出错?我认为写行应该在文件下写行,而不是将所有内容都写到一行。 问题答案: 对于刚接触Python的新手来说,这实际上是一个非常普遍的问题- 尤其是因为在标准库