提问者:小点点

如何使用itext在pdf页脚上添加页码,应该注意其宽度?


我的代码示例如下


    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        addFooter(writer);
    }

    private void addFooter(PdfWriter writer){
        PdfPTable footer = new PdfPTable(2);
        try {
            // set defaults
            footer.setWidths(new int[]{2, 24});
            footer.setWidthPercentage(50);

            footer.setTotalWidth(527);
            footer.setLockedWidth(true);
            footer.getDefaultCell().setFixedHeight(30);
            footer.getDefaultCell().setBorder(Rectangle.TOP);
            footer.getDefaultCell().setBorderColor(BaseColor.RED);
            // here for the text Page 100 of, word of goes below in next line. 
            //It should be in same line.
            footer.addCell(new Phrase(String.format("Page %d of", Integer.parseInt(writer.getPageNumber()+"33")), new Font(Font.FontFamily.HELVETICA, 8)));

            // add placeholder for total page count
            PdfPCell totalPageCount = new PdfPCell(total);
            totalPageCount.setBorder(Rectangle.TOP);
            totalPageCount.setBorderColor(BaseColor.GREEN);
            footer.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
            footer.addCell(totalPageCount);

            // write page
            PdfContentByte canvas = writer.getDirectContent();
            canvas.beginMarkedContentSequence(PdfName.ARTIFACT);
            footer.writeSelectedRows(0, -1, 34, 20, canvas);
            canvas.endMarkedContentSequence();
        } catch(DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }

}

在个位数页码的情况下,此代码运行良好。但是当页面增加到两位数时,很少有文本会移到下一行。例如,如果文本是第10页,共10页,则单词“of”进入下一行。


共1个答案

匿名用户

页脚表的第一列非常小。实际上非常小,以至于较大的页码会自动换行。因此,通过替换

footer.setWidths(new int[]{2, 24});

通过例如。

footer.setWidths(new int[]{2, 20});

你在评论中回应了扩大第一栏的提议

但是它增加了不必要的空间,即使将其更改为仅多一点。它给出了像第10页的第10页这样的输出。我的意思是在“第10页”之后,有更多的空间。

为了减少间隙,您可以对齐第一列的内容,例如添加

footer.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);

在添加"Page%d of"单元格之前。

因此,

private void addFooterImproved(PdfWriter writer) {
    PdfPTable footer = new PdfPTable(2);
    try {
        // set defaults
        footer.setWidths(new int[]{2, 20});
        footer.setWidthPercentage(50);

        footer.setTotalWidth(527);
        footer.setLockedWidth(true);
        footer.getDefaultCell().setFixedHeight(30);
        footer.getDefaultCell().setBorder(Rectangle.TOP);
        footer.getDefaultCell().setBorderColor(BaseColor.RED);
        footer.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
        footer.addCell(new Phrase(String.format("Page %d of", writer.getPageNumber()), new Font(Font.FontFamily.HELVETICA, 8)));

        // add placeholder for total page count
        PdfPCell totalPageCount = new PdfPCell(total);
        totalPageCount.setBorder(Rectangle.TOP);
        totalPageCount.setBorderColor(BaseColor.GREEN);
        footer.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
        footer.addCell(totalPageCount);

        // write page
        PdfContentByte canvas = writer.getDirectContent();
        canvas.beginMarkedContentSequence(PdfName.ARTIFACT);
        footer.writeSelectedRows(0, -1, 34, 20, canvas);
        canvas.endMarkedContentSequence();
    } catch(DocumentException de) {
        throw new ExceptionConverter(de);
    }
}

(CreateFoter助手方法)

100页文档的结果:

...