Элементы в pdf перекрывают друг друга при работе с itext7 - PullRequest
0 голосов
/ 05 августа 2020

Я создал файл pdf, который нужно добавлять для каждой итерации в al oop. Поскольку для добавления требуется временный файл, а затем замена исходного файла этим кодом `

        PdfDocument pdfDoc = new PdfDocument(new PdfReader(report), new PdfWriter(temp));
    Document doc = new Document(pdfDoc);
    doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));

    Table table = new Table(3);
   
    table.addCell(new Paragraph("Test ID:"+testid));
    table.addCell(new Paragraph("Testname:"+testname));
    table.addCell(new Paragraph("Result:"+result));
    

    doc.setRenderer(new DocumentRenderer(doc) {
        protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
            LayoutArea area = super.updateCurrentArea(overflowResult);
            if (area.getPageNumber() == 1) {
                area.getBBox().decreaseHeight(266);
            }
            return area;
        }
    });

    doc.add(table);
    doc.add(new Paragraph("\n\n"));
    Style normal = new Style();
    PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
    normal.setFont(font).setFontSize(9);
    Paragraph paragraph = new Paragraph();
    paragraph.add(new Text("Description"+System.lineSeparator()+output ).addStyle(normal));
    
    paragraph.setBorder(new SolidBorder(1));
     doc.add(paragraph);
     
    doc.close();
    
    
    PdfReader reader = new PdfReader(temp);
    PdfWriter writer = new PdfWriter(report);
    
    PdfDocument pdfDocoment = new PdfDocument(reader, writer);
    
    //manipulate pdf…
    pdfDocoment.close();

, я получаю PDF-файл, но все элементы просто перекрываются друг с другом. Итак, как это сделать правильно. Мой текущий pdf

введите описание изображения здесь

1 Ответ

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

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

У вас есть следующий код, который, вероятно, предназначался для достижения цель:

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

Однако он не перейдет на последнюю страницу, потому что Document не «видит», существует ли какой-либо контент на страницах, и он просто начинается с верхней части первой страницы, даже если вы изменяете существующий документ.

Решение состоит в том, чтобы перейти к последней странице и затем создать новую страницу. Этого легко добиться с помощью этих двух строк:

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

Он не будет запоминать позиции добавленного контента и просто каждый раз будет создавать новые страницы. Если вы хотите запомнить эти позиции, вам нужно будет написать дополнительный код и передать эти позиции в currentArea, как вы это делали в своем пользовательском рендерере.

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

doc.setRenderer(new DocumentRenderer(doc) {
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
        LayoutArea area = super.updateCurrentArea(overflowResult);
        if (area.getPageNumber() == 1) {
            area.getBBox().decreaseHeight(266);
        }
        return area;
    }
});

doc.add(new AreaBreak(AreaBreakType.LAST_PAGE));
doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...