Sto usando iTextSharp per creare un PDF, come posso aggiungere un campo di testo in PdfPCell?ITextSharp - campo di testo in PdfPCell
risposta
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.
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à
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
Ho aggiornato la mia risposta. – DaveB
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
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.
Oh, si! Questa è una meraviglia personificata, errata ... codificata. –
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)? –
@ 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. –
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