2012-08-07 48 views
16

Tôi đang cố gắng tạo một chữ cái, để lại một vị trí trống và sau đó dán lên trên cùng của địa chỉ, tùy thuộc vào nơi cửa sổ phong bì sẽ hiển thị.Thêm văn bản vị trí tuyệt đối

Vì vậy, tôi bắt đầu làm điều này:

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

Tôi đã hy vọng để có thể thêm một số văn bản ở những tọa độ, nhưng tôi không thể tìm ra cách ... ai biết một cách để làm điều đó ?

Trả lời

21

Tìm câu trả lời "Here". (Dưới đây là trích dẫn câu trả lời từ Yannick Smits)

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

Hãy thử điều này:

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

thông số của SetSimpleColumn là:

  1. cụm từ
  2. lower-left-x
  3. lower-left-y
  4. trên bên phải-x (LLX + chiều rộng)
  5. trên bên phải-y (lly + chiều cao)
  6. hàng đầu (Lượng khoảng trống giữa các dòng in)
  7. liên kết.
+0

không Box Height và Width Hộp nghĩa là gì? (mục 4.5) –

+0

Tôi nghĩ đối số 4 và 5 là 'urx' và' ury', không phải 'chiều rộng hộp' và' chiều cao hộp'. Và đối số 6 là 'hàng đầu', mà tôi không chắc chắn nó là gì, nhưng 0f làm việc cho văn bản, do đó, nó không phải là' chiều cao dòng'. –

+0

Cảm ơn Mark. Tôi sửa nó rồi. – colinbashbash

16

Bạn cũng có thể sử dụng ContentByte với Ma trận văn bản để vẽ văn bản ở bất cứ đâu bạn muốn.

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

Lợi ích là nếu bạn không phải vẽ kích thước đầy đủ của hộp văn bản sẽ đi vào. Với Cột đơn giản, bạn đang vẽ một hình chữ nhật trên tài liệu và định vị văn bản bên trong nó. Với ContentByte, bạn né tránh hình chữ nhật và tự định vị văn bản.

+0

Thật tuyệt. Tôi thực sự muốn giới hạn chiều rộng của văn bản, mặc dù. Vì vậy, việc sử dụng ColumnText thực sự hữu ích hơn trong ví dụ của tôi. Cảm ơn! – colinbashbash

+0

Tôi đã sử dụng setSimpleColumn trong một cuộc gọi chức năng và các cuộc gọi tiếp theo với cùng số đo gây ra vị trí khá khó chịu. Thay đổi phương pháp này cố định rất nhanh chóng! Cảm ơn. –

+0

Nhưng sử dụng phương pháp ShowText bạn không thể thiết lập RunDirection cho ngôn ngữ RTL. – Arman

0

Cảm ơn rất nhiều vì dữ liệu của bạn, tôi thích nó nhưng tiếng anh của tôi rất kém, xin lỗi.

Đây là mã của tôi cho 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(); 
    } 
} 
Các vấn đề liên quan