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

Мне нужно добавить 2 таблицы в 2 параллельных столбца, начиная со страницы 1, и обе таблицы содержат более одной страницы. Таблица 1 выполняется в левой половине страницы, а таблица 2 - в правой. Я начал рендерить таблицу 1, и она переполняется. Теперь, прежде чем перейти к следующей странице, я хочу начать визуализацию таблицы 2 (добавление новой страницы делает предыдущую страницу недоступной). Реализация этого в iText5 была выполнена с использованием CoulmnText. В iText5 я использовал ColumnText.hasMoreText (status), чтобы проверить характер переполнения таблицы. Но в iText7 этот подход другой. Это пример кода в iText7, в котором я пытался решить указанную проблему.

public void createPdf(String dest) throws FileNotFoundException {
    Rectangle[] columnsEven = {new Rectangle(200, 100, 100, 500), new Rectangle(500, 100, 100, 500)};

    PdfWriter writer =new PdfWriter(DEST);
    PdfDocument pdfDoc = new PdfDocument(writer);
    Document document = new Document(pdfDoc);

    Table table1 = new Table(2);
    Table table2 = new Table(2);

    String cellContent1="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam metus elit, ornare et justo nec, ornare dignissim leo. Praesent in egestas erat. Donec id nunc libero. Nullam aliquam sodales sollicitudin. Proin ac egestas nunc. Nunc et suscipit augue. Curabitur porta tempor nunc vel suscipit. Suspendisse imperdiet nunc id quam aliquet fermentum. Pellentesque ut dolor non odio congue blandit. Morbi laoreet magna quam, quis suscipit nunc pulvinar et. Nullam sit amet semper odio, sagittis dictum erat.\n"+

        "Curabitur sagittis arcu turpis, et tincidunt quam congue in. Nullam vitae felis id dui fringilla tincidunt. Nulla ullamcorper nisi non arcu fermentum, eu tempor lectus mattis. Aliquam leo purus, vulputate et ornare in, tincidunt sit amet mi. Sed sollicitudin et sapien vel hendrerit. Morbi id sodales sapien. In non nisl velit. Mauris maximus sodales lectus, ac dignissim elit cursus ac. Nulla viverra, velit sed cursus tincidunt, ex risus posuere diam, lobortis congue metus eros at lorem. Cras a ligula tortor. Vestibulum efficitur diam eros, eget dapibus magna cursus sed.\n"+
        "Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam ut velit pretium diam vestibulum consectetur. Praesent dignissim id sapien eget ultrices. Nam non libero iaculis dolor mattis egestas et quis leo. Sed vitae libero a enim viverra finibus sit amet sed nulla. Sed vitae sem hendrerit, posuere justo sagittis, placerat justo. Aenean felis nisi, tincidunt faucibus sem at, egestas interdum nibh. Curabitur venenatis neque nec volutpat mollis. Phasellus vel tellus ut nisl consequat gravida. Maecenas eget ligula vestibulum, finibus turpis a, hendrerit est. Cras eleifend mollis commodo.\n"+

        "Morbi quam velit, elementum nec turpis porttitor, venenatis sagittis nunc. Sed et nisi ipsum. Maecenas eget tellus in dui condimentum dictum a tempus sem. Maecenas consectetur nisl sit amet accumsan volutpat. Sed dictum massa vitae urna aliquam imperdiet. Nam at ex feugiat dolor vestibulum vehicula. Nullam leo magna, porta ac ex vitae, malesuada fermentum turpis. Donec vel turpis quis ligula feugiat molestie quis at nisi. Quisque efficitur velit odio, id rhoncus diam varius eu. Duis dui mi, scelerisque at faucibus ac, sodales sed est. Sed dictum aliquet semper.\n"+


        "Sed erat ipsum, vehicula nec magna sed, aliquam volutpat lorem. Integer et auctor nisl, at auctor lorem. Nam bibendum urna nec quam cursus, vitae rhoncus justo semper. Morbi posuere dapibus quam vel euismod. Morbi id maximus augue, ut vulputate turpis. Cras posuere auctor justo, in ultricies nunc tincidunt id. Sed luctus nisl lacus, in facilisis erat ultricies id. Aliquam erat volutpat. Morbi accumsan lectus nec dolor ultricies dignissim. Sed quis finibus lectus.\n"+

                "Pellentesque aliquet ex eget cursus accumsan. In ultrices tempus orci sed ultrices. Maecenas lectus nunc, consectetur ac suscipit et, tempus rutrum ipsum. Nulla accumsan tincidunt dignissim. Sed malesuada sapien elit, ac semper urna maximus at. Nunc eleifend tortor nec ligula auctor, sit amet sagittis turpis sagittis. Nam laoreet justo sed gravida iaculis. Fusce ornare quam quis arcu gravida rutrum. Aliquam vitae augue sit amet nisi finibus ullamcorper. Proin quis placerat velit. Integer malesuada erat nec massa tempus pretium.";

    Cell cell = new Cell().add(new Paragraph("INDIA"));
    table1.addCell(cell);   
    table2.addCell(cell);
    cell = new Cell().add(new Paragraph(cellContent1));
    table1.addCell(cell);
    table2.addCell(cell);
    drawTables(pdfDoc, document, new Table[] {table1, table2}, columnsEven);
    document.close();

}

