全部,
我有两个PDF。它们是相同的PDF,但是填充了不同的信息。例如,公司字段将以“ ABC公司”作为PDF1的填充数据,以“ XYZ公司”作为PDF 2的填充数据。
合并时,我会得到两个文档,但是第二个文档将不会在可填充字段中包含任何数据。
我可以切换它们合并的顺序,并且第一个总是有数据,但是第二个将没有数据。
通过研究,似乎由于页面上的字段都具有相同的名称而可能存在问题?这可能是问题吗?
我正在使用版本:iText 5.4
感谢您可以提供的任何帮助/建议。
--- 2018年9月10日显示代码。
仅供参考。我已经从几年前写过代码的人那里接过了这段代码,之前从未使用过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();
}
}
答案 0 :(得分:1)
在合并/合并之前,您应该拼合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
需要更多的内存,并且速度会更慢。