为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 itext 在 pdf 的页脚上添加页码,它应该照顾它的宽度?

如何使用 itext 在 pdf 的页脚上添加页码,它应该照顾它的宽度?

PIPIONE 2023-06-14 16:25:22
我的代码示例如下    @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 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

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

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

    }

}

(CreateFooter辅助方法)

100 页文档的结果:

//img1.sycdn.imooc.com/6489799e00017cc812280083.jpg

...

//img2.sycdn.imooc.com/648979ac0001474012220081.jpg

查看完整回答
反对 回复 2023-06-14
  • 1 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信