2016-09-16 4 views
0

Я использую iText 5.5.9. У меня есть PdfPTable, который я показываю внутри ColumnText. ColumnText имеет небольшую колонку и большую колонку.iText Таблица внутри ColumnText не keeptogether

Если таблица слишком велика для небольшого столбца, она должна перемещаться во второй, больший столбец. Как я могу это сделать?

Я пробовал использовать table.setKeepTogether(true), но это не работает. Я также попробовал предложение на этой странице (http://itext.2136553.n4.nabble.com/PdfPTable-KeepTogether-and-ColumnText-td2141501.html), чтобы обернуть мой стол во второй стол и использовать tableWrapper.setSplitRows(false). Но если я это сделаю, я больше не вижу стол.

Вот мой код:

public class PdfTest { 
    private static String filename = "C:/Users/Development/Documents/pdf_test.pdf"; 

    public static void main(String[] args) { 
     try { 
      new PdfTest(); 
      File f = new File(filename); 
      Desktop.getDesktop().open(f); 
     } catch (DocumentException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public PdfTest() throws DocumentException, IOException { 
     File file = new File(filename); 
     OutputStream os = new FileOutputStream(file); 

     Document document = new Document(); 
     PdfWriter writer = PdfWriter.getInstance(document, os); 

     document.open(); 

     PdfContentByte canvas = writer.getDirectContent(); 

     printPage1(document, canvas); 

     document.newPage(); 

     printPage2(document, canvas); 

     document.close(); 
     os.close(); 
    } 

    private void printPage1(Document document, PdfContentByte canvas) throws DocumentException { 
     int cols = 3; 
     int rows = 15; 

     PdfPTable table = new PdfPTable(cols); 
     for (int row = 0; row < rows; row++) { 
      for (int col = 0; col < cols; col++) { 
       table.addCell(new Phrase("Cell " + row + ", " + col)); 
      } 
     } 

     Paragraph paragraph = new Paragraph(); 
     paragraph.add(table); 

     ColumnText columnText = new ColumnText(canvas); 
     columnText.addElement(new Paragraph("This table should keep together!")); 
     columnText.addElement(paragraph); 

     int status = ColumnText.START_COLUMN; 

     Rectangle docBounds = document.getPageSize(); 

     Rectangle bounds = new Rectangle(docBounds.getLeft(20), docBounds.getTop(20) - 200, docBounds.getRight(20), docBounds.getTop(20)); 
     bounds.setBorder(Rectangle.BOX); 
     bounds.setBorderColor(BaseColor.BLACK); 
     bounds.setBorderWidth(1); 
     bounds.setBackgroundColor(new BaseColor(23, 142, 255, 20)); 

     canvas.rectangle(bounds); 

     columnText.setSimpleColumn(bounds); 

     status = columnText.go(); 

     if (ColumnText.hasMoreText(status)) { 
      bounds = new Rectangle(docBounds.getLeft(20), docBounds.getBottom(20), docBounds.getRight(20), docBounds.getBottom(20) + 600); 
      bounds.setBorder(Rectangle.BOX); 
      bounds.setBorderColor(BaseColor.BLACK); 
      bounds.setBorderWidth(1); 
      bounds.setBackgroundColor(new BaseColor(255, 142, 23, 20)); 

      canvas.rectangle(bounds); 

      columnText.setSimpleColumn(bounds); 

      status = columnText.go(); 
     } 
    } 


    private void printPage2(Document document, PdfContentByte canvas) throws DocumentException { 
     int cols = 3; 
     int rows = 15; 

     PdfPTable table = new PdfPTable(cols); 
     for (int row = 0; row < rows; row++) { 
      for (int col = 0; col < cols; col++) { 
       table.addCell(new Phrase("Cell " + row + ", " + col)); 
      } 
     } 

     PdfPTable tableWrapper = new PdfPTable(1); 
     tableWrapper.addCell(table); 
     tableWrapper.setSplitRows(false); 

     Paragraph paragraph = new Paragraph(); 
     paragraph.add(tableWrapper); 

     ColumnText columnText = new ColumnText(canvas); 
     columnText.addElement(new Paragraph("This table should keep together!")); 
     columnText.addElement(tableWrapper); 

     int status = ColumnText.START_COLUMN; 

     Rectangle docBounds = document.getPageSize(); 

     Rectangle bounds = new Rectangle(docBounds.getLeft(20), docBounds.getTop(20) - 200, docBounds.getRight(20), docBounds.getTop(20)); 
     bounds.setBorder(Rectangle.BOX); 
     bounds.setBorderColor(BaseColor.BLACK); 
     bounds.setBorderWidth(1); 
     bounds.setBackgroundColor(new BaseColor(23, 142, 255, 20)); 

     canvas.rectangle(bounds); 

     columnText.setSimpleColumn(bounds); 

     status = columnText.go(); 

     if (ColumnText.hasMoreText(status)) { 
      bounds = new Rectangle(docBounds.getLeft(20), docBounds.getBottom(20), docBounds.getRight(20), docBounds.getBottom(20) + 600); 
      bounds.setBorder(Rectangle.BOX); 
      bounds.setBorderColor(BaseColor.BLACK); 
      bounds.setBorderWidth(1); 
      bounds.setBackgroundColor(new BaseColor(255, 142, 23, 20)); 

      canvas.rectangle(bounds); 

      columnText.setSimpleColumn(bounds); 

      status = columnText.go(); 
     } 
    } 

} 

EDIT: Я теперь понимаю, что я спрашиваю о решении, а не о самой проблеме. Поэтому я делаю шаг назад.

Идея состоит в том, что PDF-файл имеет дополнительное пространство для окна конверта на первой странице. В этом окне будет отображаться адрес. Это разделение остальной части (первой) страницы на две области выше и ниже окна конверта. Я попытался решить это с помощью ColumnText. Я добавил заголовок, который отображается аккуратно над окном конверта. Затем я добавил таблицу. Эта таблица отображается частично над и под окном конверта. Таким образом, эти буквы могут содержать больше, чем просто таблицы и, возможно, несколько таблиц и абзацев.

+0

Вы пытались воспроизвести проблему с более поздней версией IText 5? Наш текущий выпуск - 5.5.9, проблема, с которой вы столкнулись, может быть исправлена ​​тем временем. –

+0

Также есть серьезные технические проблемы со всеми версиями 5.2.x. В 5.2.0 мы переключились с использования 'int' в' long' для позиций байтов, но из-за ошибки некоторые значения 'long' меняются на' int', что приводит к поврежденному PDF-файлу. Мы отменили все версии 5.2.x, предупредили всех клиентов и [сообщили неоплачиваемым пользователям] (http://developers.itextpdf.com/content/changelogs/itext-520-521-february-29-2012-march- 31-2012). Вы безответственно используете эту версию. –

+0

Спасибо за отзыв. Я изучу обновление iText. – Dalendrion

ответ

0

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

Такой метод может выглядеть следующим образом:

Rectangle[] drawKeepTogether(Element element, PdfContentByte canvas, Rectangle... rectangles) throws DocumentException 
{ 
    int i = 0; 
    for (; i < rectangles.length; i++) 
    { 
     ColumnText columnText = new ColumnText(canvas); 
     columnText.addElement(element); 
     columnText.setSimpleColumn(rectangles[i]); 
     int status = columnText.go(true); 
     if (!ColumnText.hasMoreText(status)) 
      break; 
    } 

    if (i < rectangles.length) 
    { 
     Rectangle rectangle = rectangles[i]; 
     ColumnText columnText = new ColumnText(canvas); 
     columnText.addElement(element); 
     columnText.setSimpleColumn(rectangle); 
     columnText.go(false); 

     Rectangle[] remaining = new Rectangle[rectangles.length-i]; 
     System.arraycopy(rectangles, i, remaining, 0, remaining.length); 
     remaining[0] = new Rectangle(rectangle.getLeft(), rectangle.getBottom(), rectangle.getRight(), columnText.getYLine()); 
     return remaining; 
    } 

    return new Rectangle[0]; 
} 

(TableKeepTogether.java метод drawKeepTogether)

Если используется так:

private void printPage3(Document document, PdfContentByte canvas) throws DocumentException { 
    int cols = 3; 
    int rows = 15; 

    PdfPTable table = new PdfPTable(cols); 
    for (int row = 0; row < rows; row++) { 
     for (int col = 0; col < cols; col++) { 
      table.addCell(new Phrase("Cell " + row + ", " + col)); 
     } 
    } 
    table.setSpacingBefore(5); 

    Rectangle docBounds = document.getPageSize(); 
    Rectangle upper = new Rectangle(docBounds.getLeft(20), docBounds.getTop(20) - 200, docBounds.getRight(20), docBounds.getTop(20)); 
    upper.setBackgroundColor(new BaseColor(23, 142, 255, 20)); 
    Rectangle lower = new Rectangle(docBounds.getLeft(20), docBounds.getBottom(20), docBounds.getRight(20), docBounds.getBottom(20) + 600); 
    lower.setBackgroundColor(new BaseColor(255, 142, 23, 20)); 
    Rectangle[] rectangles = new Rectangle[] { upper, lower }; 

    for (Rectangle bounds : rectangles) 
    { 
     bounds.setBorder(Rectangle.BOX); 
     bounds.setBorderColor(BaseColor.BLACK); 
     bounds.setBorderWidth(1); 

     canvas.rectangle(bounds); 
    } 

    rectangles = drawKeepTogether(new Paragraph("This table should keep together!"), canvas, rectangles); 
    rectangles = drawKeepTogether(table, canvas, rectangles); 
} 

(TableKeepTogether.java метод printPage3)

страница генерируется с помощью этого метода выглядит следующим образом:

keepTogetherTableInColumnText.pdf page 3

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

  • Нет связанных вопросов^_^