2016-05-25 4 views
0

Я пытаюсь разбить документ PDF на несколько документов, где каждый документ содержит максимальное количество страниц, которое может содержать размер файла меньше, чем максимальный размер файла.Разделение документа PDF на несколько документов

В настоящее время мой код работает при запуске из Eclipse, но когда я нажимаю на файл .jar, статический метод в классе java, похоже, падает (однако, похоже, я не вижу исключения).

Код, который не работает вне:

myListOfDocuments = mysplitter.split (документ);

Как-то JVM берет на себя статический метод при вызове указанной выше строки. Нагрузка, похоже, работает нормально: Документ PDDocument = 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 в вашем пути к классам при запуске за пределами eclipse? –

+0

Re exections - не нажимайте на файл jar, запустите его из командной строки: java -jar xxx.jar –

ответ

0

Оказывается, у JVM заканчивается память. Я добавил аргумент jvm для увеличения памяти. Кроме того, я переключился на 64-битный режим jvm, используя аргумент -d64 на jvm. Кроме того, я использовал управление кэшем памяти на диске, найденное в pdfbox, например, новый PDDocument (aFile, MemoryUsageSetting.setupTempFileOnly());

С этими настройками я могу обрабатывать несколько гигабайт файлов. Теперь в коде я пытаюсь загрузить документы в прямую память и перехватить исключение из памяти, чтобы переключиться в режим с низкой памятью. В режиме низкой памяти я использую MemoryUsageSetting.setupTempFileOnly(), чтобы избежать слишком большого количества кучи.

Смежные вопросы