2015-03-23 5 views
1

Используя iTextSharp, как я могу вставить новую страницу в начале страницы, когда PdfWriter уже писал страницы? Предположим, что индексная страница должна быть первой страницей документа, но вы не узнаете ее содержимое, пока не напишете весь документ. В частности, на какой странице написаны каждый раздел/глава.iTextSharp вставить страницу в начале

ответ

1

Вы не можете вернуться на первую страницу во время создания документа, но есть разные способы решения вашей проблемы.

Если вы не ожидаете наличия большого количества страниц, вы можете рассмотреть решение, объясненное в главе 5 iText in Action - Second Edition, более конкретно в примере MovieHistory1.java.

В этом примере мы изменить порядок страниц перед закрываем документ:

// step 1 
Document document = new Document(); 
// step 2 
PdfWriter writer 
    = PdfWriter.getInstance(document, new FileOutputStream(RESULT)); 
// IMPORTANT: set linear page mode! 
writer.setLinearPageMode(); 
// step 3 
document.open(); 
// step 4 
// Add all your content 
// Create a new order for the pages 
int total = writer.reorderPages(null); 
// change the order 
int[] order = new int[total]; 
for (int i = 0; i < total; i++) { 
    order[i] = i + toc; 
    if (order[i] > total) 
     order[i] -= total; 
} 
// apply the new order 
writer.reorderPages(order); 
// step 5 
document.close(); 

Почему я только рекомендую это для документов с ограниченным числом страниц? Для этого функциональность для работы нам нужно создать линейное дерево страниц:

writer.setLinearPageMode(); 

Линейное дерево страниц не совсем дерево (это дерево без ветвей), и что не является оптимальным в формате PDF.

Лучше переупорядочить страницы во второй раз. Это объясняется двумя вопросами, которые приведены в The Best iText Questions on StackOverflow (бесплатная электронная книга).

Вопросы были:

Я знаю, что наличие избыточной информации на SO не является идеальным, но это код, вам нужно:

PdfReader reader = new PdfReader(baos.toByteArray()); 
int n = reader.getNumberOfPages(); 
reader.selectPages(String.format("%d, 1-%d", n, n-1)); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename)); 
stamper.close(); 
+0

Прежде всего, спасибо, что помогли мне! Во-вторых, он * почти * работал, но у меня все еще есть проблема: количество страниц, обрабатываемых методом .ReorderPages(). На самом деле, writer.CurrentPageNumber и writer.PageNumber оба дают мне правильное количество страниц, но writer.ReorderPages (null) всегда дает мне количество страниц -1, и если я попытаюсь установить массив int с новым порядком плюс Еще 1 страница (соответствующая счету реальной страницы), writer.reorderPages (заказ); удары, потому что он говорит, что массив превышает количество страниц, что имеет смысл. –

+0

Если вы работаете с 'writer.CurrentPageNumber', убедитесь, что вычитаете один, потому что номера страниц начинаются с 1, но индекс переупорядочения начинает отсчет в 0. –

+0

Это не так. Документ фактически имеет 24 страницы, но writer.ReorderPages (null) возвращает 23, поэтому он ожидает массив с 23 элементами. Он переупорядочивает правильно, но он оставляет последнюю страницу (24-я страница) в конце (где она была), потому что она опускает эту страницу, поскольку она думает, что ее всего 23, а не 24. –

Смежные вопросы