pagina - ITextSharp-campo de texto en PdfPCell
itextsharp pdfpcell align center (3)
Estoy usando iTextSharp para crear un PDF, ¿cómo puedo agregar un textField en PdfPCell?
Dale una oportunidad. Esto funciona para mi.
Document doc = new Document(PageSize.LETTER, 18f, 18f, 18f, 18f);
MemoryStream ms = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
doc.Open();
// Create your PDFPTable here....
TextField tf = new TextField(writer, new iTextSharp.text.Rectangle(67, 585, 140, 800), "cellTextBox");
PdfPCell tbCell = new PdfPCell();
iTextSharp.text.pdf.events.FieldPositioningEvents events = new iTextSharp.text.pdf.events.FieldPositioningEvents(writer, tf.GetTextField());
tbCell.CellEvent = events;
myTable.AddCell(tbCell);
// More code...
Adapte este código de esta publicación.
Editar:
Aquí hay una aplicación de consola que funciona y que coloca un TextBox en una celda de tabla. Traté de mantener el código al mínimo.
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace iTextSharpTextBoxInTableCell
{
class Program
{
static void Main(string[] args)
{
// Create a PDF with a TextBox in a table cell
BaseFont bfHelvetica = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, false);
Font helvetica12 = new Font(bfHelvetica, 12, Font.NORMAL, Color.BLACK);
Document doc = new Document(PageSize.LETTER, 18f, 18f, 18f, 18f);
FileStream fs = new FileStream("TextBoxInTableCell.pdf", FileMode.Create);
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
doc.Open();
PdfPTable myTable = new PdfPTable(1);
myTable.TotalWidth = 568f;
myTable.LockedWidth = true;
myTable.HorizontalAlignment = 0;
TextField tf = new TextField(writer, new iTextSharp.text.Rectangle(67, 585, 140, 800), "cellTextBox");
PdfPCell tbCell = new PdfPCell(new Phrase(" ", helvetica12));
iTextSharp.text.pdf.events.FieldPositioningEvents events =
new iTextSharp.text.pdf.events.FieldPositioningEvents(writer, tf.GetTextField());
tbCell.CellEvent = events;
myTable.AddCell(tbCell);
doc.Add(myTable);
doc.Close();
fs.Close();
Console.WriteLine("End Of Program Execution");
Console.ReadLine();
}
}
}
Bon oportunidad
Realmente no agregaría un ''campo de texto'' a un PdfPCell, crearía un PdfPCell y agregaría texto (u otras cosas) a eso.
mikesdotnetting.com podría tener el ejemplo más claro y siempre existe el tutorial iTextSharp .
La respuesta de DaveB funciona, pero el problema es que debes saber las coordenadas para ubicar el campo de texto, el (67, 585, 140, 800). El método más normal de hacer esto es crear la celda de la tabla y agregar un evento personalizado a la celda. Cuando la generación de la tabla llama al evento celllayout, le pasa las dimensiones y coordenadas de la celda que puede usar para colocar y dimensionar el campo de texto.
Primero crea esta llamada, que es el evento personalizado
public class CustomCellLayout : IPdfPCellEvent
{
private string fieldname;
public CustomCellLayout(string name)
{
fieldname = name;
}
public void CellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases)
{
PdfWriter writer = canvases[0].PdfWriter;
// rectangle holds the dimensions and coordinates of the cell that was created
// which you can then use to place the textfield in the correct location
// and optionally fit the textfield to the size of the cell
float textboxheight = 12f;
// modify the rectangle so the textfield isn''t the full height of the cell
// in case the cell ends up being tall due to the table layout
Rectangle rect = rectangle;
rect.Bottom = rect.Top - textboxheight;
TextField text = new TextField(writer, rect, fieldname);
// set and options, font etc here
PdfFormField field = text.GetTextField();
writer.AddAnnotation(field);
}
}
Luego, en su código donde crea la tabla, usará el evento de esta manera:
PdfPCell cell = new PdfPCell()
{
CellEvent = new CustomCellLayout(fieldname)
// set borders, or other cell options here
};
Si desea diferentes tipos de campos de texto puede hacer eventos personalizados adicionales, o puede agregar propiedades adicionales a la clase CustomCellLayout como "fontsize" o "multiline" que establecería con el constructor de la clase, y luego buscar en el Código de CellLayout para ajustar las propiedades del campo de texto.