【发布时间】:2014-04-26 17:09:15
【问题描述】:
我使用 OpenOffice 创建 odt 文件,在该文件中创建表单域,并将 odf 文件保存为 PDF 文件。然后使用 itext 将数据填充到 pdf 文件中。每个 pdf 中显示的每个表单字段。但是当我合并 pdf 文件时,所有表单字段都丢失了。请帮忙。
设置字段代码:
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();
}
}
}
合并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();
}
}
}
【问题讨论】:
-
您选择使用代码进行合并,这会显式丢弃所有交互式内容。你会找到解释和替代方案here。