如何使用itext在pdf的页脚上添加页码,应注意其宽度? [英] How to add page number on the footer of pdf using itext which should take care of its width?

查看:104
本文介绍了如何使用itext在pdf的页脚上添加页码,应注意其宽度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码示例如下

 <代码>@Overridepublic void onEndPage(PdfWriter writer,Document document){addFooter(writer);}private void addFooter(PdfWriter writer){PdfPTable页脚=新的PdfPTable(2);尝试 {//设置默认值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);//这里是文本的第100页,单词of在下一行下方.//应该在同一行.footer.addCell(new Phrase(String.format("Page%d of",Integer.parseInt(writer.getPageNumber()+"33")),新Font(Font.FontFamily.HELVETICA,8))));//添加占位符以获取总页数PdfPCell totalPageCount =新的PdfPCell(总数);totalPageCount.setBorder(Rectangle.TOP);totalPageCount.setBorderColor(BaseColor.GREEN);footer.getDefaultCell().setHorizo​​ntalAlignment(Element.ALIGN_LEFT);footer.addCell(totalPageCount);//写页面PdfContentByte canvas = writer.getDirectContent();canvas.beginMarkedContentSequence(PdfName.ARTIFACT);footer.writeSelectedRows(0,-1,34,20,canvas);canvas.endMarkedContentSequence();} catch(DocumentException de){抛出新的ExceptionConverter(de);}}} 

在单位数页码的情况下,此代码可以正常工作.但是,当页面增加到两位数时,很少有文本移到下一行.例如,如果文本是第10页(共10页),那么"of"一词会出现在下一行.

解决方案

页脚表的第一列很小.实际上如此之小,以至于较大的页码将自动导致换行.因此,通过替换来为第一列留出更多空间

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

通过例如

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

在评论中,您对第一栏的扩展建议做出了回应

,但是即使将其更改为仅一点,它也会增加不必要的空间.它的输出类似于第10页(共10页).我的意思是在第10页(共10页)"之后,还有更多空间.

要减少间隔,您可以将第一列的内容右对齐,例如通过添加

  footer.getDefaultCell().setHorizo​​ntalAlignment(Element.ALIGN_RIGHT); 

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

因此

  private void addFooterImproved(PdfWriter writer){PdfPTable页脚=新的PdfPTable(2);尝试 {//设置默认值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().setHorizo​​ntalAlignment(Element.ALIGN_RIGHT);footer.addCell(new Phrase(String.format("Page%d of",writer.getPageNumber()),new Font(Font.FontFamily.HELVETICA,8)));//添加占位符以获取总页数PdfPCell totalPageCount =新的PdfPCell(总数);totalPageCount.setBorder(Rectangle.TOP);totalPageCount.setBorderColor(BaseColor.GREEN);footer.getDefaultCell().setHorizo​​ntalAlignment(Element.ALIGN_LEFT);footer.addCell(totalPageCount);//写页面PdfContentByte canvas = writer.getDirectContent();canvas.beginMarkedContentSequence(PdfName.ARTIFACT);footer.writeSelectedRows(0,-1,34,20,canvas);canvas.endMarkedContentSequence();} catch(DocumentException de){抛出新的ExceptionConverter(de);}} 

(

...

My code sample is as follows


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

}

This code is working fine in case of single digit page number. But when page increases to double digits then few texts get shifted to next line. For example if the text is Page 10 of 10, then word "of" goes in next line.

解决方案

The first column of your footer table is very small. So small actually that larger page numbers will automatically cause a line wrap. Thus, give more space to the first column by replacing

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

by e.g.

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

In a comment you responded to the proposed widening of the first column

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.

To reduce the gap you can right align the contents of the first column, e.g. by adding

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

before the adding the "Page %d of" cell.

Thus,

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 helper method)

The result for a 100 page document:

...

这篇关于如何使用itext在pdf的页脚上添加页码,应注意其宽度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