9

iText 7を使用して生成している PDF ドキュメントの各ページに「Page X of Y」フッターを追加する方法を見つけようとしています。

IEventHandler を使用して "Page X" 部分を生成するのはかなり簡単に思えます。私が苦労しているのは "of Y" ビットです。ドキュメント全体を 2 回生成してページ数を調べることは避けたいと思います。これはパフォーマンスに大きな影響を与えるためです。

ここでiText 5でこれに対する解決策を見つけました: PDF Page Numbering in Java & iText、しかしiText 7はまったく異なるインターフェイスで iText を完全に書き直したものであり、これまでのところ同様のiText 7の例を見つけることができませんでした.

4

1 に答える 1

12

iText 5 で見つけた回答はMovieCountries1の例を参照しています。この例は iText 7 用にListing_05_20_MovieCountries1として書き直されました。その重要なコード:

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(StandardFonts.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;
    }
}

他の多くのサンプルの書き直しもそこにあります。


@Bruno がコメントで述べたように、iText 7 用に真に作成されたわずかに異なる例もあります (iText 5 の例のポートである上記の例とは対照的です)。

これは、iText 7: building blocks tutorialの第 7 章に付随する例です。XとYの桁数に関係なく、「Page X of」が「Y」とうまく一致するようにするために使用します。その end-of-page イベントリスナーメソッド:showTextAligned()

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)

于 2016-07-27T06:59:15.827 に答える