2015-03-29 3 views
1

Я использую iText для создания pdf. Я хочу рисовать пунктирную линию в заголовке таблицы. Теперь я так стараюсь.Пунктирная линия сверху и снизу в iText

private void createTable(Document document) throws DocumentException { 
       Report_Page app = new Report_Page(); 
      float[] columnWidths = { 1.5f, 5f, 2f, 1.5f, 2f };   
      PdfPTable table = new PdfPTable(columnWidths); 

      table.setTotalWidth(300f); 

      PdfPCell cell = new PdfPCell(new Phrase("P.No")); 
      cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
      cell.setCellEvent(app.new DottedCell()); 
      cell.setBorder(Rectangle.NO_BORDER); 
      table.addCell(cell); 


      cell = new PdfPCell(new Phrase("Item Name")); 
      cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
      cell.setCellEvent(app.new DottedCell()); 
      cell.setBorder(Rectangle.NO_BORDER); 
      table.addCell(cell); 


      cell = new PdfPCell(new Phrase("Price")); 
      cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
      cell.setCellEvent(app.new DottedCell()); 
      cell.setBorder(Rectangle.NO_BORDER); 
      table.addCell(cell); 


      cell = new PdfPCell(new Phrase("Qty")); 
      cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
      cell.setCellEvent(app.new DottedCell()); 
      cell.setBorder(Rectangle.NO_BORDER); 
      table.addCell(cell); 


      cell = new PdfPCell(new Phrase("Ext Price")); 
      cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
      cell.setCellEvent(app.new DottedCell()); 
      cell.setBorder(Rectangle.NO_BORDER); 
      table.addCell(cell); 
      table.setHeaderRows(1);  


     } 


class DottedCell implements PdfPCellEvent { 

      @Override 
      public void cellLayout(PdfPCell cell, Rectangle position, 
        PdfContentByte[] canvases) { 
       PdfContentByte canvas = canvases[PdfPTable.LINECANVAS]; 
       canvas.setLineDash(3f, 3f); 
       canvas.rectangle(position.getLeft(), position.getBottom(), 
        position.getWidth(), position.getHeight()); 
       canvas.stroke(); 

      } 
     } 

Теперь O/P выглядит следующим образом. OP Image

Но я хочу удалить левую и правую границу. Пожалуйста, дайте мне понять, как удалить левую и правую границу.

Изображение для центра стола: Image

ответ

1

Пожалуйста, обратите внимание на пример с DottedLineHeader заголовка. У вас есть копия/вставленный код из DottedLineCell, и вы создаете полный прямоугольник вместо двух отдельных строк. Таким образом, ответ на ваш вопрос может быть: нарисовать две линии вместо четырех сторон прямоугольника:

class DottedCell implements PdfPCellEvent { 
    public void cellLayout(PdfPCell cell, Rectangle position, 
     PdfContentByte[] canvases) { 
     PdfContentByte canvas = canvases[PdfPTable.LINECANVAS]; 
     canvas.setLineDash(3f, 3f); 
     canvas.moveTo(position.getLeft(), position.getTop()); 
     canvas.lineTo(position.getRight(), position.getTop()); 
     canvas.moveTo(position.getLeft(), position.getBottom()); 
     canvas.lineTo(position.getRight(), position.getBottom()); 
     canvas.stroke(); 
    } 
} 

Хотя вы можете сказать: Эй, это работает!, я чувствовал бы себя виноватым, если бы вы приняли и поддержали такой андер, поскольку это не лучший ответ. Почему нет? Потому что вы будете рисовать отдельную строку для каждой ячейки с другой начальной точкой для первой тире каждой из этих строк.

Лучшее решение было бы определить строки заголовка в виде строк заголовков (с использованием метода setHeaderRows()) и рисовать линии, используя событие таблицы:

class DottedHeader implements PdfPTableEvent { 
    public void tableLayout(PdfPTable table, float[][] widths, 
     float[] heights, int headerRows, int rowStart, 
     PdfContentByte[] canvases) { 
     PdfContentByte canvas = canvases[PdfPTable.LINECANVAS]; 
     canvas.setLineDash(3f, 3f); 
     float x1 = widths[0][0]; 
     float x2 = widths[0][widths.length]; 
     canvas.moveTo(x1, heights[0]); 
     canvas.lineTo(x2, heights[0]); 
     canvas.moveTo(x1, heights[headerRows]); 
     canvas.lineTo(x2, heights[headerRows]); 
     canvas.stroke(); 
    } 
} 

В этом случае вы пишете только две строки для заголовок вместо нескольких строк при использовании события ячейки.

+0

Привет @Bruno Lowagie .. Спасибо за ваш ценный ответ. Я попробую и дам вам знать в ближайшее время .. – Vijay

+0

Привет @Bruno .. Это то, что я хочу. :-) Но я использую ваше первое решение (извините) .. Потому что я очень новичок в iText. Теперь только я изучаю iText. Должен выполнить свою задачу за 3 дня. Так что не делай меня. И я пытаюсь сосредоточить стол. Но я не могу. Я использую ** table.setHorizontalAlignment (Element.ALIGN_CENTER); **. Но не повезло .. :-( – Vijay

+0

Использование 'table.setHorizontalAlignment (Element.ALIGN_CENTER)' центрирует таблицу по горизонтали. См. Http://itextpdf.com/examples/iia.php?id=77 и взгляните на http: //examples.itxtpdf.com/results/part1/chapter04/table_alignment.pdf (Это работает, не так ли?) –

Смежные вопросы