public void drawTables(PdfDocument pdfDoc, Document document, Table[] tables , Rectangle[] rects) {
    // for table 1
    DocumentRenderer renderer1= new MyColumnDocumentRenderer(document, new Rectangle[] {rects[0]});
    document.add(table1);
    // for table 2
    DocumentRenderer renderer2= new MyColumnDocumentRenderer(document, new Rectangle[] {rects[1]});
    document.add(table2);

}
public class MyColumnDocumentRenderer extends DocumentRenderer {
    protected Rectangle column;

    public MyColumnDocumentRenderer(Document document, Rectangle[] column) {
        super(document);
        this.column = column[0];        
    }

    @Override
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
        if(overflowResult!=null && overflowResult.getStatus()== LayoutResult.PARTIAL) {

            column = new Rectangle(300, 100, 200, 600);
        }
        super.updateCurrentArea(overflowResult);


        return (currentArea = new RootLayoutArea(currentPageNumber, column.clone()));
    }

Я переношу iText5 на iText7. Можете ли вы предложить мне лучший подход к решению указанной проблемы?

Мне также нужна помощь по приведенным ниже вопросам. Можно ли одновременно обрабатывать document.add (table1) и document.add (table2)? Можем ли мы сохранить состояние средства визуализации документа для одной таблицы, пока мы визуализируем другую таблицу?

1 Ответ

2 голосов
/ 06 мая 2020

Вы всегда можете сделать это за несколько проходов: откройте документ в режиме штамповки (с PdfReader и PdfWriter), добавьте необходимое содержимое, закройте документ, затем откройте новую версию документа, добавьте больше содержимого , закройте документ и т. д.

Существующие реализации, доступные из коробки, не поддерживают ваш случай одновременного размещения нескольких объектов на многих страницах. Тем не менее, вся структура макета достаточно гибкая, поэтому, если вы копаетесь в исходном коде, вы можете расширить существующие реализации и лишь слегка изменить их для достижения ваших целей. доступ к некоторым полям protected и добавит возможность go вернуться на первую страницу в рендерере. Обратите внимание, что для того, чтобы это решение работало, нам нужно передать immediateFlush=false родительскому конструктору, что немного увеличит объем памяти. Также обратите внимание, что решение немного зависит от деталей реализации, поэтому оно может перестать работать даже во время обновления патча. Но это скорее теоретическая возможность, просто следите за ней.

private static final class ResettingColumnDocumentRenderer extends ColumnDocumentRenderer {
    public ResettingColumnDocumentRenderer(Document document, Rectangle[] columns) {
        super(document, false, columns);
    }

    public void resetToFirstPage() {
        currentArea = null;
        currentPageNumber = 0;
        nextAreaNumber = 0;
    }
}

Теперь, когда у нас есть настраиваемая реализация средства визуализации документов, мы можем обобщить ваш метод drawTables для поддержки случая визуализации N таблиц :

public void drawTables(Document document, Table[] tables , Rectangle[] rects) {
    for (int i = 0; i < tables.length; i++) {
        ResettingColumnDocumentRenderer renderer = new ResettingColumnDocumentRenderer(document, new Rectangle[] {rects[i]});
        document.setRenderer(renderer);
        document.add(tables[i]);
        renderer.resetToFirstPage();
        renderer.flush();
    }
}

Наконец, вот внешний код вызова, почти без изменений по сравнению с исходной версией:

