есть ли возможность добавить PdfPTable к объекту PdfCopy? - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над проектом, в котором используется 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();
}

}

1 Ответ

0 голосов
/ 20 августа 2020

Ваш пост сбивает с толку. Расскажите, пожалуйста, что вы делаете и что пытаетесь получить в итоге? Например,

  1. У меня есть существующий файл PDF (или файлы)
  2. Я хочу добавить новую страницу с таблицей (некоторая информация о навигации) к этому PDF-файлу
  3. Я хочу добавить поля формы / сохранить существующие поля ...

Я понимаю, что вы используете PdfWriter для добавления новой страницы с таблицей с некоторой навигационной информацией на ней. Но почему вы используете PdfCopy? PdfCopy - это копирование содержимого из одного PDF-файла в другой PDF-файл. Ваши поля, вероятно, не отображаются, потому что, если вы хотите скопировать поля формы из другого PDF-файла, вам нужно использовать PdfCopyFields. А вы рассматривали возможность использования PdfSmartCopy?

Итак, в конце концов, вам нужно переделать свой вопрос и свой код. Вы не разместили соответствующую часть кода. Я не понимаю, как и где вы используете PdfWriter / PdfCopy et c. Большая часть создания вашей 1-й страницы с таблицей не имеет значения и не помогает.

Отказ от ответственности: я бы опубликовал это как комментарий, но он был слишком длинным ...

Обновление: Насколько я понимаю сейчас, вы хотите сделать несколько вещей:

  1. Добавить страницу навигации
  2. изменить порядок страниц
  3. добавить поля формы (?)

Я только что проверил PdfCopyFields, и он расширяет PdfWriter. Так вы пробовали использовать PdfCopyFields и все делать? Думаю, в этом случае поля формы должны остаться нетронутыми ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...