提问者:小点点

添加页脚到JavaiTextPdf 7与页码


我试图添加页脚包含左边的用户名和右边的总页数我使用iTextPdf 7在Java但我无法找到任何有用的方法来做到这一点,请在下面找到我的代码导入:

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;

代码的小样本:

PdfWriter pdfWriter = new PdfWriter(path);
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
pdfDocument.addNewPage();
Document document = new Document(pdfDocument);
Paragraph dateParagraph = new Paragraph(todayDate.toString());
dateParagraph.setTextAlignment(TextAlignment.RIGHT);
document.add(dateParagraph);
document.close();

页脚样本:

这是所需页脚的示例


共1个答案

匿名用户

完成这项工作的一个非常基本的示例。在iText中添加页脚和页码的方法有很多,根据您的上下文,一种方法可能比其他方法更合适。我提供的示例是一个很好的开始:

Document document = new Document(pdfDocument, PageSize.A4, false);

for (int i = 0; i < 10; i++) {
    if (i != 0) {
        document.add(new AreaBreak());
    }
    document.add(new Paragraph("Hello"));
}

int totalPages = document.getRenderer().getCurrentArea().getPageNumber();

for (int i = 1; i <= totalPages; i++) {
    Paragraph footer = createFooter(totalPages);
    footer.setFixedPosition(i, 40, 40, 300);
    document.add(footer);
}

document.close();

请注意,我使用段落作为页脚元素,但您可以使用Table或其他任何东西:

private Paragraph createFooter(int totalPages) {
    Paragraph p = new Paragraph();
    Text currentPage = new Text("");
    currentPage.setNextRenderer(new CurrentPageNumberRenderer(currentPage));
    p.add("Page ").add(currentPage).add(" of ").add(new Text(String.valueOf(totalPages)));
    return p;
}

这是我们的自定义渲染器,它将动态分配页码:

private static class CurrentPageNumberRenderer extends TextRenderer {
    public CurrentPageNumberRenderer(Text textElement) {
        super(textElement);
    }

    @Override
    public LayoutResult layout(LayoutContext layoutContext) {
        int currentPageNumber = layoutContext.getArea().getPageNumber();
        setText(String.valueOf(currentPageNumber));
        return super.layout(layoutContext);
    }

    @Override
    public IRenderer getNextRenderer() {
        return new CurrentPageNumberRenderer((Text) modelElement);
    }
} 

视觉结果: