Reputation: 2847
I use OpenOffice to create odt file,create form fields in this file, and save odf file as PDF file. Then use itext to fill data into pdf files.Every form field showing in each pdf. But when I merger pdf files, all form fields missing. Please help.
Code of set fields:
FileOutputStream fos = new FileOutputStream(outpath);
PdfReader reader= new PdfReader(templateinputsream);
PdfStamper stamp = new PdfStamper(reader, fos);
AcroFields form = stamp.getAcroFields();
setField(form, fieldsMap);
private void setField(AcroFields form, Map<String, String> map) {
Iterator<Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Entry<String, String> entry = it.next();
String key = entry.getKey();
String value = entry.getValue();
try {
form.setField(key, value);
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
Code of merge pdf:
private void mergePdf(List<String> files, String savepath) {
try {
List<InputStream> pdfs = new ArrayList<InputStream>();
for (int i = 0; i < files.size(); i++) {
pdfs.add(new FileInputStream(files.get(i)));
}
OutputStream output = new FileOutputStream(savepath);
Document document = new Document(new PdfReader(files.get(0)).getPageSize(1));
concatPDFs(document, pdfs, output);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void concatPDFs(Document document, List<InputStream> streamOfPDFFiles, OutputStream outputStream) {
try {
List<InputStream> pdfs = streamOfPDFFiles;
List<PdfReader> readers = new ArrayList<PdfReader>();
int totalPages = 0;
Iterator<InputStream> iteratorPDFs = pdfs.iterator();
while (iteratorPDFs.hasNext()) {
InputStream pdf = iteratorPDFs.next();
PdfReader pdfReader = new PdfReader(pdf);
readers.add(pdfReader);
totalPages += pdfReader.getNumberOfPages();
}
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
PdfImportedPage page;
int pageOfCurrentReaderPDF = 0;
Iterator<PdfReader> iteratorPDFReader = readers.iterator();
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = iteratorPDFReader.next();
while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
document.newPage();
pageOfCurrentReaderPDF++;
page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);
cb.addTemplate(page, 0, 0);
}
pageOfCurrentReaderPDF = 0;
}
outputStream.flush();
document.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document.isOpen())
document.close();
try {
if (outputStream != null)
outputStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
Upvotes: 0
Views: 3349
Reputation: 77528
I see three possible problems:
[1.]
There is a known problem with forms generated using OpenOffice: appearances are missing! (Actually, somebody should tell the OpenOffice developers to fix this). You can solve this by adding the following line:
fields.setGenerateAppearances(true);
See FillDataSheet for the full example.
[2.]
You are making the same mistake as described in "Duplicate questions" versus "RTFM"
As documented, using PdfWriter
throws away all interactive features. As you don't flatten your document, the fields remain interactive, so by chosing PdfWriter
instead of PdfCopy
, you deliberately throw away the fields...
[3.]
When you use PdfCopy
, make sure you use the latest version of iText, because concatenating of forms has been implemented only recently. See https://stackoverflow.com/a/20659958/1622493 to find an almost exact copy of your question.
Upvotes: 2