Pagination ItextPdf中的分页

Pagination ItextPdf中的分页,pagination,itextpdf,Pagination,Itextpdf,我们在应用程序中使用itextpdf和xmlworker API(itextpdf-5.1.1.jar,xmlworker-1.1.0.jar)来生成PDF。我们通过XML-XSLT转换生成HTML内容,然后使用HTML内容创建pdf文档 当我们尝试实现分页(如第1页,第2页,第3页…)时,我们从itextpdf online示例中了解到,除了我们创建的pdf文档之外,我们始终需要创建一个生成的pdf文档,以便在每个页面内容上标记页码 这种方法给删除中间pdf文档带来了挑战。在我们第一次创建pd

我们在应用程序中使用itextpdf和xmlworker API(itextpdf-5.1.1.jar,xmlworker-1.1.0.jar)来生成PDF。我们通过XML-XSLT转换生成HTML内容,然后使用HTML内容创建pdf文档

当我们尝试实现分页(如第1页,第2页,第3页…)时,我们从itextpdf online示例中了解到,除了我们创建的pdf文档之外,我们始终需要创建一个生成的pdf文档,以便在每个页面内容上标记页码

这种方法给删除中间pdf文档带来了挑战。在我们第一次创建pdf时,是否有任何方法可以确定页码,从而避免创建一个生成的pdf文档

谢谢 文卡特


请下载免费电子书并阅读标题为“页面事件”一章中列出的问题。以下是为本书选择的一些问题:

您还可以在官方的iText网站上查看,更具体地说,可以查看关键字

在您的问题中,您指的是创建中间文档。这就是这个例子的内容。您正在询问一种方法,可以在一次通过中添加第X页,共Y页。这就是这个例子的内容

class PageXofYHeader extends PdfPageEventHelper {
    /** The template with the total number of pages. */
    PdfTemplate total;

    /**
     * Creates the PdfTemplate that will hold the total number of pages.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(30, 16);
    }

    /**
     * Adds a header to every page
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onEndPage(PdfWriter writer, Document document) {
        PdfPTable table = new PdfPTable(2);
        try {
            table.setWidths(new int[]{48, 2});
            table.setTotalWidth(527);
            table.setLockedWidth(true);
            table.getDefaultCell().setFixedHeight(20);
            table.getDefaultCell().setBorder(Rectangle.BOTTOM);
            table.getDefaultCell()
                .setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(
                String.format("Page %d of", writer.getPageNumber()));
            PdfPCell cell = new PdfPCell(Image.getInstance(total));
            cell.setBorder(Rectangle.BOTTOM);
            table.addCell(cell);
            table.writeSelectedRows(0, -1, 34, 803,
                writer.getDirectContent());
        }
        catch(DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }

    /**
     * Fills out the total number of pages before the document is closed.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onCloseDocument(PdfWriter writer, Document document) {
        ColumnText.showTextAligned(total, Element.ALIGN_LEFT,
                new Phrase(String.valueOf(writer.getPageNumber() - 1)),
                2, 2, 0);
    }
}

如您所见,我们在
onOpenDocument()
方法中创建了一个名为
total
的小占位符。由于我们事先不知道总页数,我们在不知道总页数的情况下将此占位符添加到每个页面。我们只有在关闭文档时才知道最终的页数,这就是为什么我们要等到触发
onCloseDocument()
方法才能将内容添加到占位符中。

感谢Bruno Lowagie对在单次过程中实现X页/Y页内容的详细解释。由于我们使用XML XSLT HTMLContent方法生成PDF文档,因此我们尝试的示例程序类似于MovieCountries 1,它在页眉上创建了X/Y页面。是否有任何示例将第X页(共Y页)放置在页脚区域?你能告诉我一个样品吗?不需要额外的样品。添加额外内容时只需更改坐标即可。将803替换为20(由您决定页脚的位置)。谢谢Bruno Lowagie。我们尝试更改示例中的坐标,但没有任何帮助使页面总数(Y)接近X。是什么让您认为在一系列注释部分粘贴代码是一个好主意?没有人会读你的代码。请按预期方式使用StackOverflow。另外:您要求将页脚靠近底部。现在你要求把总数(Y)接近X。你受过教育吗?你在学校的时候没有学过“解析几何”吗?嗨,布鲁诺·洛瓦吉,我是stackoverflow的新手,我只是把代码粘贴在一系列注释部分,而不知道如何发布代码片段。现在我已经更新了我的原始帖子,更新了创建页脚的内部类的整个部分。我面临的问题是,总页数(Y)并没有以每个页面的值(X)显示。在onCloseDocument方法中使用坐标,但我们无法成功。我已经在一个图像文件中添加了3个示例输出(带有diff cordinates),供您参考[IMG]
class PageXofYHeader extends PdfPageEventHelper {
    /** The template with the total number of pages. */
    PdfTemplate total;

    /**
     * Creates the PdfTemplate that will hold the total number of pages.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(30, 16);
    }

    /**
     * Adds a header to every page
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onEndPage(PdfWriter writer, Document document) {
        PdfPTable table = new PdfPTable(2);
        try {
            table.setWidths(new int[]{48, 2});
            table.setTotalWidth(527);
            table.setLockedWidth(true);
            table.getDefaultCell().setFixedHeight(20);
            table.getDefaultCell().setBorder(Rectangle.BOTTOM);
            table.getDefaultCell()
                .setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(
                String.format("Page %d of", writer.getPageNumber()));
            PdfPCell cell = new PdfPCell(Image.getInstance(total));
            cell.setBorder(Rectangle.BOTTOM);
            table.addCell(cell);
            table.writeSelectedRows(0, -1, 34, 803,
                writer.getDirectContent());
        }
        catch(DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }

    /**
     * Fills out the total number of pages before the document is closed.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onCloseDocument(PdfWriter writer, Document document) {
        ColumnText.showTextAligned(total, Element.ALIGN_LEFT,
                new Phrase(String.valueOf(writer.getPageNumber() - 1)),
                2, 2, 0);
    }
}