我尝试使用“通用”文本框类型控件和多行文件控件(高度更高/更高)的详细信息已详细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它什么都不显示 - 在任何一种情况下,我希望“高文本框”只是运动水平线,如下所示:
我是在叫错树吗?我想要完成的工作(将多行控件添加到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;
...导致“无法使用的高度”控制,如第一次尖叫镜头所示。
在WebPart上引用Textbox控件(而不是HtmlTextArea控件)也只会产生“水平线”。这是值为空的结果(如果字符串为空,则没有为其分配空间)?
显然是这样,因为这样做:
String s = txtarAccountCodes.InnerText;
if (String.IsNullOrEmpty(s))
{
s = " ";
}
PdfPCell cellNotesMultilineTextBox = new PdfPCell()
{
CellEvent = new DynamicTextbox("multilineTextboxNotes"),
Phrase = new Phrase(s, timesRoman9Font)
};
...工作(文本框,尽管是空的,显示在预期的大小/高度)。
我突然意识到,我可能需要首先考虑单元格的大小(在担心单元格中“多行文本框”的大小之前)。所以我把代码更改为:
PdfPCell cellNotesMultilineTextBox = new PdfPCell()
{
CellEvent = new DynamicTextbox("multilineTextboxNotes"),
Phrase = new Phrase(notes, timesRoman9Font),
MinimumHeight = 120,
NoWrap = false,
Rowspan = 40
};
(MinimumHeight,NoWrap和Rowspan值是新的)。但是,这并没有解决我所得到的“不会包装”问题 - 该区域足够大,但我只能输入一行文字;我输入的文字越多,文字越小:
这个难题有解决方案吗?似乎我需要的是一种方法来告诉“文本框”被创建为“多线”(增加其高度,或“行数”,或使其可包装,如上面的单元格本身的情况)但似乎没有“表面上”这样的能力 - 封面下面有什么东西可以暴露这种功能吗?
答案 0 :(得分:1)
我也有类似的要求,并用下面的代码来实现的。让我知道如果我误解的东西或者你的要求是别的东西。
TextField tf = new TextField(stamper.Writer, new Rectangle(llx, lly, urx, ury), property.ControlId)
{
Options = TextField.MULTILINE | TextField.READ_ONLY,
FontSize = 11
};
来自 Adobe Acrobat 的屏幕截图: