2016-05-25 10 views
0

PDFドキュメントを複数のドキュメントに分割しようとしています。各ドキュメントには、ファイルサイズが最大ファイルサイズよりも小さいページの最大数が含まれています。PDFドキュメントを複数のドキュメントに分割する

私のコードは現在Eclipseから実行しているときに動作しますが、.jarファイルをクリックすると、Javaクラスの静的メソッドがクラッシュするように見えますが、例外をキャッチできないようです。

動作していないコードである:

myListOfDocuments = mysplitter.split(文書)。

どういうわけか、JVMは、上記の行が呼び出されたときに静的メソッドを呼び出します。ロードは以下のようにうまくいくようです: PDDocument document = PDDocument.load(aFile);

アイデア?

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.pdfbox.multipdf.Splitter; 
import org.apache.pdfbox.pdmodel.PDDocument; 

public class PDFMaxSizeSplitter { 


    public static void main(String[] args) { 
    } 

    public static ArrayList<File> splitTheFile(File aFile,long maxSize){ 

     ArrayList<File> resultFiles = new ArrayList<File>(); 

     //Checks to see if file is already small enough 
     if (aFile.length() <= maxSize){ 
      resultFiles.add(aFile); 
      return resultFiles; 
     } 

     //checks to see if it's a directory 
     if (aFile.isDirectory()){ 
      resultFiles.add(aFile); 
      return resultFiles; 
     } 

     try { 

      PDDocument document = PDDocument.load(aFile); 
      Splitter mysplitter = new Splitter(); 
      List<PDDocument> myListOfDocuments = mysplitter.split(document); 
      int docNumber = 0; 
      while (myListOfDocuments.size()>0){ 
       long theResults = 0; 
       theResults = getChunk(myListOfDocuments,0,(long) (myListOfDocuments.size()-1),maxSize); 
       PDDocument newPDFDoc = new PDDocument(); 
       for (long pageindex=0; pageindex<=theResults; pageindex++){ 
        newPDFDoc.addPage(myListOfDocuments.get((int) pageindex).getPage(0)); 
       } 
       File newFile = new File(aFile.getParentFile() + 
             File.separator + 
             aFile.getName().replace(".pdf", "") + 
             "Part" + 
             String.format("%03d", docNumber) + 
             ".pdf"); 
       //System.out.println(newFile.getCanonicalFile()); 
       newPDFDoc.save(newFile); 
       resultFiles.add(newFile); 
       myListOfDocuments=myListOfDocuments.subList((int) (theResults)+1, (myListOfDocuments.size())); 
       newPDFDoc.close(); 
       docNumber++; 
      } 

      document.close(); 


     } catch (IOException e) { 
      e.printStackTrace(); 
      } 
     return resultFiles; 
     } 

    private static long getChunk(List<PDDocument> thePages, long lowPage, long highPage, long maxSize) throws IOException{ 
     //System.out.println("low " + lowPage + " high page: " + highPage); 
     if ((highPage-lowPage)<=1){ 
      if(PDFMaxSizeSplitter.testSize(thePages,0,highPage)<=maxSize){ 
       return highPage; 
      } else{ 
       return lowPage; 
      } 

     } else if (PDFMaxSizeSplitter.testSize(thePages, 0,lowPage+ (highPage-lowPage)/2)<=maxSize){ 
      return PDFMaxSizeSplitter.getChunk(thePages, lowPage + (highPage-lowPage)/2, highPage,maxSize); 
     } 
      else { 
       return PDFMaxSizeSplitter.getChunk(thePages, lowPage, lowPage + (highPage-lowPage)/2,maxSize); 
      } 
    } 

    private static long testSize(List<PDDocument> thePages, long start, long stop) throws IOException{ 
     //System.out.println("Trying: " + (new Long(start)).toString() + " to " + (new Long(stop)).toString()); 
     PDDocument testerdocument = new PDDocument(); 
     //Path tempPath = Files.createTempFile((new Long(start)).toString(), (new Long(stop)).toString()); 
     //System.out.println("Creating tempPath " +tempPath.toString());  
     //File tempFile=new File(tempPath.toString()); 
     ByteArrayOutputStream tempFile = new ByteArrayOutputStream(); 
     for (long pageindex=start; pageindex<=stop; pageindex++){ 
      testerdocument.addPage(thePages.get((int) pageindex).getPage(0)); 
     } 
     testerdocument.save(tempFile); 
     long thefilesize = tempFile.size(); 
     //long thefilesize = (tempFile.length()); 
     //Files.deleteIfExists(tempPath); 
     tempFile.reset(); 
     testerdocument.close(); 
     return thefilesize; 
    } 
} 

-----------編集--------------

これは、JVMがメモリ不足が判明しました。

+0

1)splitter.splitは静的ではありません2)もう少しコードを入れてください3)どのバージョンのPDFBoxとjavaを使用していますか? –

+0

PDFBoxのjarファイルは、Eclipse外で実行しているときにクラスパスにありますか? –

+0

Reections - jarファイルをクリックしないで、コマンドラインから実行します。java -jar xxx.jar –

答えて

0

JVMのメモリが不足していることが判明しました。メモリを増やすためにjvm引数を追加しました。また、jvmの-d64引数を使って64ビットjvmモードに切り替えました。また、私は、新しいPDDocument(aFile、MemoryUsageSetting.setupTempFileOnly())など、pdfboxにあるディスクドライブキャッシュメモリ管理を使用しています。

これらの設定では、数ギガバイトのファイルを処理できます。コードでは、ドキュメントをダイレクトメモリに読み込み、メモリ不足例外をキャッチして低メモリモードに切り替えようとしています。低メモリモードでは、MemoryUsageSetting.setupTempFileOnly()を使用してヒープを使いすぎないようにします。

関連する問題