2015-04-02 2 views
0

Я очень новичок в iText. Я пытаюсь создать таблицу и абзац на той же странице.Создать таблицу и абзац на одной странице с помощью iText

Я хочу создать таблицу, и я хочу добавить пункт вверху и внизу таблицы.

Здесь я прилагается код и изображение. Пожалуйста, просмотрите и дайте мне любую идею, чтобы решить проблему.

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

private void createBill(Document document) throws DocumentException { 

    paragraph = new Paragraph("Hotel VApps"); 
    paragraph.setAlignment(Element.ALIGN_CENTER); 
    document.add(paragraph); 

    paragraph = new Paragraph("Phone: 9943123999"); 
    paragraph.setAlignment(Element.ALIGN_CENTER); 
    document.add(paragraph); 

    paragraph = new Paragraph("Email : [email protected]"); 
    paragraph.setAlignment(Element.ALIGN_CENTER); 
    document.add(paragraph); 

    DottedLineSeparator separator = new DottedLineSeparator(); 
    separator.setPercentage(59500f/523f); 
    Chunk linebreak = new Chunk(separator); 
    document.add(linebreak); 

    paragraph = new Paragraph("Bill No: 12345"); 
    paragraph.setAlignment(Element.ALIGN_LEFT); 
    document.add(paragraph); 

    paragraph = new Paragraph("Bill Date: 01/04/2015 10:30:55 PM"); 
    paragraph.setAlignment(Element.ALIGN_LEFT); 
    document.add(paragraph); 

    Report_Page app = new Report_Page(); 
    float[] columnWidths = { 1.5f, 5f, 2f, 1.5f, 2f };  
    table = new PdfPTable(columnWidths); 
    table.setTotalWidth(300f); 
    table.setHorizontalAlignment(Element.ALIGN_CENTER); 

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

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

    cell = new PdfPCell(new Phrase("Price")); 
    cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 
    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_RIGHT); 
    cell.setCellEvent(app.new DottedCell()); 
    cell.setBorder(Rectangle.NO_BORDER); 
    table.addCell(cell); 
    table.setHeaderRows(1); 

    sqlcon.open(); 
    Cursor c = sqlcon.readOrderedItems(""); 
    int rows = c.getCount(); 
    c.moveToFirst(); 

    for (int i = 0; i < rows; i++) { 
     cell = new PdfPCell(new Phrase(String.valueOf(i + 1))); 
     cell.setHorizontalAlignment(Element.ALIGN_LEFT); 
     cell.setBorder(Rectangle.NO_BORDER); 
     table.addCell(cell); 

     cell = new PdfPCell(new Phrase(c.getString(0))); 
     cell.setHorizontalAlignment(Element.ALIGN_LEFT); 
     cell.setBorder(Rectangle.NO_BORDER); 
     table.addCell(cell); 

     cell = new PdfPCell(new Phrase(c.getString(2))); 
     cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 
     cell.setBorder(Rectangle.NO_BORDER); 
     table.addCell(cell); 

     cell = new PdfPCell(new Phrase(c.getString(1))); 
     cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
     cell.setBorder(Rectangle.NO_BORDER); 
     table.addCell(cell); 

     total += Double.parseDouble(c.getString(3)); 

     cell = new PdfPCell(new Phrase(c.getString(3))); 
     cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 
     cell.setBorder(Rectangle.NO_BORDER); 
     table.addCell(cell); 
     c.moveToNext(); 
    } 

    sqlcon.close(); 


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

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

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

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

    cell = new PdfPCell(new Phrase(String.valueOf(total))); 
    cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 
    cell.setCellEvent(app.new DottedCell()); 
    cell.setBorder(Rectangle.NO_BORDER); 
    table.addCell(cell); 


    DottedLineSeparator separator1 = new DottedLineSeparator(); 
    separator1.setPercentage(59500f/523f); 
    Chunk linebreak1 = new Chunk(separator); 
    document.add(linebreak1); 

    paragraph = new Paragraph("Thank You"); 
    paragraph.setAlignment(Element.ALIGN_LEFT); 
    document.add(paragraph); 

    table.writeSelectedRows(0, -1, document.leftMargin(), 650, 
      docWriter.getDirectContent()); 
} 

Выход:

Out put Image

Желаемый результат:

Expected OP

Пожалуйста, дайте мне любую идею, чтобы создать PDF-файл, как это.

ответ

1

Вы смешиваете два разных (обычно эксклюзивных) подхода.

С одной стороны, вы передаете макет iText. Вы можете сделать это с помощью линий, таких как:

document.add(paragraph); 

В этом случае IText отслеживает y положения на странице и создает новую страницу, когда это необходимо.

С другой стороны, вы берете на себя управление макетом. Это можно сделать, добавив, содержание в абсолютном положении:

table.writeSelectedRows(0, -1, document.leftMargin(), 650, 
     docWriter.getDirectContent()); 

В этом случае IText не следить за y позиции. Вы несете ответственность за это.

Вам нужно будет выбрать один из двух подходов.

Либо вы позволите IText сделать макет и заменить метод writeSelectedRows() на document.add():

document.add(table); 
paragraph = new Paragraph("Thank You"); 
paragraph.setAlignment(Element.ALIGN_LEFT); 
document.add(paragraph); 

Теперь paragraph будет следовать за стол.

Или вы должны добавить все содержимое в абсолютном положении:

float y = table.writeSelectedRows(0, -1, document.leftMargin(), 650, 
     docWriter.getDirectContent()); 
// Add the *Thank You* paragraph at position y 

Я бы посоветовал вам, чтобы IText сделать макет, потому что есть некоторые недостатки в нашей конструкции. Вы жестко закодировали позицию 650. Как вы определили эту позицию?

Кроме того, writeSelectedRows() не разбивает таблицу, если она не соответствует странице. Вы несете ответственность за вычисление высоты каждой строки и запуск newPage(), когда таблица слишком велика. (Просто добавьте еще несколько строк в таблицу, чтобы проверить это, вы увидите.)

Я не говорю, что определить полный макет самостоятельно (используя ColumnText, вы можете работать очень точно) , Я только говорю, что это больше работы.

+0

Спасибо. Теперь я понимаю, где я ошибся, спасибо еще раз .. !! –

+0

Спасибо за ваши ответы сэр. Теперь я создал счет. !! :-) Но теперь еще одно сомнение сэр. Я хочу распечатать этот счет в POS-принтере. Размер бумаги составит 58 мм. Этот PDF-формат выглядит как A4. Как изменить размер этой страницы для размера принтера POS? Если продукты идут более чем на 100, значит, мне нужно использовать новую страницу. Для этого, как я могу распечатать счет в одном документе. Извините за беспокойство, сэр. Теперь у меня нет другой руки, чтобы помочь мне сэр. Пожалуйста, дайте мне знать сэр .. –

+0

Опубликовать это как отдельный вопрос пожалуйста. Не используйте раздел комментариев для создания новых вопросов. –

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