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

时间:2015-05-21 17:23:06

标签: c# pdf-generation itextsharp textfield multiline

我尝试使用“通用”文本框类型控件和多行文件控件(高度更高/更高)的详细信息已详细here

如何使用iTextSharp Textfield(或其基本等效物),唯一的区别是它是多线(覆盖表格上更多的垂直空间)?

这让我回到了我想要的“文本框”:

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

...但是这个主题的衍生,试图生成一个“更高”的版本,失败了:

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它什么都不显示 - 在任何一种情况下,我希望“高文本框”只是运动水平线,如下所示:

enter image description here

我是在叫错树吗?我想要完成的工作(将多行控件添加到PDF文件)怎么可能?

更新

足够,如果我只给文本框任何旧的文字字符串,它就可以了:

enter image description here

代码就是这样:

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;

...导致“无法使用的高度”控制,如第一次尖叫镜头所示。

在WebPart上引用Textbox控件(而不是HtmlTextArea控件)也只会产生“水平线”。这是值为空的结果(如果字符串为空,则没有为其分配空间)?

更新2

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

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

...工作(文本框,尽管是空的,显示在预期的大小/高度)。

更新3

我突然意识到,我可能需要首先考虑单元格的大小(在担心单元格中“多行文本框”的大小之前)。所以我把代码更改为:

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

(MinimumHeight,NoWrap和Rowspan值是新的)。但是,这并没有解决我所得到的“不会包装”问题 - 该区域足够大,但我只能输入一行文字;我输入的文字越多,文字越小:

enter image description here

这个难题有解决方案吗?似乎我需要的是一种方法来告诉“文本框”被创建为“多线”(增加其高度,或“行数”,或使其可包装,如上面的单元格本身的情况)但似乎没有“表面上”这样的能力 - 封面下面有什么东西可以暴露这种功能吗?

1 个答案:

答案 0 :(得分:1)

我也有类似的要求,并用下面的代码来实现的。让我知道如果我误解的东西或者你的要求是别的东西。

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 的屏幕截图:

Screenshot from Adobe Acrobat