public void createPdf() throws FileNotFoundException {
    Rectangle[] columnsEven = {new Rectangle(70, 100, 200, 500), new Rectangle(350, 100, 200, 500)};

    PdfWriter writer =new PdfWriter("C:/Users/Alexey/Desktop/23423423.pdf");
    PdfDocument pdfDoc = new PdfDocument(writer);
    Document document = new Document(pdfDoc);

    Table table1 = new Table(2);
    Table table2 = new Table(2);

    String cellContent1="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam metus elit, ornare et justo nec, ornare dignissim leo. Praesent in egestas erat. Donec id nunc libero. Nullam aliquam sodales sollicitudin. Proin ac egestas nunc. Nunc et suscipit augue. Curabitur porta tempor nunc vel suscipit. Suspendisse imperdiet nunc id quam aliquet fermentum. Pellentesque ut dolor non odio congue blandit. Morbi laoreet magna quam, quis suscipit nunc pulvinar et. Nullam sit amet semper odio, sagittis dictum erat.\n"+

            "Curabitur sagittis arcu turpis, et tincidunt quam congue in. Nullam vitae felis id dui fringilla tincidunt. Nulla ullamcorper nisi non arcu fermentum, eu tempor lectus mattis. Aliquam leo purus, vulputate et ornare in, tincidunt sit amet mi. Sed sollicitudin et sapien vel hendrerit. Morbi id sodales sapien. In non nisl velit. Mauris maximus sodales lectus, ac dignissim elit cursus ac. Nulla viverra, velit sed cursus tincidunt, ex risus posuere diam, lobortis congue metus eros at lorem. Cras a ligula tortor. Vestibulum efficitur diam eros, eget dapibus magna cursus sed.\n"+
            "Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam ut velit pretium diam vestibulum consectetur. Praesent dignissim id sapien eget ultrices. Nam non libero iaculis dolor mattis egestas et quis leo. Sed vitae libero a enim viverra finibus sit amet sed nulla. Sed vitae sem hendrerit, posuere justo sagittis, placerat justo. Aenean felis nisi, tincidunt faucibus sem at, egestas interdum nibh. Curabitur venenatis neque nec volutpat mollis. Phasellus vel tellus ut nisl consequat gravida. Maecenas eget ligula vestibulum, finibus turpis a, hendrerit est. Cras eleifend mollis commodo.\n"+

            "Morbi quam velit, elementum nec turpis porttitor, venenatis sagittis nunc. Sed et nisi ipsum. Maecenas eget tellus in dui condimentum dictum a tempus sem. Maecenas consectetur nisl sit amet accumsan volutpat. Sed dictum massa vitae urna aliquam imperdiet. Nam at ex feugiat dolor vestibulum vehicula. Nullam leo magna, porta ac ex vitae, malesuada fermentum turpis. Donec vel turpis quis ligula feugiat molestie quis at nisi. Quisque efficitur velit odio, id rhoncus diam varius eu. Duis dui mi, scelerisque at faucibus ac, sodales sed est. Sed dictum aliquet semper.\n"+


            "Sed erat ipsum, vehicula nec magna sed, aliquam volutpat lorem. Integer et auctor nisl, at auctor lorem. Nam bibendum urna nec quam cursus, vitae rhoncus justo semper. Morbi posuere dapibus quam vel euismod. Morbi id maximus augue, ut vulputate turpis. Cras posuere auctor justo, in ultricies nunc tincidunt id. Sed luctus nisl lacus, in facilisis erat ultricies id. Aliquam erat volutpat. Morbi accumsan lectus nec dolor ultricies dignissim. Sed quis finibus lectus.\n"+

            "Pellentesque aliquet ex eget cursus accumsan. In ultrices tempus orci sed ultrices. Maecenas lectus nunc, consectetur ac suscipit et, tempus rutrum ipsum. Nulla accumsan tincidunt dignissim. Sed malesuada sapien elit, ac semper urna maximus at. Nunc eleifend tortor nec ligula auctor, sit amet sagittis turpis sagittis. Nam laoreet justo sed gravida iaculis. Fusce ornare quam quis arcu gravida rutrum. Aliquam vitae augue sit amet nisi finibus ullamcorper. Proin quis placerat velit. Integer malesuada erat nec massa tempus pretium.";

    Cell cell = new Cell().add(new Paragraph("INDIA"));
    table1.addCell(cell);
    table2.addCell(cell);
    cell = new Cell().add(new Paragraph(cellContent1));
    table1.addCell(cell);
    table2.addCell(cell);
    drawTables(document, new Table[] {table1, table2}, columnsEven);
    document.close();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...