Unire 1000 PDF attraverso iText getta java.lang.OutOfMemoryError: lo spazio di heap Java

StackOverflow https://stackoverflow.com/questions/1260895

  •  12-09-2019
  •  | 
  •  

Domanda

Sto cercando di unire file PDF 1000 attraverso iText. Non sono sicuro dove la perdita di memoria che sta accadendo. Di seguito è riportato il codice di esempio. Si noti che sto rimuovendo il file pdf di bambino appena ho fondono per il file principale. Si prega di pointout bug nel codice qui sotto o c'è un modo migliore per fare questo con la concezione della memoria. Questo processo è fatto attraverso il servlet (non programma autonomo)

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();
È stato utile?

Soluzione

Si potrebbe desiderare di provare qualcosa di simile al seguente (la gestione delle eccezioni, archiviare e cancellare vicino rimosso per chiarezza):

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();

Altri suggerimenti

Chi dice che c'è una perdita di memoria? Il vostro documento unito deve entrare nella memoria nella sua interezza, non c'è niente da fare, e può ben essere maggiore della dimensione predefinita mucchio di 64MB in memoria (piuttosto che su disco).

Non vedo un problema con il codice, ma se si vuole diagnosticare in dettaglio, mucchio profiler utilizzo VisualVM (fornito con il JDK dal Java 6 update 10 o giù di lì).

Che cosa succede se non si utilizza InputStream? Se è possibile, provare a utilizzare solo il percorso per voi file sul 'nuovo PdfReader ( "/ file / somedirectory.").

Questo rende il lettore ad agire sul disco.

Il codice precedente sta cercando di creare un oggetto PdfContentByte (cb) all'interno del ciclo. Muoversi fuori potrebbe risolvere il problema. Ho usato il codice simile nella mia applicazione per cucire insieme 13k singoli file PDF in uno PDF senza problemi.

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");        
          }               
         }
   }

Invece di fondere 1000 PDF, cercare di creare una cerniera di loro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top