使用itext pdf压模在pdf中添加多个附件

时间:2015-01-07 15:47:56

标签: java pdf itext pdfstamper

我想在pdf文件中添加多个附件。 当我进入循环时,它只附加最后一个附件。

示例代码

PdfReader reader = new PdfReader(FILE);

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(realPath+"/Temp/"+sosValues.getCmaId()+".pdf"));

for(SOSCustomerOrderFile cmaOrder:orderList)
{
    PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(stamper.getWriter(), null, cmaOrder.getFileName(), cmaOrder.getFileData());
    /*  stamper.getWriter(), null, "test.txt", "Some test".getBytes());*/
    stamper.addFileAttachment("Attachment", fs);
}
stamper.close();

1 个答案:

答案 0 :(得分:3)

您已修改现有示例AddEmbeddedFile以添加多个附件,并声明只添加了一个附件。

我无法重现这一点。我还通过创建一个新示例来调整现有示例:AddEmbeddedFiles

public static final String[] ATTACHMENTS = {
    "hello", "world", "what", "is", "up"
};
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    for (String s : ATTACHMENTS) {
        PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(
            stamper.getWriter(), null, String.format("%s.txt", s),
            String.format("Some test: %s", s).getBytes());
        stamper.addFileAttachment(String.format("Content: %s", s), fs);
    }
    stamper.close();
}

结果包含所有预期的附件:

enter image description here

我看到的唯一区别是,您为每个嵌入文件指定了相同的名称,但即使我这样做,我仍然可以正确查看所有附件。

另一个不同之处在于我使用了一个String值数组,但这并不重要,假设cmaOrder.getFileName()确实返回了一个文件名(例如“order1.doc”,“order2”) .xls“,...)并且cmaOrder.getFileData()返回一个byte[],其中包含该文件的实际字节数。通过不告诉我们SOSCustomerOrderFile类是什么,你迫使我们做出这个假设。

如果你有磁盘上的文件,你也可以这样做:

PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(
    stamper.getWriter(), cmaOrder.getFilePath(), cmaOrder.getFileName(), null);

即:如果SOSCustomerOrderFile类具有返回文件路径的getFilePath()方法。我们不知道,我们没有访问您的完整代码库(我们也不想访问)。我们只能创建SSCCE以尝试重现问题,而我们的SSCCE告诉我们您的指控是错误的。您可以通过调整我们的SSCCE来证明您是对的,我们可以在我们的机器上运行它并重现问题。