2016-07-26 5 views
1

Я пытаюсь понять, как добавить нижний колонтитул «Страница X of Y» на каждую страницу в документе PDF, который я генерирую с помощью iText 7.Как добавить нижний колонтитул «Страница X of Y» в iText 7

Использование IEventHandler для создания части «Страница X» кажется довольно простым - это бит «Y», с которым я борюсь. Я хочу избежать создания всего документа дважды, чтобы узнать, сколько страниц у него есть, так как это будет значительным хитом!

Я нашел решение для этого в IText 5 здесь: PDF Page Numbering in Java & iText, но IText 7 является полностью переписанный IText с совершенно другой интерфейс и до сих пор я не смог найти какой-либо подобное iText 7 примеры.

+0

Может кто-то пожалуйста, создать «iText7» тег я могу добавить к этому, как и я не иметь достаточную репутацию! :-(Тег «iText» не особенно полезен при поиске вопросов и ответов iText7, поскольку iText 5 и iText 7 являются совершенно разными животными! –

+0

Согласно http://meta.stackexchange.com/questions/85358/what -элементы-рекомендации-для-использования-специфичные для версии теги и http://meta.stackoverflow.com/questions/299598/should-there-generally-be-only-one-tag-for-a-language -rather-than-multiple-esp, тег 'itext7' * может быть полезен. Я не против, но модераторы StackOverflow очень быстр, чтобы сквоить такой тег, не зная подробностей. –

+0

Я только что создал тег, давайте посмотрим, как долго он будет жить. Честно говоря, я не оптимист. –

ответ

4

answer you found for 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(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; 
    } 
} 

Здесь вы найдете перезаписи многих других образцов.


Как заметил @Bruno в комментарии, есть даже немного другой пример, который был действительно создан для IText 7 (в отличие от приведенного выше примера, который является порт из IText 5 примера).

Это пример, сопровождающий chapter 7 of iText 7: building blocks tutorial. Он использует showTextAligned(), чтобы убедиться, что «Страница X of» хорошо соответствует «Y», независимо от того, сколько цифр X и Y имеют, ср. его конец из-страницы метод прослушивателя событий:

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)

+1

Это действительно полезно - спасибо @mkl! Вы пропустили одну из ключевых частей, хотя - где она задает общее количество страниц: 'canvas.showText (Integer.toString (pdfDoc.getNumberOfPages()));' –

+1

К сожалению, вы правы, я добавлю. – mkl

+0

Я играл с моей адаптированной версией этого примера, и я думаю, что в нем есть несколько ошибок. 'Холст.moveText (450,0) 'помещает текст« Страница X »в самую нижнюю часть страницы без поля, что выглядит немного странно, но что более важно,' canvas.moveText (550,803) 'далее вверх, помещает страницу count в верхнем правом углу документа, а не после текста «Страница X». –