20

I'm trying to generate a letter, leaving an empty spot and then paste over the top of it the address, depending on where the envelope window is going to be.

So I start off doing this:

Document doc = new Document(PageSize.LETTER, 72, 72, 72, 72);
var w = PdfWriter.GetInstance(doc, output);
Font font = FontFactory.GetFont("arial", 10);
doc.Open();
doc.Add(new Paragraph("date", font) { SpacingAfter = 5 });
doc.Add(new Paragraph("\n\n\n\n\n\n", font));//empty spot
doc.Add(new Paragraph("long\n paragraph\ns panning\ multiple\n lines\n", font) { SpacingAfter = 5 });
doc.Add(new Paragraph("long\n paragraph\ns panning\ multiple\n lines\n", font) { SpacingAfter = 5 });
doc.Add(new Paragraph("long\n paragraph\ns panning\ multiple\n lines\n", font) { SpacingAfter = 5 });
doc.Add(new Paragraph("long\n paragraph\ns panning\ multiple\n lines\n", font) { SpacingAfter = 5 });
doc.Add(new Paragraph("long\n paragraph\ns panning\ multiple\n lines\n", font) { SpacingAfter = 5 });

float llx = 63f, lly = 450f, urx = 387f, ury = 531f;
?? Somehow add "name\n address line 1\n address line2\n city state zip"

doc.Close();

I was hoping to be able to add some text at those coordinates, but I couldn't figure out how... anybody know a way to do it?

Bobrovsky
  • 13,789
  • 19
  • 80
  • 130
colinbashbash
  • 996
  • 2
  • 9
  • 19

3 Answers3

26

Found the answer "Here". (Below is quoted answer from Yannick Smits)

===============

Try this:

ColumnText ct = new ColumnText(cb);
Phrase myText = new Phrase("TEST paragraph\nNewline");
ct.SetSimpleColumn(myText, 34, 750, 580, 317, 15, Element.ALIGN_LEFT);
ct.Go();

parameters of SetSimpleColumn are:

  1. the phrase
  2. lower-left-x
  3. lower-left-y
  4. upper-right-x (llx + width)
  5. upper-right-y (lly + height)
  6. leading (The amount of blank space between lines of print)
  7. alignment.
Community
  • 1
  • 1
colinbashbash
  • 996
  • 2
  • 9
  • 19
  • What does Box Height and Box Width mean? (item 4,5) – Cocoa Dev Apr 03 '13 at 19:41
  • I think arguments 4 and 5 are `urx` and `ury`, not `box width` and `box height`. And argument 6 is `leading`, which I am not sure what it is, but 0f works for text, so it is not `line height`. – Mark Lakata Apr 17 '13 at 23:17
20

You can also use a ContentByte with a Text Matrix to draw text wherever you want.

