2015-01-07 3 views
0

Я хочу добавить несколько вложений в файл pdf. Когда я вхожу в цикл, он присоединяет только последнее приложение.Добавить несколько вложений в pdf с помощью itext pdf stamper

образец кода

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[] с фактическими байтами этого файла. Не сообщая нам, что такое класс SOSCustomerOrderFile, вы заставляете нас делать это предположение.

Если у вас есть файл на диске, вы можете также сделать что-то вроде этого:

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, о котором мы ничего не знаем. –

Смежные вопросы