2011-02-04 11 views
6

Próbuję dodać poziomą linię na górze, aby podzielić tekst nagłówka od rzeczywistych wartości w moim pliku PDF: enter image description hereKodeks nie rysuje poziomą linię w moim PDF

Oto mój kod:

public class StudentList 
{ 
    public void PrintStudentList(int gradeParaleloID) 
    { 
     StudentRepository repo = new StudentRepository(); 
     var students = repo.FindAllStudents() 
          .Where(s => s.IDGradeParalelo == gradeParaleloID); 

     try 
     { 
      Document document = new Document(PageSize.LETTER); 

      PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\Alumnos.pdf", FileMode.Create)); 
      document.Open(); 

      PdfContentByte cb = writer.DirectContent; 
      cb.SetLineWidth(2.0f); // Make a bit thicker than 1.0 default 
      cb.SetGrayStroke(0.95f); // 1 = black, 0 = white 
      cb.MoveTo(20, 30); 
      cb.LineTo(400, 30); 
      cb.Stroke(); 

      PdfPTable table = new PdfPTable(3);     
      float[] widths = new float[] { 0.6f, 0.75f, 2f }; 
      table.SetWidths(widths); 
      PdfPCell numeroCell = new PdfPCell(new Phrase("Nro.")); 
      numeroCell.Border = 0; 
      numeroCell.HorizontalAlignment = 0; 
      table.AddCell(numeroCell); 

      PdfPCell codigoCell = new PdfPCell(new Phrase("RUDE")); 
      codigoCell.Border = 0; 
      codigoCell.HorizontalAlignment = 0; 
      table.AddCell(codigoCell); 

      PdfPCell nombreCell = new PdfPCell(new Phrase("Apellidos y Nombres")); 
      nombreCell.Border = 0; 
      nombreCell.HorizontalAlignment = 0; 
      table.AddCell(nombreCell); 

      int c = 1; 
      foreach (var student in students) 
      { 
       PdfPCell cell = new PdfPCell(new Phrase(c.ToString())); 
       cell.Border = 0; 
       cell.HorizontalAlignment = 0; 
       table.AddCell(cell); 

       cell = new PdfPCell(new Phrase(student.Rude.ToString())); 
       cell.Border = 0; 
       cell.HorizontalAlignment = 0; 
       table.AddCell(cell); 

       cell = new PdfPCell(new Phrase(student.LastNameFather + " " + student.LastNameMother + " " + student.Name)); 
       cell.Border = 0; 
       cell.HorizontalAlignment = 0; 
       table.AddCell(cell); 
       c++; 
      } 
      table.SpacingBefore = 20f; 
      table.SpacingAfter = 30f; 

      document.Add(table); 
      document.Close(); 
     } 
     catch (DocumentException de) 
     { 
      Debug.WriteLine(de.Message); 
     } 
     catch (IOException ioe) 
     { 
      Debug.WriteLine(ioe.Message); 
     } 

    } 
} 

Nie rozumiem, dlaczego funkcja cb.Stroke() nie działa. Jakieś sugestie?

+0

FYI: SetGrayStroke wydaje się być rzeczywiście 0 = czarny , 1 = biały. –

Odpowiedz

12

Rysowanie za pomocą klasy iTextSharp w klasie PdfContentByte może być nieco mylące. Wysokość jest faktycznie w stosunku do dna, a nie do góry. Tak więc górna część strony to nie 0f, ale w rzeczywistości jest to document.Top, która na twojej stronie rozmiar PageSize.LETTER wynosi 726f. Więc jeśli chcesz narysować linię 30 jednostek z góry, spróbuj:

cb.MoveTo(20, document.Top - 30f); 
cb.LineTo(400, document.Top - 30f); 

prostu ciekawi - dlaczego to w przykry sposób, zamiast używać obramowania tabeli? (Zauważyłem, że ustawiłeś swoje granice na 0). Najtrudniejszym zadaniem jest ręczne wycinanie linii. Jeśli kiedykolwiek przeniesiesz zawartość do pliku PDF, musisz się upewnić, że pomiary nadal działają.

Spróbuj tego:

numeroCell.Border = 0; 
numeroCell.BorderColorBottom = new BaseColor(System.Drawing.Color.Black); 
numeroCell.BorderWidthBottom = 1f; 

codigoCell.Border = 0; 
codigoCell.BorderColorBottom = new BaseColor(System.Drawing.Color.Black); 
codigoCell.BorderWidthBottom = 1f; 

nombreCell.Border = 0; 
nombreCell.BorderColorBottom = new BaseColor(System.Drawing.Color.Black); 
nombreCell.BorderWidthBottom = 1f; 

To powinno dać miłego solidną czarną linię pod wiersz nagłówka, żadne pomiary potrzebne:

Table border sample

+0

To fantastyczne! Dziękuję Ci! –

Powiązane problemy