Я работаю над проектом, в котором используется itext 2.1.7. Мне нужно было решить проблему с акрополями, которые были невидимы при использовании PdfWriter
. Но затем мой PdfPTable
(который представляет собой страницу навигации) больше не может быть добавлен. Это произошло потому, что для добавления таблицы на страницу использовалось Document.add(PdfPTable)
. Возникает вопрос: как я могу добавить PdfPTable
на PdfCopy
или использовать PdfWriter
, чтобы мои акрополя не исчезли и т.д. c .. Теперь у меня есть PDF-файл с акрополями, созданными с помощью PdfCopy
. Также как я могу изменить порядок страниц таким же образом с помощью PdfCopy
?
// edit добавил мой дурацкий обходной путь, чтобы вручную отредактировать окончательный результат и добавить туда поля, если они существуют, но ссылки на моей индексной странице
Я хочу иметь возможность добавлять страницу в PDF-файл, состоящий из нескольких PDF-файлов, сохраняя при этом акрополя на страницах (если они есть) IText объединяет документы с акрополями
код, который был используется для добавления таблицы в PdfWriter
pdf:
final PdfPTable table = new PdfPTable(2);
table.setWidthPercentage(100);
table.setWidths(new int[]{5, 1});
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
for (List<TrayIndex> indexPage : indexPages) {
document.newPage();
//add index title
final int indexPageNumber = indexPages.indexOf(indexPage) + 1;
final String indexTitle = "INDEX" + (maxIndexPages > 1 ? indexPageNumber : "");//only add page number, if index consists of multiple pages
final PdfPCell cellTitle = PdfUtils.createCell(indexTitle,
largerFont, Rectangle.NO_BORDER, Element.ALIGN_LEFT);
table.addCell(cellTitle);
final PdfPCell cellTitleDummyFill = PdfUtils.createCell(" ",
largerFont, Rectangle.NO_BORDER, Element.ALIGN_LEFT);
table.addCell(cellTitleDummyFill);
//add index content
for (TrayIndex trayIndex : indexPage) {
final int pageNumber = trayIndex.getPage_nr();
final PdfPCell cellContent = PdfUtils.createCell(trayIndex.getText(), PdfUtils.createActionGoToPage(writer, pageNumber, PdfDestination.FIT),
font, Rectangle.BOTTOM, Color.LIGHT_GRAY, Element.ALIGN_LEFT);
table.addCell(cellContent);
final PdfPCell cellPageNumber = PdfUtils.createCell(Integer.toString(pageNumber),
font, Rectangle.BOTTOM, Color.LIGHT_GRAY, Element.ALIGN_RIGHT);
table.addCell(cellPageNumber);
}
}
document.add(table);
// put the index pages in front of the rest
document.newPage(); // always go to a new page before reordering pages
final int numberOfPages = writer.reorderPages(null);
final List<Integer> pageNumbers = Ints.asList(PdfUtils.getIndicesArray(numberOfPages, 1)); // one-based list of page numbers e.g. [1, 2, ..., n]
Collections.rotate(pageNumbers, maxIndexPages);
writer.reorderPages(Ints.toArray(pageNumbers));
public void addAcrofieldsIfExist(InputStream editedPdfs, OutputStream output, List<TrayIndex> originalPdfs, int fromPage) throws GeneratorException {
Validation.checkIfNull(editedPdfs, "Pdf input stream cant be null");
PdfReader readerEditedPdfs = null;
PdfCopy copy = null;
Document document = null;
try {
document = new Document();
readerEditedPdfs = new PdfReader(editedPdfs);
copy = new PdfCopy(document, output);
document.open();
int pages = readerEditedPdfs.getNumberOfPages();
for (int i = 1; i <= pages;) {
if (i != fromPage + 1) {
copy.addPage(copy.getImportedPage(readerEditedPdfs, i));
i++;
} else {
for (TrayIndex originalPdf : originalPdfs) {
PdfReader readerOriginalPdf = new PdfReader(originalPdf.getTray().getBytesProcedureData());
if (i != originalPdf.getPage_nr() + fromPage && (i > pages || readerEditedPdfs.getAcroFields().getFields().isEmpty())) {
copy.addPage(copy.getImportedPage(readerEditedPdfs, i));
i++;
} else {
for (int y = 1; y <= readerOriginalPdf.getNumberOfPages(); y++) {
copy.addPage(copy.getImportedPage(readerOriginalPdf, y));
i++;
readerOriginalPdf.close();
}
}
}
}
}
} catch (Exception ex) {
throw new GeneratorException(ex);
} finally {
close(readerEditedPdfs);
close(document);
copy.close();
}
}