5

iTextを介して1000個のPDFファイルをマージしようとしています。メモリリークがどこで発生しているのかわかりません。以下はサンプルコードです。親ファイルにマージするとすぐに子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();
4

7 に答える 7

8

次のようなことを試してみてください (例外処理、わかりやすくするためにファイルのクローズと削除を削除しました)。

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();
于 2009-08-12T04:37:31.210 に答える
1
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");        
          }               
         }
   }
于 2013-05-23T10:37:17.257 に答える
1

メモリリークがあると誰が言いますか? マージされたドキュメントは全体がメモリに収まる必要があり、それを回避する方法はなく、(ディスクではなく)メモリ内のデフォルトのヒープ サイズである 64 MB よりも大きくなる可能性があります。

あなたのコードに問題は見当たりませんが、詳細に診断したい場合は、visualvm のヒープ プロファイラーを使用してください(Java 6 update 10 以降の JDK に付属しています)。

于 2009-08-11T15:08:58.147 に答える
0

InputStream を使用しない場合はどうなりますか? 可能であれば、'new PDFReader("/somedirectory/file.") でファイルのパスだけを使用してみてください。

これにより、リーダーはディスク上で動作します。

于 2012-12-17T13:13:15.687 に答える
0

上記のコードは、ループ内でPdfContentByteオブジェクト ( ) を作成しようとしています。cb外に移動すると、問題が解決する場合があります。アプリケーションで同様のコードを使用して、13,000 の個別の PDF を 1 つの PDF に問題なくつなぎ合わせました。

于 2013-03-19T17:55:18.573 に答える
0

最大ヒープ サイズをデフォルト (わずか 64 MB) から増やしてみましたか?

見る:

于 2009-08-11T15:00:48.987 に答える
-2

1000 個の PDF をマージする代わりに、それらの zip を作成してみてください。

于 2012-11-28T11:28:43.923 に答える