私はドキュメントに電子透かしを入れているので、非常に大きくなる可能性があるので、完全にメモリに読み込む必要はありません。私は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
ガベージコレクションが実際にメモリリークかどうか、またはメモリが解放されていないことだけを確認しましたか? – Milhous
メモリ使用量とpdfサイズとページ量のちょうどコメント。 メモリ使用量は、ページ数よりもファイルサイズに依存しません。たとえば、1Mbの1ページPDFは、10KBの100ページpdfより少ないメモリしか必要としません。あなたのコードは、RandomAccessFileOrArrayによって読み込まれた部分的な部分だけでうまく見えます。 – Eriksberger