Заполняемые формы: две заполненные копии одной формы, вторая не печатает данные - PullRequest
0 голосов
/ 05 сентября 2018

Все, У меня есть два PDF-файла. Это один и тот же PDF, но заполненный разной информацией. Например, поле «Компания» будет содержать «ABC Company» в качестве заполненных данных для PDF1 и «XYZ Company» в качестве заполненных данных для PDF 2. При объединении я получу оба документа, но второй не будет содержать данных в заполняемых полях.
Я могу поменять порядок их объединения, и всегда у первого будут данные, а у второго данных нет. Из исследования кажется, что могут быть проблемы из-за того, что поля на страницах имеют одинаковое имя? Может ли это быть проблемой?

Я использую версию: iText 5.4

Спасибо за любую помощь / предложения, которые вы можете предоставить.

--- 9/10/2018 Код для показа.
FYI. Я взял этот код у кого-то, кто написал его несколько лет назад и ранее не работал с Itext, поэтому я просто копаюсь в нем. Вот код, который я использую. Oracle вызывает Java для запуска кода.

Как всегда, спасибо за ответы, которые уже пришли, и за любые будущие ... спасибо.

import java.sql.Blob;
import java.sql.ResultSet;

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfReader;

public class PdfMerger {
    public static void merge(ResultSet pdfs, Blob dest) throws Exception {
        Document doc = new Document();
        PdfCopy copy = new PdfCopy(doc, dest.setBinaryStream(0));
        doc.open();
        while (pdfs.next()) {
            PdfReader rdr = new PdfReader(pdfs.getBinaryStream(1));
            for (int i = 1; i <= rdr.getNumberOfPages(); i++)
                copy.addPage(copy.getImportedPage(rdr, i));
        }
        copy.close();
        doc.close();
    }
}

- JM

Спасибо за ответ о:

PdfStamper stamper = new PdfStamper(reader, output);
stamper.setFormFlattening(true);
stamper.close();

Как человек, не являющийся Java, (строго PL / SQL) я очень благодарен за помощь. Где эти три строки будут размещены в коде выше, чтобы сгладить документы? Я прошу прощения за то, что не знал больше, но я только что был помещен в этот проект. Ценю помощь. Это последний шаг к завершению, и если бы я мог преодолеть это препятствие ....

Будет ли это выглядеть?

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "PdfMergerTest" as import java.sql.Blob;
import java.sql.ResultSet;

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class PdfMergerTest {
    public static void merge(ResultSet pdfs, Blob dest) throws Exception {
        Document doc = new Document();
        PdfCopy copy = new PdfCopy(doc, dest.setBinaryStream(0));
        doc.open();
        while (pdfs.next()) {
            PdfReader rdr = new PdfReader(pdfs.getBinaryStream(1));
            PdfStamper stamper = new PdfStamper(rdr,copy);
            stamper.setFormFlattening(true);
            stamper.close();            
            for (int i = 1; i <= rdr.getNumberOfPages(); i++)
                copy.addPage(copy.getImportedPage(rdr, i));
        }
        copy.close();
        doc.close();
    }
}

1 Ответ

0 голосов
/ 05 сентября 2018

Перед слиянием / объединением необходимо выровнять PDF-формы:

PdfStamper stamper = new PdfStamper(reader, output);
stamper.setFormFlattening(true);
stamper.close();

Значения полей станут частью документа в виде текста вместо field + value , и это предотвратит конфликт между значениями полей объединенных документов.

Обновление: Код результата в вашем случае будет:

PdfReader rdr = new PdfReader(pdfs.getBinaryStream(1));
ByteArrayOutputStream output = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(rdr, output);
stamper.setFormFlattening(true);
stamper.close();            

rdr = new PdfReader(output.toByteArray());
for (int i = 1; i <= rdr.getNumberOfPages(); i++) {
    copy.addPage(copy.getImportedPage(rdr, i));
}

Это означает, что он заполняет форму, используя PdfStamper, и сохраняет ее в ByteArraouOutputStream, а затем снова читает заполненный PDF и добавляет страницу за страницей в PdfCopy.

Вы также можете попробовать использовать PdfSmartCopy вместо PdfCopy, чтобы уменьшить размер файла PDF. PdfSmartCopy пытается совместно использовать одни и те же объекты в PDF-файле, к которому присоединен результат, но ему требуется гораздо больше памяти, чем PdfCopy, и он будет работать медленнее.

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