我使用itextpdf-5.5.6发布我的数据。
我尝试使用以下格式在我的pdf的PdfPCell
中设置页码: page_num / total_page_num
为此,我在关闭文档之前使用PdfTemplate
对象填充总页数。
它会发出警告,但PdfTemplate
超过PdfPCell
边界。
细胞的所有内容是否都可以在细胞内保持正常?
PdfTemplate pageNumTemplate;
@Test
public void quick_test() throws FileNotFoundException, DocumentException {
String filename = "C:\\test.pdf";
File file = new File(filename);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
PageNumberEvent pageNumberEvent = new PageNumberEvent();
writer.setPageEvent(pageNumberEvent);
document.open();
for(int i = 0; i < 10000; i++){
document.add(new Paragraph("This is my paragraph"));
document.newPage();
}
document.close();
}
public class PageNumberEvent extends PdfPageEventHelper {
@Override
public void onEndPage(PdfWriter writer, Document document) {
if(pageNumTemplate == null){
pageNumTemplate = writer.getDirectContent().createTemplate(0.1f, 0.1f);
}
PdfPTable table = new PdfPTable(1);
table.setSpacingBefore(50);
Paragraph para = new Paragraph();
Chunk pageNum = new Chunk(writer.getPageNumber() + "/");
para.add(pageNum);
Image totalPageNumImg = null;
try {
totalPageNumImg = Image.getInstance(pageNumTemplate);
} catch (BadElementException e) {
e.printStackTrace();
}
Chunk totalPageNumImgChunk = new Chunk(totalPageNumImg, 0, -1, true);
para.add(totalPageNumImgChunk);
para.setIndentationLeft(370);
PdfPCell cell = new PdfPCell(para);
cell.addElement(para);
table.addCell(cell);
try {
document.add(table);
} catch (DocumentException e) {
e.printStackTrace();
}
}
@Override
public void onCloseDocument(PdfWriter writer,Document document) {
String totalPageNumString = String.valueOf(writer.getPageNumber() - 1);
float widthPoint = totalPageNumString.length() * 10;
float heightPoint = totalPageNumString.length() * 20;
Phrase totalPageNumPhrase = new Phrase(totalPageNumString);
Rectangle templRect = pageNumTemplate.getBoundingBox();
Rectangle rectangle = new Rectangle(templRect.getLeft(), templRect.getBottom(), widthPoint, heightPoint + 2);
pageNumTemplate.setBoundingBox(rectangle);
ColumnText.showTextAligned(pageNumTemplate, Element.ALIGN_LEFT, totalPageNumPhrase, 0, 1, 0);
}
}
答案 0 :(得分:1)
早期,在第一个onEndPage
调用中,您创建一个分钟模板(0.1x0.1)以
pageNumTemplate = writer.getDirectContent().createTemplate(0.1f, 0.1f);
适合你的细胞。最后,在onCloseDocument
中,在将所有内容布局到固定位置之后,您调整此模板的大小,使其向左增长:
Rectangle templRect = pageNumTemplate.getBoundingBox();
Rectangle rectangle = new Rectangle(templRect.getLeft(), templRect.getBottom(), widthPoint, heightPoint + 2);
pageNumTemplate.setBoundingBox(rectangle);
如果您希望模板保留在表格单元格中,则必须使用宽度进行初始化,该宽度很可能足以容纳页面数量,例如
pageNumTemplate = writer.getDirectContent().createTemplate(30f, 0.1f);
在这里你可能需要玩一下......
正如OP在评论中指出的那样,不仅需要保留单元格内部的所有内容,而且内容也应该在单元格中正确对齐。
OP的代码显然无法满足第二个要求,该代码使用ALIGN_LEFT
将页面数量绘制到模板中。此外,它不会与调整正确大小的模板混合和匹配,因为它已经定位在页面上。
因此,要实现它,OP应该
onEndPage
); setIndentationLeft
进行一些伪右对齐)(onEndPage
); onCloseDocument
);和onCloseDocument
)显示右对齐的页数。