2016-12-27 1 views
0

Я работаю над проектом, где в качестве части инструкций мне нужно прикрепить произвольные файлы PDF. Эти файлы PDF должны быть отмечены нумерацией заголовков и страниц в правом верхнем углу файла PDF. Это юридическое требование, так как эти приложения упоминаются по их названию и общему количеству страниц из заявлений.Добавление текста в верхнем правом углу PDF с помощью ColumnText работает для Portrait, а не для ландшафта

Я (наивно) взломал код, который, кажется, работает с файлами PDF со страницами в портретной ориентации (по крайней мере, файлы PDF, с которыми я тестировал). Однако, когда я использую этот код на страницах в альбомной ориентации, заголовок и нумерация не отображаются.


Код:

PdfContentByte canvas = pdfStamper.getOverContent(pageNr); 

Phrase phrase = new Phrase(sb.toString(), new Font(FontFamily.HELVETICA, 9f)); // sb holds title + page numbering 
float width = ColumnText.getWidth(phrase); 

ColumnText.showTextAligned (// draw text top-right 
    canvas, 
    Element.ALIGN_LEFT, 
    phrase, 
    canvas.getPdfDocument().right() - width, //x 
    canvas.getPdfDocument().top() + 9, //y 
    0 //rotation 
); 

Примеры:

  • Портрет, где это, кажется, работает:

enter image description here

  • пейзаж, где она не работает:

enter image description here


Вопросы:

  • Где я ж Ронг?
  • Можно ли написать такой фрагмент кода, который делает это правильно для всех возможных ориентаций страниц?
  • Если да, то как?

ответ

1

Вы добавляете информацию, но добавили ее не в то место. См. PageSize of PDF always the same between landscape and portrait with itextpdf

Предположим, что вы работаете со страницей формата А4, используя портретную ориентацию. Эти страницы измеряют 595 на 842 пользовательских устройства. 595 - ширина; 842 - высота.

Теперь давайте переключимся на пейзаж. Это можно сделать двумя разными способами:

  1. определяют ширину 595 и высоту 842 и поворот на 90 градусов.
  2. определяют ширину 842 и высоту 595.

Какой способ используется для определения альбомной ориентации будет иметь влияние на стоимость метода right() и top(). Я уверен, что вы добавляете заголовок на альбомные страницы, но добавляете их за пределы видимой области страницы.

+0

Спасибо за ваши идеи Бруно. Я решил проблему, используя 'pdfReader.getPageSizeWithRotation (pageNr)' в качестве основы для размещения названия/нумерации. –

0

Для тех, кого это интересует, я сделал это следующим образом.Это работает как для портретной, так и для ландшафтной ориентации. Для получения правильного размера страницы используется метод PdfReader.getPageSizeWithRotation.


private String pageText(int pageNr, int pageTotal) { 
    return ""; // generate string to display top-right of PDF here 
} 

private void addDocumentObjects(int pageNr, PdfReader pdfReader, PdfStamper pdfStamper) { 
    final float pageMargin = 25f; 
    final float textSize = 9f; 
    final float lineMargin = 5f; 

    Phrase phrase = new Phrase (
     pageText(pageNr, pdfReader.getNumberOfPages()), 
     new Font(FontFamily.HELVETICA, textSize) 
    ); 
    final float phraseWidth = ColumnText.getWidth(phrase); 

    PdfContentByte canvas = pdfStamper.getOverContent(pageNr); 
    com.itextpdf.text.Rectangle pageRectangle = pdfReader.getPageSizeWithRotation(pageNr); 

    // draw white background rectangle before adding text + line 
    canvas.setColorFill(BaseColor.WHITE); 
    canvas.rectangle (
     pageRectangle.getRight(pageMargin) - phraseWidth, //x 
     pageRectangle.getTop(pageMargin), //y 
     phraseWidth, // width 
     textSize + lineMargin //height 
    ); 
    canvas.fill(); 

    // draw text top right 
    canvas.setColorFill(BaseColor.BLACK); 
    ColumnText.showTextAligned (
     canvas, //canvas 
     Element.ALIGN_LEFT, //alignment 
     phrase, //phrase 
     pageRectangle.getRight(pageMargin) - phraseWidth, //x 
     pageRectangle.getTop(pageMargin), //y 
     0 //rotation 
    ); 

    // draw line under text 
    canvas.setColorStroke(BaseColor.BLACK); 
    canvas.setLineWidth(1); 
    canvas.moveTo (
     pageRectangle.getRight(pageMargin) - phraseWidth, //x 
     pageRectangle.getTop(pageMargin) - lineMargin //y 
    ); 
    canvas.lineTo (
     pageRectangle.getRight(pageMargin), //x 
     pageRectangle.getTop(pageMargin) - lineMargin //y 
    ); 
    canvas.stroke(); 
} 
Смежные вопросы