Itext - Как клонировать страницы с акрополями? - PullRequest
8 голосов
/ 28 апреля 2011

Я пишу программу на Java, которая печатает PDF-файлы карт Bingo. Каждая страница - это одна карточка. Чтобы мне было проще, я создал файл шаблона PDF с акрополями, так что программе нужно будет только создать копию этого шаблона, заполнить акрополя числами, а затем сгладить его. На данный момент я могу создать 1 карту бинго. Я хочу, чтобы в одном файле PDF было несколько страниц (то есть несколько карточек). Но я не знаю, как это сделать. Я прочитал, что PDFStamper связан с одним и только одним объектом PDFReader. Есть ли способ, которым я могу сделать это, не прибегая к созданию нескольких файлов PDF и объединяя их в один (я сделал это в прошлый раз, и я нашел очень медленно) Спасибо заранее!

Ответы [ 2 ]

14 голосов
/ 28 апреля 2011

Мне понадобилось время, чтобы понять это.Это не самый эффективный способ кодирования, но, по сути, это то, что он делает:

  • создать документ
  • для каждой страницы с акрополем:
  • скопируйте ваш шаблон
  • заполните форму
  • выровняйте форму
  • добавьте страницу

Вот моя реализация, которую вы можете попробовать и изменить, чтобы соответствоватьВаши потребности:

private void createPdf() throws Exception {
    Document doc = new Document();
    PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
    doc.open();

    PdfReader reader;
    PdfStamper stamper;
    AcroFields form;
    ByteArrayOutputStream baos;

    for(int i = 0; i < getTotalPages(); i++) {
        copyPdf(i);

        reader = new PdfReader(String.format("%d%s", i, "template.pdf"));
        baos = new ByteArrayOutputStream();
        stamper = new PdfStamper(reader, baos);
        form = stamper.getAcroFields();

        //methods to fill forms

        stamper.setFormFlattening(true);
        stamper.close();

        reader = new PdfReader(baos.toByteArray());
        copy.addPage(copy.getImportedPage(reader, 1));
    }

    doc.close();
}

private void copyPdf(int currentPage) throws Exception {
    PdfReader reader = new PdfReader("timesheet.pdf");
    Document doc = new Document();
    File file = new File(String.format("%d%s", currentPage, "template.pdf"));
    file.deleteOnExit();
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(file));
    stamper.close();
}

Метод copyPdf() создает временные файлы, которые позволяют заполнять формы, не затрагивая весь документ.Если вы найдете более эффективный способ сделать это, дайте мне знать.

Кроме того, я обнаружил, что на Mac на базе Intel против Windows Computer, Mac выполняет это намного быстрее.

Если вы не против получить справочник по iText, я бы порекомендовал «iText in Action, Second Edition» Бруно Лоуаги.Это отличная книга и очень полезная.

2 голосов
/ 26 июня 2017

Итак, вот код без использования метода «copyPdf» Зака, как предложили Марк Сторер и МаксАрт:

private void createPdf() throws Exception {
    Document doc = new Document();
    PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
    doc.open();

    PdfReader mainReader = new PdfReader("timesheet.pdf");

    PdfReader reader;
    PdfStamper stamper;
    AcroFields form;
    ByteArrayOutputStream baos;

    for(int i = 0; i < getTotalPages(); i++) {

        reader = new PdfReader(mainReader);
        baos = new ByteArrayOutputStream();
        stamper = new PdfStamper(reader, baos);
        AcroFields form = stamper.getAcroFields();

        //methods to fill forms

        stamper.setFormFlattening(true);
        stamper.close();

        reader = new PdfReader(baos.toByteArray());
        copy.addPage(copy.getImportedPage(reader, 1));
    }

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