如何使用 iTextSharp 将多行文本字段添加到 PDF 表单?

How can I add multiline Textfields to a PDF form using iTextSharp?

我在尝试同时使用 "generic" 文本框类型控件和多行控件(height/are 更高)时遇到的困难详述 here

如何使用 iTextSharp 文本字段(或其基本等效项),唯一的区别是它是多行的(在表单上覆盖更多垂直 space)?

这让我得到了我想要的 "textboxes":

public class DynamicTextbox : IPdfPCellEvent
{
    private string fieldname;

    public DynamicTextbox(string name)
    {
        fieldname = name;
    }

    public void CellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases)
    {
        PdfWriter writer = canvases[0].PdfWriter;
        iTextSharp.text.pdf.TextField text = new iTextSharp.text.pdf.TextField(writer, rectangle, fieldname);
        //Microsoft.SharePoint.WebControls.TextField text = new TextField(writer, rectangle, fieldname);
        PdfFormField field = text.GetTextField();
        writer.AddAnnotation(field);
    }
}

...但是关于该主题的推导,试图生成该主题的 "taller" 版本,失败了:

public class DynamicMultilineTextbox : IPdfPCellEvent
{
    private string fieldname;

    public DynamicMultilineTextbox(string name)
    {
        fieldname = name;
    }

    public void CellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases)
    {
        Rectangle wreckTangle = new Rectangle(30, 60); // changed from 300, 600
        PdfWriter writer = canvases[0].PdfWriter;
        iTextSharp.text.pdf.TextField text = new iTextSharp.text.pdf.TextField(writer, wreckTangle, fieldname);
        PdfFormField field = text.GetTextField();
        writer.AddAnnotation(field);
    }
}

失败之处在于,如果我使用 300、600 的矩形,它会产生一个巨大的 Blob,威胁要覆盖这个县和下一个县。如果我使用 30,60 它什么都不显示 - 在任何一种情况下,我都希望 "tall textboxes" 只是运动水平线,如下所示:

我是不是找错人了?我试图完成的事情(向 PDF 文件添加多行控件)如何实现?

更新

太棒了,如果我只给文本框任何旧的文字字符串,它就可以工作:

代码是这样的:

PdfPCell cellNotesMultilineTextBox = new PdfPCell()
{
    CellEvent = new DynamicTextbox("multilineTextboxNotes"),
    Phrase = new Phrase("I will be darned like a sock", timesRoman9Font)
};
tblMultilineTextAreas.AddCell(cellNotesMultilineTextBox);

Phrase blankPhrase = new Phrase();
PdfPCell blankCell = new PdfPCell(blankPhrase);
blankCell.BorderWidth = 0;
tblMultilineTextAreas.AddCell(blankCell);

PdfPCell cellAccountCodesMultilineTextBox = new PdfPCell()
{
    CellEvent = new DynamicTextbox("multilineTextboxAccountCodes"),
    Phrase = new Phrase("I will be dammed like a reservoir", timesRoman9Font)
};
tblMultilineTextAreas.AddCell(cellAccountCodesMultilineTextBox);

Phrase blankPhrase2 = new Phrase();
PdfPCell blankCell2 = new PdfPCell(blankPhrase2);
blankCell2.BorderWidth = 0;
tblMultilineTextAreas.AddCell(blankCell2);

PdfPCell cell1099TaxReportableMultilineTextBox = new PdfPCell()
{
    CellEvent = new DynamicTextbox("multilineTextbox1099TaxReportable"),
    Phrase = new Phrase("I will be the uncle of a monkey", timesRoman9Font)
};
tblMultilineTextAreas.AddCell(cell1099TaxReportableMultilineTextBox);
doc.Add(tblMultilineTextAreas);

...但是,那当然不行。访问 WebPart 上 HtmlTextArea 控件的 InnerText,编码如下:

HtmlTextArea txtarNotes = null;
. . .
txtarNotes = new HtmlTextArea();
txtarNotes.Cols = 40;
txtarNotes.Rows = 6;

...结果是 "no-usable-height" 控件,如第一个尖叫镜头所示。

并且引用 WebPart 上的文本框控件(而不是 HtmlTextArea 控件)也只会导致 "horizontal lines"。这是空值的结果吗(如果字符串为空,则没有分配space)?

更新 2

显然是这样,因为这样做:

String s = txtarAccountCodes.InnerText;
if (String.IsNullOrEmpty(s))
{
    s = " ";
}
PdfPCell cellNotesMultilineTextBox = new PdfPCell()
{
    CellEvent = new DynamicTextbox("multilineTextboxNotes"),
    Phrase = new Phrase(s, timesRoman9Font)
};

...有效(文本框虽然是空的,但显示在它们预期的 sizes/heights 中)。

更新 3

我突然意识到,也许我需要先增加 单元格 的大小(在担心单元格中 "multiline textbox" 的大小之前)。所以我将代码更改为:

PdfPCell cellNotesMultilineTextBox = new PdfPCell()
{
    CellEvent = new DynamicTextbox("multilineTextboxNotes"),
    Phrase = new Phrase(notes, timesRoman9Font),
    MinimumHeight = 120,
    NoWrap = false,
    Rowspan = 40
};

(MinimumHeight、NoWrap 和 Rowspan 值是新的)。但是,这并没有解决我遇到的 "won't wrap" 问题——区域足够大,但我只能输入一行文本;我输入的文字越多,文字越小:

这个难题有解决办法吗?看来我需要的是一种方法来告诉 "Textbox" 被创建为 "be multiline"(增加它的高度,或 "rowcount",或使其可包装,就像上面的 Cell 本身一样) 但似乎没有这样的功能 "on the surface" - 是否有隐藏的东西公开了此功能?

我也有类似的需求,用下面的代码实现。如果我误解了什么或者您的要求是别的,请告诉我。

TextField tf = new TextField(stamper.Writer, new Rectangle(llx, lly, urx, ury), property.ControlId)
{
    Options = TextField.MULTILINE | TextField.READ_ONLY,
    FontSize = 11
};

来自 Adob​​e Acrobat 的屏幕截图: