使用itextpdf的页码总数

时间:2016-02-03 10:01:56

标签: itextsharp itext itextpdf

我使用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);
        }
    }

1 个答案:

答案 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)显示右对齐的页数。