2017-09-29 3 views
1

나는 100k 개 이상의 pdf 파일을 병합하는 방법에 대해 물어보고 싶습니다 (약 160KB의 각 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를 가능한 작게 만들려고합니다. 객체를 다시 사용하여이를 수행합니다. 예를 들어, 여러 번 발생하는 이미지가있을 때마다 매번 이미지를 포함하는 대신 한 번 이미지를 포함시키고 단순히 다른 발생에 대한 참조를 사용합니다.

즉, iText는 모든 객체를 메모리에 보관해야한다는 것을 의미합니다. 객체가 재사용 될지 미리 알 수 없기 때문입니다.

일반적으로 도움이되는 솔루션은 프로세스를 일괄 처리하는 것입니다. 1000 개의 파일을 1로 병합하는 대신 1000 개의 파일을 쌍으로 병합 (결과적으로 500 개의 문서 생성) 한 다음 쌍으로 합쳐서 250 개의 문서를 생성하는 등의 작업을 수행하십시오.

이렇게하면 iText가 버퍼를 정기적으로 플러시 할 수 있으므로 VM 충돌로 인한 메모리 오버 헤드가 줄어 듭니다.

0

iText 일 필요가없는 경우 파일 병합을 지원하는 명령 줄 응용 프로그램을 사용해 볼 수 있습니다. PDFtk, QPDFHexaPDF CLI (참고 : 저는 HexaPDF의 저자입니다)는 기본 PDF 파일 병합을 지원하는 일부 CLI 도구입니다.

+0

두 번째 링크와 어떤 제휴 관계가 있습니까? 그렇다면 [자체 승격에 관한 규칙] (/ help/promotion)에 명시 적으로 명시해야합니다. – Glorfindel

+0

HexaPDF가 귀하의 제품 일 경우, 링크를 클릭하면 협회를 공개해야합니다. 그렇지 않으면 스팸으로 간주 될 수 있습니다. –

+0

죄송합니다. 감사합니다. 방금 그 대답을 편집했습니다. – gettalong

관련 문제