使用 itext pdf stamper 在 pdf 中添加多个附件
Add multiple attachments in a pdf using itext pdf stamper
我想在一个 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();
您修改了现有示例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()
确实 returns 一个文件名(例如 "order1.doc", "order2.xls",...) 和 cmaOrder.getFileData()
returns 一个 byte[]
与该文件的实际字节数。通过不告诉我们 SOSCustomerOrderFile
class 是什么,你是在强迫我们做出这样的假设。
如果你有磁盘上的文件,你也可以这样做:
PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(
stamper.getWriter(), cmaOrder.getFilePath(), cmaOrder.getFileName(), null);
即:如果SOSCustomerOrderFile
class有一个getFilePath()
方法,即returns文件的路径。我们不知道,我们无权访问(也不想访问)您的完整代码库。我们只能创建一个 SSCCE 来尝试重现问题,我们的 SSCCE 告诉我们您的指控是错误的。您可以通过采用我们可以 运行 在我们的机器上重现问题的方式调整我们的 SSCCE 来证明您是正确的。
我想在一个 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();
您修改了现有示例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()
确实 returns 一个文件名(例如 "order1.doc", "order2.xls",...) 和 cmaOrder.getFileData()
returns 一个 byte[]
与该文件的实际字节数。通过不告诉我们 SOSCustomerOrderFile
class 是什么,你是在强迫我们做出这样的假设。
如果你有磁盘上的文件,你也可以这样做:
PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(
stamper.getWriter(), cmaOrder.getFilePath(), cmaOrder.getFileName(), null);
即:如果SOSCustomerOrderFile
class有一个getFilePath()
方法,即returns文件的路径。我们不知道,我们无权访问(也不想访问)您的完整代码库。我们只能创建一个 SSCCE 来尝试重现问题,我们的 SSCCE 告诉我们您的指控是错误的。您可以通过采用我们可以 运行 在我们的机器上重现问题的方式调整我们的 SSCCE 来证明您是正确的。