2011-08-16 2 views
1

문서를 워터 마킹하고 있습니다. 메모리가 상당히 클 수 있으므로 메모리에 완전히로드하지 않아도됩니다. 그 종류의 RandomAccessFileOrArray 그 버퍼를 읽고, 괜찮아요하지만 여전히 너무 많이 내 좋아하는로드 할 것으로 나타났습니다.iText 메모리 관리 - PdfReader/Watermarking로드가 너무 많습니다.

즉, 5Mb PDF 파일을로드하면 사용 된 메모리가 23MB 증가합니다! 그리고 워터 마킹을 시작할 때 또 다른 27Mb를 뛰어 넘습니다! 그 후 사용 된 메모리는 점차 증가하지만 끔찍한 것은 아닙니다.

이러한 동작이 발생합니까? PdfReader 또는 RandomAccessFileOrArray 또는 다른 것의 버퍼 크기를 정의하는 방법을 알고 있습니까?

입력 해 주셔서 감사합니다.


printMem 메서드는 free-used-total을 표시하여 메모리 상태를 표시합니다. 여기

내 코드

printMem("Before load"); 
    PdfReader reader = null; 
    try { 
     reader = new PdfReader(new RandomAccessFileOrArray(new FileInputStream("C:/TEMP/zip/100258.pdf")),null); 
     printMem("After load"); 
     FileOutputStream out = new FileOutputStream(f); 
     PdfStamper stamp = new PdfStamper(reader, out); 

     int numPages = reader.getNumberOfPages(); 
     int page=1; 
     BaseFont baseFont = 
      BaseFont.createFont(BaseFont.HELVETICA_BOLDOBLIQUE, 
       BaseFont.WINANSI, BaseFont.EMBEDDED); 
     float width; 
     float height; 

     while (page <= numPages) { 
      printMem("Page " + page); 
      PdfContentByte cb = stamp.getOverContent(page); 
      height = reader.getPageSizeWithRotation(page).getHeight()/2; 
      width = reader.getPageSizeWithRotation(page).getWidth()/2; 

      cb.saveState(); 
      cb.setColorFill(MEDIUM_GRAY); 

      // Primary Text 
      cb.beginText(); 
      cb.setFontAndSize(baseFont, PRIMARY_FONT_SIZE); 
      cb.showTextAligned(Element.ALIGN_CENTER, "WatermarkText", width, 
        height, TEXT_TILT_ANGLE); 
      cb.endText(); 

      cb.restoreState(); 
      page++; 
     } 
     stamp.close(); 
    } catch(Throwable e) { 
     reader = null; 
     System.gc(); 
    } 

입니다 그리고 여기 부분 출력 : 파일의 경로를 포함하는 문자열로 RandomAccessFileOrArray를 구성하면 문서가 부분적으로 만 읽어

Before load | 1566248160 6615840 1572864000 
After load | 1542392472 30471528 1572864000 
Page 1 | 1515096880 57767120 1572864000 
Page 2 | 1515095992 57768008 1572864000 
Page 47 | 1512998840 59865160 1572864000 
Page 48 | 1512998840 59865160 1572864000 
+0

가비지 수집이 실제로 메모리 누수인지 확인하려고 했습니까? 아니면 메모리가 해제되지 않았습니까? – Milhous

+0

메모리 사용량 및 PDF 크기 대 페이지 수에 대한 설명. 메모리 사용량은 페이지 수보다 파일 크기에 덜 좌우됩니다. 예를 들어 1Mb의 한 페이지 PDF는 10KB의 100 페이지 pdf보다 적은 메모리가 필요합니다. 귀하의 코드는 RandomAccessFileOrArray에 의해 부분 읽기와 함께 잘 보입니다. – Eriksberger

답변

2

(예 : 새로운 RandomAccessFileOrArray ("/ path/to/pdf");). InputStream 또는 URL을 사용하면 전체 문서가 내부 바이트 배열로 복사됩니다.