2016-04-14 2 views
0

Я использую iText 4.2.1 для создания моих отчетов в формате pdf. Итак, у меня есть шаблон PDF, который содержит титульную страницу, конечную страницу и страницу контента (которая просто содержит заголовок изображения).iText - Сохранение pagestamp в PdfCopy

Я использую PdfCopy & PdfImportedPage скопировать мой шаблон и PageStamp добавить мое содержимое динамически.

Нужна: Мне нужно использовать страницу содержания много раз: столько же, сколько содержание страниц в моем отчете.

Проблема: Если я использую pdfCopy.createPageStamp (importedPage) и ColumnText.showTextAligned добавить текст печать сохраняется в течение следующих содержательных страниц. Таким образом, моя страница содержания № 2 содержит текст 1-го (добавленный страницей) и собственный текст (добавленный другим PageStamp).

Вот пример кода:

 

    // Init 
    Document doc = new Document(); 
    PdfCopy pdfCopy = new PdfCopy(doc, new FileOutputStream(new File("Result.pdf"))); 
    doc.open(); 
    PdfReader pdfReader = new PdfReader("pdf-template.pdf"); 

    // Page 1 
    PdfImportedPage importedPage1= pdfCopy.getImportedPage(pdfReader, 2); 
    String text1= "Text of the first page - 1"; 
    PageStamp stamp1 = pdfCopy.createPageStamp(importedPage1); 
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, 
           new Phrase(text1), 400, 500, 0); 
    stamp.alterContents(); 
    pdfCopy.addPage(importedPage1); 

    // Page 2 
    PdfImportedPage importedPage2= pdfCopy.getImportedPage(pdfReader, 2); 
    String text2 = "Text of the second page - 2"; 
    PageStamp stamp2 = pdfCopy.createPageStamp(importedPage2); 
    ColumnText.showTextAligned(stamp2.getOverContent(), Element.ALIGN_CENTER, 
           new Phrase(text2), 200, 700, 0); 
    stamp2.alterContents(); 
    pdfCopy.addPage(importedPage2); 

    // Closing 
    doc.close(); 

-> На 2-й странице я буду видеть мой text1 и мой text2

Я попытался использовать один и тот же PdfImportedPage: тот же результат.

Я попытался использовать тот же самый PageStamp: тот же результат.

Я пробовал использовать различные PdfReader: он работает, но это действительно решение?

Благодарим за помощь.

+0

Нет такой вещи, как iText 4.2.1. Читайте о [этой версии изгоев] (http://itextpdf.com/maven-update-problem-with-itext-4.2.2), и вы поймете, что никто не знает, что находится внутри iText 4.2.1. Это неофициальная версия, не одобренная никем. Я не думаю, что кто-нибудь поможет вам, пока вы используете версию старше iText 5. –

+0

Вам следует получить поддержку от компании, которая создала эту вилку. Проблема в том, что компании больше не существует. Или спросите разработчика, который разветвил, ymasory. Проблема в том, что они, вероятно, не заинтересованы. –

+0

@GuillaumeB Отвечает ли мой ответ на ваш вопрос? – mkl

ответ

0

@Bruno и @Amedee уже прокомментировали использование версии 4.2.1, поэтому мне не нужно об этом говорить. Однако вопрос, который вы задаете, действителен для текущей версии iText. Таким образом:

Проблема: Если я использую pdfCopy.createPageStamp (importedPage) и ColumnText.showTextAligned добавить текст печать сохраняется в течение следующих содержательных страниц. Таким образом, моя страница содержания № 2 содержит текст 1-го (добавленный страницей) и собственный текст (добавленный другим PageStamp).

Этого следует ожидать, поскольку это документированное поведение. Посмотрите на PdfCopy.createPageStamp JavaDocs:

/** 
* Create a page stamp. New content and annotations, including new fields, are allowed. 
* The fields added cannot have parents in another pages. This method modifies the PdfReader instance.<p> 
* The general usage to stamp something in a page is: 
* <p> 
* <pre> 
* PdfImportedPage page = copy.getImportedPage(reader, 1); 
* PdfCopy.PageStamp ps = copy.createPageStamp(page); 
* ps.addAnnotation(PdfAnnotation.createText(copy, new Rectangle(50, 180, 70, 200), "Hello", "No Thanks", true, "Comment")); 
* PdfContentByte under = ps.getUnderContent(); 
* under.addImage(img); 
* PdfContentByte over = ps.getOverContent(); 
* over.beginText(); 
* over.setFontAndSize(bf, 18); 
* over.setTextMatrix(30, 30); 
* over.showText("total page " + totalPage); 
* over.endText(); 
* ps.alterContents(); 
* copy.addPage(page); 
* </pre> 
* @param iPage an imported page 
* @return the <CODE>PageStamp</CODE> 
*/ 
public PageStamp createPageStamp(PdfImportedPage iPage) 

(PdfCopy.java)

Как говорится во второй строке: Этот метод изменяет экземпляр PdfReader.

Таким образом,

Я попытался с помощью другого PdfReader: он работает, но это действительно решение ??

Это одно решение, но в зависимости от источника PDF достаточно ресурсоемкий. Другой вариант - использовать PdfCopy без PageStamps и применять ваши изменения в отдельном PdfStamper. В зависимости от вашего случая использования есть и другие из них ...

PageStamps представляет собой очень легкий способ отпечатать при копировании потому они просто манипулировать PdfReader и не должны строить свои собственные посреднические структуры. В случае несовместимых случаев использования,

+0

Hello mkl. Спасибо за Ваш ответ. Действительно, большая часть моего контента добавляется динамически (поскольку я добавляю диаграммы, графики, тексты, ... в мой отчет), поэтому Stamp кажется бесполезным. Я пытаюсь понять это с помощью PdfStamper ... –

+0

@GuillaumeB В этом случае, пожалуйста, либо принимайте мой ответ (нажмите галочку в левом верхнем углу), либо напишите собственный, и примите это. Оставляя вопросы открытыми, пока они уже разрешены, неуместно на сайте Q & A, таком как stackoverflow. – mkl

+0

Пока у меня пока нет четкого решения. Поэтому для меня этот вопрос все еще открыт ... Я работаю с PdfStamper, чтобы определить его возможности. –