2017-09-29 1 views
1

私は100k個以上のpdfファイルを1つのpdfファイルにマージする方法を尋ねますか?多くのpdfをマージする方法

Tutorial

私はすでにコードは、いくつかのPDFファイルのために働いていることを、このチュートリアルをお読みください。しかし、10k pdfファイルで試したところ、このエラー "java.lang.OutOfMemoryError:GCオーバーヘッドの上限を超えました"が返されました。

すでに-Xmxまたは-Xmsを使ってみましたが、エラーは「Javaヒープスペース」になりました。

「pdf.flushCopiedObjects(firstSourcePdf);」も使用しています。それは助けにならない。または、私はそれを間違って使用していますか?

File file = new File(pathName); 
     File[] listFile = file.listFiles(); 
     if (listFile == null) { 
      throw new Exception("File not Found at " + pathName); 
     } 
     Arrays.sort(listFile, 0, listFile.length - 1); 

     PdfADocument pdf = new PdfADocument(new PdfWriter(dest), 
      PdfAConformanceLevel.PDF_A_1A, 
      new PdfOutputIntent("Custom", "", "http://www.color.org", 
       "sRGB IEC61966-2.1", null)); 

     //Setting some required parameters 
     pdf.setTagged(); 
     pdf.getCatalog().setLang(new PdfString("en-US")); 
     pdf.getCatalog().setViewerPreferences(
      new PdfViewerPreferences().setDisplayDocTitle(true)); 
     PdfDocumentInfo info = pdf.getDocumentInfo(); 
     info.setTitle("iText7 PDF/A-1a example"); 

     //Create PdfMerger instance 
     PdfMerger merger = new PdfMerger(pdf); 
     //Add pages from the first document 

     for (File filePdf : listFile) { 
      System.out.println("filePdf = " +filePdf.getName()); 
      PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(filePdf)); 
      merger.merge(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages()); 
      pdf.flushCopiedObjects(firstSourcePdf); 
      firstSourcePdf.close(); 
     } 

     pdf.close(); 

PDF文書(または大規模なPDFファイル)を大量にマージするときこれは既知の問題であるあなたに

答えて

4

ありがとうございます。

iTextは、できるだけ小さなPDFを作成しようとします。これは、オブジェクトを再利用しようとすることによって行います。たとえば、イメージが複数回存在する場合、そのイメージを毎回埋め込む代わりに、そのイメージを1回埋め込み、単に他のオカレンスの参照を使用します。

つまり、オブジェクトが再利用されるかどうかを事前に知る方法がないため、iTextはすべてのオブジェクトをメモリに保持する必要があります。

通常は、プロセスを複数のバッチに分割する方法が役立ちます。 1000個のファイルを1つにマージする代わりに、1000個のファイルをペアでマージして(結果として500個のドキュメントを作成)、それらをペアでマージして250個のドキュメントを作成します。

これは、iTextがバッファを定期的にフラッシュすることを可能にします。これにより、メモリオーバーヘッドがVMのクラッシュから停止するはずです。

0

iTextである必要がない場合は、ファイルのマージをサポートするコマンドラインアプリケーションを使用できます。 PDFtkQPDFHexaPDF CLI(注:私はHexaPDFの著者です)は、基本的なPDFファイルのマージをサポートするいくつかのCLIツールです。

+0

2番目のリンクに所属していますか?そうであれば、それを[自己昇進に関するルール](/ help/promotion)に従って明示的に述べる必要があります。 – Glorfindel

+0

HexaPDFがあなた自身の製品である場合、あなたがそれにリンクするとき、関連を明らかにする必要があります。それ以外の場合はスパムとみなされる可能性があります。 –

+0

申し訳ありません、ありがとうございます - 私はちょうどその答えを編集しました。 – gettalong

関連する問題