Добавьте несколько вложений в 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();

person iamP    schedule 07.01.2015    source источник
comment
кажется, вы переопределяете вложение на каждой итерации   -  person Jordi Castilla    schedule 07.01.2015
comment
Я проверил это. Судя по всему, это нормально. Не могу воспроизвести проблему.   -  person Bruno Lowagie    schedule 07.01.2015
comment
Какую версию iText вы используете?   -  person mkl    schedule 07.01.2015


Ответы (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 таким образом, чтобы мы могли запускать его на наших машинах и воспроизводить проблему.

person Bruno Lowagie    schedule 07.01.2015
comment
поэтому мне нужно хранить имена файлов в массиве. эти вложения представляют собой не только файлы txt, они также могут быть файлами doc или odt. - person iamP; 07.01.2015
comment
@iampitre Вы пробовали мой автономный пример? Это работает? Если нет, то, возможно, вы используете старую версию iText. Если это так, то, возможно, что-то не так с SOSCustomerOrderFile, о котором мы ничего не знаем. - person Bruno Lowagie; 07.01.2015
comment
SOSCustomerOrderFile — это класс, связанный с базой данных, имеющий вложенные файлы. и orderList — это общее количество файлов, присутствующих для этого конкретного SOSCustomerOrder. - person iamP; 07.01.2015
comment
Может быть, я должен использовать последнюю версию itextpdf - person iamP; 07.01.2015
comment
Итак, мое предположение было верным, getFileName() возвращает простое String с именем файла, тогда как getFileData() возвращает байты файла. В этом случае SSCCE, который я написал, отражает реальную ситуацию. - person Bruno Lowagie; 07.01.2015