可填写表格:两张填写相同表格的副本,第二张不打印数据

时间:2018-09-05 17:01:47

标签: itext

全部, 我有两个PDF。它们是相同的PDF,但是填充了不同的信息。例如,公司字段将以“ ABC公司”作为PDF1的填充数据,以“ XYZ公司”作为PDF 2的填充数据。 合并时,我会得到两个文档,但是第二个文档将不会在可填充字段中包含任何数据。
我可以切换它们合并的顺序,并且第一个总是有数据,但是第二个将没有数据。 通过研究,似乎由于页面上的字段都具有相同的名称而可能存在问题?这可能是问题吗?

我正在使用版本:iText 5.4

感谢您可以提供的任何帮助/建议。

--- 2018年9月10日显示代码。
仅供参考。我已经从几年前写过代码的人那里接过了这段代码,之前从未使用过Itext,所以我只是在深入研究。这是我正在使用的代码。 Oracle调用Java运行代码。

和往常一样,感谢您已经收到的回复以及将来的回复。.thx。

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 :(得分: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需要更多的内存,并且速度会更慢。