【问题标题】:Add multiple attachments in a pdf using itext pdf stamper使用 itext pdf stamper 在 pdf 中添加多个附件
【发布时间】:2015-01-07 15:47:55
【问题描述】:

我想在一个 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();

【问题讨论】:

  • 看来你在每次迭代中都覆盖了附件
  • 我对此进行了测试。显然,这样做是可以的。我无法重现该问题。
  • 您使用哪个 iText 版本?

标签: java pdf itext pdfstamper


【解决方案1】:

您已对现有示例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();
}

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

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

另一个区别是我使用了一个 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 来证明您是正确的,这样我们就可以在我们的机器上运行它并重现问题。

【讨论】:

  • 所以我需要将文件名存储在一个数组中。这些附件不仅仅是txt文件,它们也可以是doc或odt文件。
  • @iampitre 你试过我的独立示例了吗?它有效吗?如果没有,那么您可能使用的是旧的 iText 版本。如果是这样,那么我们不知道的SOSCustomerOrderFile 可能有问题。
  • SOSCustomerOrderFile 是一个类,链接到数据库,有附件文件。 orderList 是该特定 SOSCustomerOrder 的文件总数。
  • 也许我应该给我们最新版本的 itextpdf
  • 所以我的假设是正确的,getFileName() 返回一个带有文件名的简单String,而getFileData() 返回文件的字节。那么,我写的SSCCE,反映了实际情况。
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 2017-12-19
  • 2014-08-18
  • 2018-04-14
  • 2013-07-07
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多