有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我的代码示例如下


    @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) 个答案

  1. # 1 楼答案

    页脚表的第一列非常小。如此之小,以至于较大的页码会自动导致换行。因此,通过替换第一列为第一列提供更多空间

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

    例如

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

    在一篇评论中,您回应了第一列的加宽建议

    but it increases the unnecessary space even if change it to only one point more. It gives the output like Page 10 of 10. I mean after "Page 10 of", there is much more space.

    要减小间距,可以右对齐第一列的内容,例如添加

    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);
        }
    }
    

    CreateFooter辅助方法)

    100页文档的结果:

    page 1

    page 100