PdfContentByte cb = writer.DirectContent;
cb.BeginText();
BaseFont f_cn = BaseFont.CreateFont("c:\\windows\\fonts\\calibri.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SetFontAndSize(f_cn, 6);
cb.SetTextMatrix(475, 15);  //(xPos, yPos)
cb.ShowText("Some text here and the Date: " + DateTime.Now.ToShortDateString());
cb.EndText();

The benefit is that if you don't have to draw the full size of the box the text will go into. With Simple Column, you are drawing a rectangle on the document, and positioning the text within it. With ContentByte, you dodge the rectangle, and position the text by itself.

Scotty H
  • 6,432
  • 6
  • 41
  • 94
Mike Varosky
  • 390
  • 1
  • 10
  • That's cool. I actually wanted to limit the text's width, though. So using ColumnText is actually more useful in my instance. Thanks! – colinbashbash Aug 08 '12 at 18:03
  • I was using the setSimpleColumn in a function call, and subsequent calls with the same measurements caused rather unpleasant positioning. Changing to this method fixed that very quickly! Thanks. – Andrew Neely Oct 14 '15 at 18:43
  • But using ShowText method you cannot set RunDirection for RTL languages. – Arman Apr 24 '17 at 11:59
1

Thanks a lot for your data, I love it but my english is very poor, sorry.

This is my code for iTextSharp etiquetas:

public void impriItex()
{
    iTextSharp.text.Font fontH1 = new iTextSharp.text.Font(FUENTE_BASE, 14, iTextSharp.text.Font.ITALIC);
    iTextSharp.text.Font fuente = new iTextSharp.text.Font(FUENTE_BASE, 12, iTextSharp.text.Font.NORMAL);
    iTextSharp.text.Font FUENTE_CABECERA_TABLA = new iTextSharp.text.Font(FUENTE_BASE, 10, iTextSharp.text.Font.BOLD);
    dataGridViewOculta.DataSource = fun.CargaDato(cargaVelores);
    dataGridViewTotales.DataSource = fun.CargaDato(cargaVelores);
    dataGridViewVentas.DataSource = fun.CargaDato(cargaVelores);
    //Letras
    //Tabla
    PdfPTable pdfTable = new PdfPTable(6);
    pdfTable.DefaultCell.Padding = 2;
    pdfTable.WidthPercentage = 40;
    pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
    pdfTable.DefaultCell.BorderWidth = 1;
    //cabeceras
    foreach (DataGridViewColumn column in dataGridViewOculta.Columns)
    {

        PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText, FUENTE_CABECERA_TABLA));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        cell.BackgroundColor = new iTextSharp.text.BaseColor(210, 240, 240);
        pdfTable.AddCell(cell);
    }

    //datos
    foreach (DataGridViewRow row in dataGridViewOculta.Rows)
    {
        try
        {
            foreach (DataGridViewCell cell in row.Cells)
            {
                String texto = cell.Value.ToString();
                String textovacio = texto.Replace("00:00:00", " ");
                PdfPCell cosa = new PdfPCell(new Phrase(textovacio, fuente));
                cosa.HorizontalAlignment = Element.ALIGN_CENTER;
                pdfTable.AddCell(cosa);
                pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
            }
        }
        catch { return; }
    }

    //Exporting to PDF
    string folderPath = "C:\\PDFs\\";
    if (!Directory.Exists(folderPath))
    {
        Directory.CreateDirectory(folderPath);
    }
    using (FileStream stream = new FileStream(folderPath + "Etiquetas.pdf", FileMode.Create))
    {
        Document pdfDoc = new Document(PageSize.A4, 0f, 0f, 0f, 0f);
        PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
        PdfPTable tabla = new PdfPTable(1);
        pdfDoc.Open();
        PdfContentByte cb = writer.DirectContent;
        PdfContentByte lineas = writer.DirectContent;

        for (int fila = 0; fila < dataGridViewVentas.Rows.Count - 1; fila++)
        {
            for (int col = 0; col < dataGridViewVentas.Rows[fila].Cells.Count; col++)
                labelTitulo.Text = "Etiquetas";
            Cantidad = dataGridViewVentas.Rows[fila].Cells[0].Value.ToString();
            IdColor = dataGridViewVentas.Rows[fila].Cells[1].Value.ToString();
            IdCategoria = dataGridViewVentas.Rows[fila].Cells[2].Value.ToString();
            NomCategoria = dataGridViewVentas.Rows[fila].Cells[3].Value.ToString();
            Colores = dataGridViewVentas.Rows[fila].Cells[4].Value.ToString();
            CodigoDeGrupo = dataGridViewVentas.Rows[fila].Cells[5].Value.ToString();
            lblNombreSocio.Text = IdColor + ":" + Cantidad;
            String espacio = "          ";
            Paragraph linea = new Paragraph("________________________________________________________", fuente);
            Paragraph lineaDoble = new Paragraph(Cantidad, fuente);
            Paragraph SocioPar = new Paragraph("Color:" + lblNombreSocio.Text, fuente);
            Paragraph SociedadPar = new Paragraph("Categoria: " + NomCategoria, fuente);
            Paragraph Titulo = new Paragraph(labelTitulo.Text, fontH1);
            Paragraph parrafoEspacio = new Paragraph(" ", fuente);
            linea.Alignment = Element.ALIGN_CENTER;
            lineaDoble.Alignment = Element.ALIGN_CENTER;
            Titulo.Alignment = Element.ALIGN_CENTER;

            SocioPar.Alignment = Element.ALIGN_CENTER;
            SociedadPar.Alignment = Element.ALIGN_CENTER;
            pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
            pdfDoc.Add(linea);
            pdfDoc.Add(Titulo);
            pdfDoc.Add(lineaDoble);
            pdfDoc.Add(parrafoEspacio);
            pdfDoc.Add(SocioPar);
            pdfDoc.Add(SociedadPar);

            // pdfDoc.Add(pdfTable);}
            for (int x = 0; x < Convert.ToInt32(Cantidad); x++)
            {
               cb.Rectangle(posx, posy, 40f, 25f);
                lineas.SetLineWidth(1);
                lineas.MoveTo(posx+20, posy+15);
                lineas.LineTo(posx+20,posy);
                lineas.Stroke();
             //   lineas.
                lineas.MoveTo(posx + 20, posy+10 );
                lineas.LineTo(posx, posy + 10);
                lineas.MoveTo(posx + 40, posy + 10);
                lineas.LineTo(posx, posy + 10);
                lineas.Stroke();
                //texto !!!!!!!!!!!
                lineas.BeginText();
                lineas.SetFontAndSize(FUENTE_BASE, 6);
                lineas.SetTextMatrix(posx, posy);
                lineas.ShowText(IdColor);
                lineas.EndText();
                //tabla.AddCell("prueba");
                // pdfDoc.Add(tabla);
                Chunk c = new Chunk(x.ToString());
               // iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(posx, 650f, 25f, 10f);
               // cb.Rectangle(rect);
                cb.Stroke();
                float nuevo = posx + 42f; 
                posx = nuevo;
                if (posx > 500f) 
                    { posx = 20; posy = posy-35f; }
            }
            pdfDoc.NewPage();               
            posx = 10f;
            posy = 700;
        }
        pdfDoc.Close();
        stream.Close();
    }
}
zx485
  • 28,498
  • 28
  • 50
  • 59