首页 文章

如何在 iText 7 中添加“Page X of Y”页脚

提问于
浏览
4

我正在试图弄清楚如何在 PDF 文档的每个页面中添加“Page X of Y”页脚,我使用iText 7生成。

使用 IEventHandler 生成“Page X”部分看起来相当简单 - 它是我正在努力的“Y”部分。我想避免生成整个文档两次,以便找出它有多少页面,因为这将是一个重大的性能打击!

我在iText 5中找到了一个解决方案:PDF Java 和 iText 中的 PDF 页码,但iText 7完全重写 iText,界面完全不同,到目前为止我一直找不到类似的* * iText 7 **示例。

1 回答

  • 5

    回答你找到的 iText 5引用MovieCountries1示例。此示例已作为Listing_05_20_MovieCountries1重写为 iText 7。其关键代码:

    protected PdfFont bold;
    protected PdfFont italic;
    protected PdfFont normal;
    
    protected PdfFormXObject template;
    
    public void manipulatePdf(String dest) throws IOException, SQLException {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
        Document doc = new Document(pdfDoc, new PageSize(PageSize.A4), true);
        doc.setMargins(54, 36, 36, 36);
    
        bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
        italic = PdfFontFactory.createFont(FontConstants.HELVETICA_OBLIQUE);
        normal = PdfFontFactory.createFont(FontConstants.HELVETICA);
    
        template = new PdfFormXObject(new Rectangle(550, 803, 30, 30));
        PdfCanvas canvas = new PdfCanvas(template, pdfDoc);
    
        HeaderHandler headerHandler = new HeaderHandler();
        pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
    
        ... ADD CONTENT ...
    
        canvas.beginText();
        try {
            canvas.setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA), 12);
        } catch (IOException e) {
            e.printStackTrace();
        }
        canvas.moveText(550, 803);
        canvas.showText(Integer.toString(pdfDoc.getNumberOfPages()));
        canvas.endText();
        canvas.release();
    
        doc.close();
    }
    
    public class HeaderHandler implements IEventHandler {
        protected String country;
    
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfPage page = docEvent.getPage();
            int pageNum = docEvent.getDocument().getPageNumber(page);
            PdfCanvas canvas = new PdfCanvas(page);
            canvas.beginText();
            try {
                canvas.setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA), 12);
            } catch (IOException e) {
                e.printStackTrace();
            }
            canvas.moveText(34, 803);
            canvas.showText(country);
            canvas.moveText(450, 0);
            canvas.showText(String.format("Page %d of", pageNum));
            canvas.endText();
            canvas.stroke();
            canvas.addXObject(template, 0, 0);
            canvas.release();
        }
    
        public void setHeader(String country) {
            this.country = country;
        }
    }
    

    你也会在那里找到许多其他样品的重写。


    As_1_remarked 在评论中,甚至有一个稍微不同的例子,它是为 iText 7 真正创建的(与上面的示例相比,这是 iText 5 示例的端口)。

    这是伴随iText 7:构建块教程第七章的一个例子。它使用showTextAligned()来确保“Page X of”与“Y”很好地匹配,无论 X 和 Y 有多少位数,参见它的 end-of-page 事件监听器方法:

    public void handleEvent(Event event) {
        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfDocument pdf = docEvent.getDocument();
        PdfPage page = docEvent.getPage();
        int pageNumber = pdf.getPageNumber(page);
        Rectangle pageSize = page.getPageSize();
        PdfCanvas pdfCanvas = new PdfCanvas(
            page.newContentStreamBefore(), page.getResources(), pdf);
        Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
        Paragraph p = new Paragraph()
            .add("Page ").add(String.valueOf(pageNumber)).add(" of");
        canvas.showTextAligned(p, x, y, TextAlignment.RIGHT);
        pdfCanvas.addXObject(placeholder, x + space, y - descent);
        pdfCanvas.release();
    }
    

    (C07E03_PageXofY.java,事件处理程序类PageXofY)

相关问题