如何使用 itext 在 pdf 的页脚上添加页码,它应该照顾它的宽度?
How to add page number on the footer of pdf using itext which should take care of its width?
我的代码示例如下
@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" 会出现在下一行。
您的页脚的第一列 table 非常小。实际上太小以至于较大的页码会自动导致换行。因此,通过替换
为第一列提供更多 space
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 页文档的结果:
...
我的代码示例如下
@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" 会出现在下一行。
您的页脚的第一列 table 非常小。实际上太小以至于较大的页码会自动导致换行。因此,通过替换
为第一列提供更多 spacefooter.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 页文档的结果:
...