Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ITextSharp - text field in PdfPCell

I'm using iTextSharp to create a PDF, how can I add a textField into PdfPCell?

like image 503
gigiot Avatar asked Apr 20 '10 14:04

gigiot


3 Answers

You wouldn't really add a 'text field' to a PdfPCell, you'd create a PdfPCell and add text (or other stuff) to that.

mikesdotnetting.com might have the clearest example and there's always the iTextSharp tutorial.

like image 190
Jay Riggs Avatar answered Oct 21 '22 06:10

Jay Riggs


Give this a try. It works for me.

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...

I adapted this code from this post.

Edit:

Here is a full working console application that puts a TextBox in a table cell. I tried to keep the code to a bare minimum.

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 chance

like image 31
DaveB Avatar answered Oct 21 '22 06:10

DaveB


DaveB's answer works, but the problem is that you have to know the coordinates to place the textfield into, the (67, 585, 140, 800). The more normal method of doing this is to create the table cell and add a custom event to the cell. When the table generation calls the celllayout event it passes it the dimensions and coordinates of the cell which you can use to place and size the textfield.

First create this call, which is the custom event

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

Then in your code where you create the table you'll use the event like this:

PdfPCell cell = new PdfPCell()
    {
        CellEvent = new CustomCellLayout(fieldname)
        // set borders, or other cell options here
    };

If you want to different kinds of textfields you can either make additional custom events, or you could add extra properties to the CustomCellLayout class like "fontsize" or "multiline" which you'd set with the class constructor, and then check for in the CellLayout code to adjust the textfield properties.

like image 2
Jeff S Avatar answered Oct 21 '22 04:10

Jeff S