2011-08-16 20 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の1ページPDFは、10KBの100ページpdfより少ないメモリしか必要としません。あなたのコードは、RandomAccessFileOrArrayによって読み込まれた部分的な部分だけでうまく見えます。 – Eriksberger

答えて

2

(例えば、新しいRandomAccessFileOrArray( "/ path/to/pdf");)。 InputStreamまたはURLを使用すると、ドキュメント全体が内部バイト配列にコピーされます。

関連する問題