iText -> как сделать верстку страницы PDF
Может ли кто-нибудь показать пример работающего кода для верстки страниц PDF с помощью iText? Кажется, я исчерпал свои настройки Google: там нет примеров кода для этого.
Спасибо,
InnerOrchestra
ps. Под наложением - технический термин для печати, я имею в виду, например, наличие листа бумаги размером 11x17 для двух страниц размером 8,5x11. Для визитных карточек это будет та же страница (3,75x2,25), а для буклета - нет, поскольку лист будет сложен, а расположение страницы будет различаться в зависимости от настроек буклета.
1 ответ
Вы могли бы сэкономить много времени, прочитав главу 6 моей книги или просто взглянув на примеры на сайте iText. Взять, к примеру, пример NUpTool. Поскольку вы работаете в сфере печати, вы должны быть знакомы с термином "N-up". Это когда вы берете документ, а затем создаете новый с 2 страницами на одном (2-вверх), 4 страницами на одном (4-вверх) и т.д...
Ваш запрос очень похож, но его легче выполнить, потому что, когда мы берем документ, скажем, text_on_stationery.pdf, и мы выполняем его с помощью примера из моей книги, вы должны уменьшить страницы, например, в документе. result2up.pdf.
В вашем случае это не так сложно, потому что вам не нужно ничего масштабировать. Вам просто нужно создать Document
объект с удвоенным размером исходного документа, создатьPdfImportedPage
объекты для импорта страниц и использованияaddTemplate()
с правильным смещением, чтобы добавить их рядом в новом документе.
Есть довольно много примеров, которые демонстрируют использованиеPdfImportedPage
: http://itextpdf.com/themes/keyword.php?id=236
Странно, что Google не показывал вамSuperImposing
пример при поиске "навязывания". В этом примере мы добавляем четыре разных слоя друг на друга:
PdfReader reader = new PdfReader(SOURCE);
// step 1
Document document = new Document(PageSize.POSTCARD);
// step 2
PdfWriter writer
= PdfWriter.getInstance(document, new FileOutputStream(RESULT));
// step 3
document.open();
// step 4
PdfContentByte canvas = writer.getDirectContent();
PdfImportedPage page;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
page = writer.getImportedPage(reader, i);
canvas.addTemplate(page, 1f, 0, 0, 1, 0, 0);
}
// step 5
document.close();
reader.close();
Другими словами, 4-страничный документ теперь является 1-страничным документом, где все страницы отображаются друг на друге. Теперь вам нужно изменить шаг 1, чтобы размеры новых страниц были разными, и адаптировать шаг 4, чтобы две страницы добавлялись рядом друг с другом, а новая страница добавлялась после каждых двух страниц:
page = writer.getImportedPage(reader, i);
canvas.addTemplate(page, 1f, 0, 0, 1, 0, 0);
i++;
if (i <= reader.getNumberOfPages())
page = writer.getImportedPage(reader, i);
canvas.addTemplate(page, 1f, 0, 0, 1, width / 2, 0);
document.newPage();
В этом примере я предполагаю, что высота исходного документа равна высоте нового документа и что width
нового документа в два раза больше ширины исходного документа. Само собой разумеется, что вы также можете создать новый документ с такой же шириной и двойной высотой. В этом случае вам нужно:
page = writer.getImportedPage(reader, i);
canvas.addTemplate(page, 1f, 0, 0, 1, 0, height / 2);
i++;
if (i <= reader.getNumberOfPages())
page = writer.getImportedPage(reader, i);
canvas.addTemplate(page, 1f, 0, 0, 1, 0, 0);
document.newPage();