Слияние двух шаблонов в iText - PullRequest
1 голос
/ 06 мая 2010

Допустим, у меня есть два PDF-шаблона, созданные с помощью Adobe Acrobat, которые представляют собой одностраничные документы размером 8,5х11. Первый шаблон (A.pdf) имеет содержимое для верхней половины страницы. Второй шаблон (B.pdf) содержит контент для нижней половины страницы. (Так получилось, что содержимое обоих шаблонов не перекрывает друг друга.)

Я бы хотел использовать iText, чтобы взять эти два шаблона и создать из него один «объединенный» шаблон (C.pdf), который представляет собой одну страницу (с содержимым A.pdf в верхней части и B.pdf содержание в нижней половине).

(Я не хочу «объединять» эти два файла в двухстраничный документ. Мне нужен конечный продукт, состоящий из одной страницы.)

Я буду запускать iText в среде сервлетов (Tomcat 6), но я не думаю, что это имеет значение для ответа.

Возможно ли это?

Ответы [ 3 ]

4 голосов
/ 10 августа 2010

Я получил помощь от Марка Сторера в списке рассылки iText . Решение состоит в том, чтобы получить PdfTemplate объекты для каждого файла, а затем использовать метод addTemplate(), чтобы сложить их вместе, например ::

PdfTemplate topOfPage = writer.getImportedPage( reader, 1 );
PdfTemplate bottomOfPage = writer.getImportedPage( reader, 2 );

PdfContentByte content = writer.getDirectContent();

// in PDF, "0, 0" is the lower left corner.
content.addTemplate( bottomOfPage );
content.addTemplate( topOfPage, 0, bottomOfPage.getHeight() );
1 голос
/ 07 мая 2010

Возможно, этот пример кода помогает http://kickjava.com/src/com/lowagie/tools/handout_pdf.java.htm

0 голосов
/ 27 марта 2016

Гораздо более распространенным случаем является объединение одностраничного фонового PDF-файла с многостраничным исходным PDF-файлом. Например, фоновый pdf содержит только верхний и нижний колонтитулы. Исходный pdf уже подготовлен с верхним и нижним полями в качестве заполнителей для верхнего и нижнего колонтитула фонового шаблона PDF в этой сцене. Если вы ищете это - как и я - вы наткнетесь здесь на эту ветку и можете применить следующий подход:

tplFile$ = "c:/0/background.pdf"
srcFile$ = "c:/0/source1.pdf"
destFile$ = "c:/0/newMergedDest.pdf"

declare Document destDoc!
declare PdfWriter destWriter!
declare PdfReader mainDocReader!
declare PdfReader singlePageBackgroundReader!
declare PdfImportedPage mainDocPage!
declare PdfImportedPage backgroundPage!
declare PdfContentByte dcb!
declare PdfContentByte ucb!

destDoc! = new Document()
destWriter! = PdfWriter.getInstance(destDoc!, new FileOutputStream(destFile$))
destDoc!.open()
dcb! = destWriter!.getDirectContent()
ucb! = destWriter!.getDirectContentUnder()
mainDocReader! = new PdfReader(srcFile$)
singlePageBackgroundReader! = new PdfReader(tplFile$)
backgroundPage! = destWriter!.getImportedPage(singlePageBackgroundReader!,1)
for i=1 to mainDocReader!.getNumberOfPages()
    destDoc!.newPage()
    mainDocPage! = destWriter!.getImportedPage(mainDocReader!,i)
    dcb!.addTemplate(mainDocPage!,0,0)
    ucb!.addTemplate(backgroundPage!,0,0)
next i
destDoc!.close()
...