Объединение 1000 PDF через iText создает ошибку java.lang.OutOfMemoryError: пространство кучи Java - PullRequest
4 голосов
/ 11 августа 2009

Я пытаюсь объединить 1000 файлов PDF через iText. Я не уверен, где происходит утечка памяти. Ниже приведен пример кода. Обратите внимание, что я удаляю файл child-pdf, как только я сливаюсь с родительским файлом. Пожалуйста, укажите на ошибку в приведенном ниже коде или есть лучший способ сделать это без концепции памяти. Этот процесс выполняется через сервлет (не автономная программа)

FileInputStream local_fis = null;
BufferedInputStream local_bis = null;
File localFileObj = null;
for(int taIdx=0;taIdx<totalSize;taIdx++){
    frObj = (Form3AReportObject)reportRows.get(taIdx);
    localfilename = companyId + "_" +  frObj.empNumber + ".pdf";

    local_fis = new FileInputStream(localfilename);
    local_bis = new BufferedInputStream(local_fis); 
    pdfReader = new PdfReader(local_bis);

    cb = pdfWriter.getDirectContent(); 
    document.newPage();
    page = pdfWriter.getImportedPage(pdfReader, 1);
    cb.addTemplate(page, 0, 0);
    local_bis.close();
    local_fis.close();

    localFileObj = new File(localfilename);
    localFileObj.delete();
}
document.close();

Ответы [ 7 ]

8 голосов
/ 12 августа 2009

Возможно, вы захотите попробовать что-то вроде следующего (обработка исключений, закрытие и удаление файлов для ясности):

for(int taIdx = 0; taIdx < totalSize; taIdx++) {
    Form3AReportObject frObj = (Form3AReportObject)reportRows.get(taIdx);

    localfilename = companyId + "_" +  frObj.empNumber + ".pdf";

    FileInputStream local_fis = new FileInputStream(localfilename);

    pdfWriter.freeReader(new PdfReader(local_fis));

    pdfWriter.flush();
}

pdfWriter.close();
2 голосов
/ 11 августа 2009

Кто сказал, что есть утечка памяти? Ваш объединенный документ должен полностью вписаться в память, его никак не обойти, и он вполне может быть больше размера кучи по умолчанию 64 МБ в памяти (а не на диске).

Я не вижу проблемы с вашим кодом, но если вы хотите подробно его диагностировать, используйте профилировщик кучи visualvm (поставляется с JDK с момента обновления Java 6 10 или около того).

1 голос
/ 11 августа 2009

Вы пытались увеличить максимальный размер кучи по умолчанию (который составляет всего 64 МБ)?

См:

0 голосов
/ 23 мая 2013
public class PdfUtils {
     public static void concatFiles(File file1, File file2, File fileOutput) throws Exception {
          List<File> islist =  new ArrayList<File>();
          islist.add(file1);
          islist.add(file2);

          concatFiles(islist, fileOutput);
         }

         public static void concatFiles(List<File> filelist, File fileOutput) throws Exception {
          if (filelist.size() > 0) {
                 PdfReader reader = new PdfReader(new FileInputStream( filelist.get(0)) );
                 Document document = new Document(reader.getPageSizeWithRotation(1));

           PdfCopy cp = new PdfCopy(document,  new FileOutputStream( fileOutput ));

           document.open();


           for (File file : filelist ) {

                PdfReader r = new PdfReader( new FileInputStream( file));
                for (int k = 1; k <= r.getNumberOfPages(); ++k) {
                    cp.addPage(cp.getImportedPage(r, k));
                }
                cp.freeReader(r);

           }
           cp.close();
           document.close();
          } else{             
           throw new Exception("La lista dei pdf da concatenare è vuota");        
          }               
         }
   }
0 голосов
/ 19 марта 2013

Приведенный выше код пытается создать объект PdfContentByte (cb) в цикле. Перемещение на улицу может решить проблему. Я использовал подобный код в своем приложении, чтобы без проблем соединить 13k отдельных PDF-файлов в один PDF-файл.

0 голосов
/ 17 декабря 2012

Что если вы не используете InputStream? Если вы можете, попробуйте использовать только путь для вашего файла в 'new PDFReader ("/ somedirectory / file.").

Это заставляет читателя действовать на диске.

0 голосов
/ 28 ноября 2012

Вместо объединения 1000 PDF-файлов попробуйте создать ZIP-архив из них.

...