Как распечатать две параллельные таблицы бок о бок в iText7, отображая их на одной странице за раз, а затем добавляя новую страницу - PullRequest
1 голос
/ 08 мая 2020

Я хочу добавить две параллельные таблицы (таблицы содержат более одной страницы) бок о бок в iText7. Визуализация должна выполняться как:

Визуализируйте две таблицы на странице 1, затем добавьте новую страницу. Затем визуализируйте оставшуюся часть таблиц на второй странице. Если они все еще переполняются, добавьте еще одну страницу. Добавьте оставшуюся часть таблицы на странице 3 и т. Д.

Вот подход, который используется в iText5 для этого сценария. Основной код:

ColumnText[] columns = new ColumnText[2];
columns[0]=column1;
columns[1]=column3;
while (addColumns(columns)) {
    addNewPage(true, pageId, document, writer);
    columns[0].setSimpleColumn(10 * dpiRatio, pageStart * dpiRatio,(10+434) * dpiRatio,pageFooter * dpiRatio);
    columns[1].setSimpleColumn(400 * dpiRatio, pageStart * dpiRatio,800 * dpiRatio,pageFooter * dpiRatio);
}

Вспомогательные методы:

public boolean addColumns(ColumnText[] columns) throws DocumentException {
    int status = ColumnText.NO_MORE_TEXT;

    for (ColumnText column : columns) {
        if (ColumnText.hasMoreText(column.go()))
            status = ColumnText.NO_MORE_COLUMN;
    }
    return ColumnText.hasMoreText(status);
}


public void addNewPage(boolean applyHeaderFooter, int pageId,Document document, PdfWriter writer) {
    document.newPage();
    writer.setPageEmpty(false);
}

Пожалуйста, предложите такой подход в iText7.

1 Ответ

0 голосов
/ 22 мая 2020
public class TableOperations {

  public static void main(String[] args) {

    try {
        File outputFile = new File("Abc.pdf");
        PdfWriter writer = new PdfWriter(outputFile);
        PdfDocument pdfDocument = new PdfDocument(writer);
        pdfDocument.setTagged();
        addTablesInDocument(pdfDocument);
        Document document = new Document(pdfDocument);
        document.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

public static void addTablesInDocument(PdfDocument pdfDocument) {
    PdfPage pdfPage = pdfDocument.addNewPage();
    PdfCanvas pdfCanvas = new PdfCanvas(pdfPage);
    Rectangle pageSize = pdfPage.getPageSizeWithRotation();
    float currentHeight = pageSize.getHeight() - 40;
    Canvas canvas = new Canvas(pdfCanvas, pdfDocument, pageSize);
    for (int i = 0; i < 100; i++) {
        float[] columnWidth = {
            5f, 5f
        };
        Table tableLeft =
            new Table(columnWidth).setFontSize(8).setTextAlignment(TextAlignment.CENTER);
        Table tableRight =
            new Table(columnWidth).setFontSize(8).setTextAlignment(TextAlignment.CENTER);
        // Adds the data in the table
        addRowInTable(tableLeft);
        addRowInTable(tableRight);
        // If you want to operate left and right tables differently then you can get the height of
        // right table as well
        float height = getHeightOfTable(canvas, tableLeft);
        // Here we are checking if the height of table is getting out of the page, if yes then we move
        // the table to next page
        if ((currentHeight - height) <= 40) {
            PdfPage newPdfPage = pdfDocument.addNewPage();
            PdfCanvas newPdfCanvas = new PdfCanvas(newPdfPage);
            canvas = new Canvas(newPdfCanvas, pdfDocument, pageSize);
            currentHeight = pageSize.getHeight() - 40;
        }
        tableLeft.setFixedPosition(20, currentHeight, (pageSize.getWidth() / 2) - 30);
        tableRight.setFixedPosition((pageSize.getWidth() / 2) + 10, currentHeight, (pageSize.getWidth() / 2) - 30);
        currentHeight = currentHeight - height;
        canvas.add(tableLeft);
        canvas.add(tableRight);
    }
}

public static float getHeightOfTable(Canvas canvas, Table table) {
    IRenderer pRenderer = table.createRendererSubTree().setParent(canvas.getRenderer());
    LayoutResult pLayoutResult =
        pRenderer.layout(new LayoutContext(new LayoutArea(0, canvas.getRootArea())));
    return pLayoutResult.getOccupiedArea().getBBox().getHeight();
}

public static Cell getNewCellForColumn1() {
    Paragraph paragraph1 = new Paragraph("This is sample for column 1");
    return new Cell().add(paragraph1);
}
public static Cell getNewCellForColumn2() {
    Paragraph paragraph1 = new Paragraph("This is sample for column 2");
    return new Cell().add(paragraph1);
}

public static Table addRowInTable(Table table) {
    table.addCell(getNewCellForColumn1());
    table.addCell(getNewCellForColumn2());
    table.startNewRow();
    return table;
}}

Посмотрите, работает ли это для вас. В этом решении: -

  1. Я обрабатываю каждую строку как новую таблицу.
  2. Я предполагаю, что обе таблицы имеют одинаковые строки, но вы можете изменить код согласно вашему требованию.
...