2010-04-20 20 views

risposta

7

Non aggiungerei realmente un "campo di testo" a un PdfPCell, dovresti creare un PdfPCell e aggiungere del testo (o altro) a quello.

mikesdotnetting.com potrebbe avere il clearest example e c'è sempre il iTextSharp tutorial.

+0

Conosco questo collegamento, ma sei sicuro di non poter aggiungere un campo di testo in PdfPCell? Sto guardando questo link http://old.nabble.com/PdfPTable-TextField-in-PdfPCell:-questions-td17984107.html, ma non capisco se farlo. Ho bisogno di aggiungere un campo di testo in PdfPCell, perché dopo la creazione di pdf ho bisogno di inserire una informazione in questi campi. – gigiot

7

Provatelo. Per me funziona.

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

mi sono adattato questo codice da this post.

Edit:

Ecco un'applicazione console di lavoro completa che mette un TextBox in una cella di una tabella. Ho provato a mantenere il codice al minimo.

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 possibilità

+0

Niente ... dopo questa istruzione myTable.AddCell (tbCell); controllo con debug il mio oggetto tbCell, ma vedo che le dimensioni del rettangolo sono 0x0 .. è normale? – gigiot

+0

Ho aggiornato la mia risposta. – DaveB

+0

Grazie Dave, mi hai fatto la spia !!! ho provato il tuo codice e funziona perfettamente. Ora sto cercando di unire 3 file pdf, ma dopo aver unito tutti i TextField sono scomparsi .. c'è una proprietà del documento che devo pianificare per evitare questo? – gigiot

2

opere risposta di DaveB, ma il problema è che devi conoscere le coordinate per posizionare il campo di testo in, il (67, 585, 140, 800). Il metodo più normale consiste nel creare la cella della tabella e aggiungere un evento personalizzato alla cella. Quando la generazione della tabella chiama l'evento celllayout, le passa le dimensioni e le coordinate della cella che è possibile utilizzare per posizionare e ridimensionare il campo di testo.

Innanzitutto creare questa chiamata, che è l'evento personalizzato

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

Poi nel codice in cui si crea la tabella si utilizza l'evento come questo:

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

Se si desidera diversi tipi di campi di testo puoi creare ulteriori eventi personalizzati oppure puoi aggiungere proprietà aggiuntive alla classe CustomCellLayout come "fontsize" o "multiline" che avresti impostato con il costruttore della classe e quindi verificare nel codice CellLayout per regolare le proprietà del campo di testo.

+0

Oh, si! Questa è una meraviglia personificata, errata ... codificata. –

+0

Cosa fare se si desidera creare caselle di controllo - come deve essere modificato il codice sopra per quell'evento (non è previsto il gioco di parole)? –

+1

@ B.ClayShannon aggiungere un RadioCheckField invece di un campo di testo.Il rettangolo passato al costruttore di RadioCheckField deve essere creato utilizzando il rettangolo passato nel CellLayout regolato con l'offset e le dimensioni della casella di controllo che si desidera. –