ITextSharp - PdfPCell中的文本字段

时间:2010-04-20 14:25:25

标签: pdf itextsharp textfield

我正在使用iTextSharp创建PDF,如何将textField添加到PdfPCell中?

3 个答案:

答案 0 :(得分:7)

你不会真正向PdfPCell添加'文本字段',你要创建一个PdfPCell并添加文本(或其他东西)。

mikesdotnetting.com可能有clearest example,并且始终有iTextSharp tutorial

答案 1 :(得分:7)

试一试。它对我有用。

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

我从this post.

改编了这段代码

修改

这是一个完整的工作控制台应用程序,它将TextBox放在表格单元格中。我试图将代码保持在最低限度。

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

机会

答案 2 :(得分:2)

DaveB的答案有效,但问题是你必须知道将文本字段放入的坐标,(67,585,140,​​800)。更常见的方法是创建表格单元格并向单元格添加自定义事件。当表生成调用celllayout事件时,它会传递单元格的尺寸和坐标,您可以使用它来放置文本字段并调整其大小。

首先创建此调用,即自定义事件

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

然后在您创建表格的代码中,您将使用如下事件:

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

如果您想要不同类型的文本字段,您可以创建其他自定义事件,或者您可以向CustomCellLayout类添加额外的属性,例如您使用类构造函数设置的“fontsize”或“multiline”,然后检查用于在CellLayout代码中调整文本域属性。