当前位置: 首页 > 知识库问答 >
问题:

将PDF文档拆分为多个文档

薛元忠
2023-03-14

我正在尝试将一个PDF文档拆分为多个文档,其中每个文档包含的最大页数小于最大文件大小。

我的代码目前可以在Eclipse上运行,但是当我点击. jar文件时,java类中的静态方法似乎崩溃了(但是我似乎抓不到异常)。

不工作的代码是:

myListOfDocuments=mysplitter。拆分(文件);

在调用上述行时,JVM会以某种方式退出静态方法。加载似乎工作正常,如下所示:PDDocument=PDDocument。加载(文件);

有什么想法吗?

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正在运行内存溢出。

共有1个答案

孙泳
2023-03-14

结果是JVM内存不足。我添加了一个jvm参数来增加内存。此外,通过在jvm上使用参数-d64,我切换到了64位jvm模式。此外,我一直在使用pdfbox中的磁盘驱动器缓存内存管理,例如新的PDDocument(aFile,MemoryUsageSetting.setupTempFileOnly());

有了这些设置,我可以处理几千兆字节的文件。现在在代码中,我尝试将文档加载到直接内存中,并捕获内存溢出异常以切换到低内存模式。在低内存模式下,我使用MemoryUsageSetting.setupTempFileOnly()来避免使用太多的堆。

 类似资料:
  • 我需要把一个文件分成几个小文件。例如,如果文档有7页,我需要生成7个PDF。 在iTextSharp中,我使用了以下代码,运行得非常好。然而,在iText 7中,不可能以同样的方式进行。 第一个问题 我发现有一个,它可以将我的pdf文件拆分成小的pdf文件。然而,即使是我的测试pdf也有7页,甚至返回数字7,被拆分的文档的数量只是一个。 在这个链接文档中,以某种方式展示了如何拆分文档。然而,我不知

  • 问题内容: 我想要一个多页的pdf文件,并每页创建单独的pdf文件。 我已经下载了reportlab并浏览了文档,但它似乎是针对pdf生成的。我还没有看到有关处理PDF文件本身的任何信息。 有没有一种简单的方法可以在python中做到这一点? 问题答案: 等等

  • 在上一章中,我们已经了解了如何将JavaScript添加到PDF文档中。 现在让我们学习如何将给定的PDF文档拆分成多个文档。 拆分PDF文档中的页面 您可以使用名为Splitter的类将给定的PDF文档拆分为多个PDF文档。 此类用于将给定的PDF文档拆分为多个其他文档。 以下是拆分现有PDF文档的步骤 第1步:加载现有PDF文档 使用PDDocument类的静态方法load()加载现有PDF文

  • 问题内容: 我有从mongodb导出的json文件,如下所示: 大约有30000行,我想将每一行拆分成自己的文件。 (我正在尝试将我的数据转移到榻榻米群集上) 我尝试这样做: 但是我发现它似乎减少了行的负载,而当我期望30000个奇数时,运行此命令的输出仅给了我50个奇数文件! 有没有一种逻辑方法可以使此操作不使用任何适合的方法删除任何数据? 问题答案: 假设您不在乎确切的文件名,如果要将输入拆分

  • 问题内容: 将Spring的配置拆分为多个xml文件的正确方法是什么? 此刻我有 /WEB-INF/foo-servlet.xml /WEB-INF/foo-service.xml /WEB-INF/foo-persistence.xml 我有以下内容: 实际问题: 这种方法正确/最佳吗? 我真的需要同时指定中的配置位置 和该板块? 我需要记住什么才能能够引用中定义的?这与 指定有关吗? 更新1:

  • 问题内容: 我的体积太大了,很难找到正确的视图。 如何将其拆分为多个文件,然后导入?是否涉及速度损失? 我可以这样吗? 问题答案: 在Django中,所有内容都是Python模块(* .py)。你可以创建一个具有内部视图的文件夹,并且仍然可以导入视图,因为这也实现了Python模块。但是一个例子会更好。 你的原始图片可能如下所示: 使用以下文件夹/文件结构,它将起到相同的作用: viewsa.py