Itext7 - Как создать PDF-файл с 2 столбцами и 4 строками на странице с изображениями в java - PullRequest
1 голос
/ 04 августа 2020

У меня есть следующий код для создания одного PDF-файла с 2 столбцами и 4 строками. Каждая ячейка содержит изображение.

int labelCount = x;
int columns = 2;
int labelsPerPage = 8;
int rows = labelCount/columns;
int resto = labelCount%columns;
if(resto>0) rows++;

String dest = "path_to_pdf_file";
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc);
doc.setMargins(0, 0, 0, 0);

Table table = new Table(UnitValue.createPercentArray(columns)).useAllAvailableWidth();
Integer iCount = 0;

for (int i = 1; i <= rows; i++) {
    for (int y = 1; y <= columns; y++) {
        
        if(iCount<labelCount) {                 
            String fileName = "name_of_image";
            Cell cell = new Cell();
            cell.add(new com.itextpdf.layout.element.Image(ImageDataFactory.create("full_path_to_image")).setAutoScale(true));
            cell.setBorder(Border.NO_BORDER);
            table.addCell(cell);
            iCount++;
            
            if(iCount==labelsPerPage-1) {
                doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
            }
        }
    }
}        

doc.add(table);
doc.close();

Если количество меток превышает установленный предел (8 на страницу), я хочу, чтобы новая страница была создана со следующими метками.

В мой код я использовал

doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));

, но он генерирует (я не знаю почему) пустую страницу в начале. На второй странице есть ярлыки.

Как правильно динамически добавлять новую страницу и помещать на нее оставшееся содержимое?

Спасибо

1 Ответ

0 голосов
/ 04 августа 2020

По сути, в вашем коде вы добавляете AreaBreak в документ перед добавлением таблицы, поэтому перед таблицей вставляется пустая страница. iText 7 не позволяет вставлять разрывы страниц в таблицы на этом этапе. Для достижения желаемого результата вам необходимо sh перенести существующую таблицу в документ перед переходом на следующую страницу и создать новую таблицу для следующей страницы. По сути, вы добавите кучу таблиц, разделенных AreaBreak.

Псевдокод, который не требует значительных изменений в вашем коде, может выглядеть следующим образом:

Table table = new Table();
for (...) {
    // populate table
    if ("it's time to insert a page break") {
        doc.add(table);
        doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        table = new Table(); // create new table
    }
}
doc.add(table);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...