2015-04-16 5 views
1

Использование iText 5.5.5. У меня есть открытый com.itextpdf.text.Document через экземпляр PdfWriter. В разных точках во время построения документа мне нужно добавить статические PDF-страницы. Статические страницы поступают в виде byte[].Добавить существующий документ PDF в открытый документ

После нескольких примеров на itextpdf.com, я не могу сшить их примеры с моим прецедентом. Вот код:

Document trunk = new Document(); 
PdfWriter writer = PdfWriter.getInstance(trunk, getTrunkStream()); 
writer.setPageEvent(geTrunkPageEvent()); 
trunk.open(); 

.... 

PdfReader reader = new PdfReader(bytes); 
// graft == my static content 
Document graft = new Document(reader.getPageSizeWithRotation(1)); 
PdfCopy copy = new PdfCopy(graft, getTrunkStream()); 
graft.open(); 

int count = reader.getNumberOfPages(); 
for(int page = 0; page < count;) { 
    copy.addPage(copy.getImportedPage(reader, ++page)); 
} 

copy.freeReader(reader); 
reader.close(); 

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

+0

Вы загрузили бесплатную книгу [Лучшие вопросы iText по StackOverflow] (http://pages.itextpdf.com/ebook-stackoverflow -questions.html)? Он содержит ответ на этот вопрос [Создание PDF-изображения в iText] (http://stackoverflow.com/questions/23022471/creating-a-pdf-image-in-itext). В вашем коде вы используете 'getTrunkStream()' дважды: один раз для создания документа с нуля с помощью 'PdfWriter' и один раз для объединения существующих документов с помощью' PdfCopy'. Это противоречит всей логике. Разве вы не читали [глава 6 моей книги] (http://manning.com/lowagie2/samplechapter6.pdf)? –

+0

Зачем покровительствовать вопросу? –

+0

Потому что я покровитель iText. Вы когда-нибудь летали в Силиконовой долине? Тогда вы узнаете, что аэропорт SFO расположен в месте под названием Сан-Бруно: D –

ответ

3

Читать ответ на этот вопрос Read BLOB (PDF Content) from database and edit and output PDF, для более подробного описания

Использование PdfContentByte для удержания содержимого PDF добавляемого

PdfContentByte cb = writer.getDirectContent(); 

Создание объекта PdfImportedPage страницы для каждой страницы, которую требуется импорт из другого документа с использованием getImportedPage() и добавьте страницу, используя writer, используя addTemplate():

trunk.newPage(); 
page = writer.getImportedPage(pdfReader, pagenumber); 
cb.addTemplate(page, 0, 0); 

Обязательно закройте document и pdfReader.

Примечание: не используйте этот фрагмент кода, если вы просто хотите объединить кучу файлов. Причина, почему вы не должны этого делать, объясняется в ответе на вопрос How to merge documents correctly?

+2

Я обновил ваш ответ, потому что он может быть легко истолкован как способ слияния документов. При импорте страниц важно понять оговорки, объясненные в ответе на вопрос [Как правильно слить документы?] (Http://stackoverflow.com/questions/21731439/how-to-merge-documents-correctly) который является вопросом, который был выбран как один из [The Best iText Questions on StackOverflow] (http://pages.itextpdf.com/ebook-stackoverflow-questions.html). С этими изменениями на месте ответ заслуживает продолжения ;-) –

+1

@BrunoLowagie, я никогда не сталкивался с ситуацией со страницами с разной ориентацией, поэтому не знал об этой проблеме. Взгляд более чем заслуживает ответа, который указывает на это правильно! –

+1

Это решение сработало для меня. Хотя я должен был быть уверен и выключить событие страницы моей внешней линии и вызвать новую страницу, прежде чем возвращать ее обратно, так как я хотел сохранить именно то, что было получено. Спасибо, парни. –

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