Как напечатать динамическую строку в заголовке PDF, используя метод onEndPage - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть несколько таблиц в моем документе pdf при печати одной из таблиц в формате pdf. Мне нужно, чтобы имя таблицы печаталось в разделе заголовка на всех страницах, на которых эта таблица печатается. Кроме того, значение заголовка необходимо изменить в соответствии с именем таблицы.

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

пример кода

PdfGenerator.class



    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        try {
            String pdfFilePath = "C:\\Users\\ychitela\\Desktop\\demo\\NewPdf.pdf";
            File file = new File(pdfFilePath);
            FileOutputStream fileout = new FileOutputStream(file);
            Document document = new Document(PageSize.A4.rotate(), 36, 36, 55, 25);
            PdfWriter writer = PdfWriter.getInstance(document, fileout);
            ReportHeader event = new ReportHeader();
            writer.setPageEvent(event);
            writer.setViewerPreferences(PdfWriter.PageModeUseOutlines);
            document.open();
            document.addAuthor("Me");
            document.addTitle("Table Report");

            Font font = FontFactory.getFont("TIMES_ROMAN", 12, BaseColor.BLACK);
            document.add(new Paragraph("Intro Page"));
            document.newPage();
            Chapter chapter = new Chapter(new Paragraph("Table \n\n"), 0);
            chapter.setNumberDepth(0);
            chapter.add(new Paragraph("   "));
            for (int i = 1; i < 5; i++) {

                float[] columnWidths = { 1f, 1f };
                // create PDF table with the given widths
                PdfPTable table = new PdfPTable(columnWidths);
                table.setHorizontalAlignment(Element.ALIGN_LEFT);
                table.setWidthPercentage(30.0f);
                Section subsection = chapter.addSection(new Paragraph("Table "+i+" \n\n"), 0);
                event.setTableName("Table header" + i);
                writer.setPageEvent(event);
                table.addCell(new PdfPCell(new Phrase("Column 1", font)));
                table.addCell(new PdfPCell(new Phrase("Column 2", font)));
                table.setHeaderRows(1);
                for (int j = 0; j < 25; j++) {
                    table.addCell(new PdfPCell(new Phrase("Hello" + j, font)));
                    table.addCell(new PdfPCell(new Phrase("World" + j, font)));
                }
                subsection.add(table);
                subsection.newPage();

            }
            document.add(chapter);
            document.close();
            System.out.println("Done");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

Header.class

public class ReportHeader extends PdfPageEventHelper {

    private String tableName;

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        PdfPTable table2 = new PdfPTable(1);

        try {
            BaseColor basecolour = BaseColor.DARK_GRAY;
            Font fontboldHead = FontFactory.getFont("TIMES_ROMAN", 8, basecolour);

            table2.setTotalWidth(300);
            PdfPCell cell2 = new PdfPCell(new Paragraph(tableName, fontboldHead));
            cell2.setBorder(Rectangle.NO_BORDER);
            cell2.setHorizontalAlignment(Element.ALIGN_LEFT);
            cell2.setVerticalAlignment(Element.ALIGN_BOTTOM);
            table2.addCell(cell2);
            table2.writeSelectedRows(0, -1, document.left(), 580, writer.getDirectContent());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

1 Ответ

1 голос
/ 14 мая 2019

Как вы сами узнали, причина проблемы:

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

Чтобы динамический заголовок работал, вы должны добавить содержимое раньше;в частности, вы должны добавлять текущее содержание главы в документ каждый раз, когда добавляете новую таблицу, т.е. каждый раз, когда меняется заголовок.

Вы можете сделать это, используя тот факт, чтоChapter реализует LargeElement, т. Е. Вы можете добавлять экземпляр Chapter в документ несколько раз, и каждый раз в документ записывается только все, что появилось в главе с момента последнего написания.Для этого вы должны установить для его свойства Complete значение false в начале и вернуться к true только перед добавлением его в последний раз.Таким образом,

Chapter chapter = new Chapter(new Paragraph("Table \n\n"), 0);
// prepare chapter to be set piecewise
chapter.setComplete(false);
chapter.setNumberDepth(0);
chapter.add(new Paragraph("   "));
for (int i = 1; i < 5; i++) {

    float[] columnWidths = { 1f, 1f };
    // create PDF table with the given widths
    PdfPTable table = new PdfPTable(columnWidths);
    table.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.setWidthPercentage(30.0f);
    // add recent chapter additions
    document.add(chapter);
    Section subsection = chapter.addSection(new Paragraph("Table "+i+" \n\n"), 0);
    event.setTableName("Table header" + i);
    writer.setPageEvent(event);
    table.addCell(new PdfPCell(new Phrase("Column 1", font)));
    table.addCell(new PdfPCell(new Phrase("Column 2", font)));
    table.setHeaderRows(1);
    for (int j = 0; j < 25; j++) {
        table.addCell(new PdfPCell(new Phrase("Hello" + j, font)));
        table.addCell(new PdfPCell(new Phrase("World" + j, font)));
    }
    subsection.add(table);
    subsection.newPage();

}
// prepare chapter to be completed
chapter.setComplete(true);
// final adding of chapter
document.add(chapter);

( ChapterAndDynamicHeader test testLikeYuvarajChitelaImproved)

...