开发者

ITextSharp - text field in PdfPCell

开发者 https://www.devze.com 2022-12-28 01:21 出处:网络
I\'m using iTextSharp to create a PDF, how can I add a textField into PdfPCell?开发者_JAVA技巧You wouldn\'t really add a \'text field\' to a PdfPCell, you\'d create a PdfPCell and add text (or other s

I'm using iTextSharp to create a PDF, how can I add a textField into PdfPCell?开发者_JAVA技巧


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.


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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消