2015-01-07 193 views
0

我想將多個附件添加到pdf文件。 當我進入循環時,它只附加最後一個附件。使用itext在pdf中添加多個附件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(); 
+0

它似乎在每一次迭代中重寫附件 –

+0

我測試過了。顯然,這樣做可以。我無法重現這個問題。 –

+0

您使用哪個iText版本? – mkl

回答

2

你已經適應了現有的例子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[]與該文件的實際字節。通過不告訴我們什麼是類,你迫使我們做出這樣的假設。

如果磁盤上的文件,你也可以做這樣的事情:

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

那就是:如果SOSCustomerOrderFile類有一個getFilePath()方法返回的文件路徑。我們不知道,我們無法訪問(也不想訪問)您的完整代碼庫。我們只能創建一個SSCCE以嘗試重現問題,我們的SSCCE告訴我們您的指控是錯誤的。通過適應我們的SSCCE,我們可以在我們的機器上運行並重現問題,從而證明您是正確的。

+0

所以我需要將文件名存儲在數組中。 這些附件不僅僅是txt文件,它們也可以是doc或odt文件。 – iamP

+0

我會更新我的答案。 –

+0

@iampitre您是否嘗試過我的獨立示例?它工作嗎?如果沒有,那麼也許你使用的是舊的iText版本。如果確實如此,那麼我們不知道有什麼關於'SOSCustomerOrderFile'的錯誤。 –