Как отделить PDF на основе заданных интервалов - PullRequest
2 голосов
/ 11 октября 2019

Мое основное намерение состоит в том, что мой код должен принимать pdf и интервалы в качестве входных данных, я принимаю выборочные входные данные как 2,6, где моя программа должна делить pdf на 3 части, т.е. 1,2 страницы как 1pdf. 3,5,6 как другие PDF и оставшиеся страницы в один PDF (если есть какая-либо дополнительная страница). Я не получаю требуемый вывод !! это код, который я написал

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

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PDFSplitter {

    public List<String> split(String fileName, String password, int[] splitIndices) throws IOException {

        //Loading an existing PDF document
        File file = new File(fileName);
        PDDocument document = null;
        if (password != null && !password.trim().equals("")) {
            document = PDDocument.load(file, password);
        } else {
            document = PDDocument.load(file);
        }

        //Instantiating Splitter class

        //splitting the pages of a PDF document

        List<PDDocument> splitDocs = new ArrayList<PDDocument>();
        int startPage = 0;
        for (int splitIdex : splitIndices) {
            Splitter splitter = new Splitter();
            splitter.setStartPage(startPage);
            splitter.setSplitAtPage(splitIdex +startPage);
            splitter.setEndPage(splitIdex+1);
            List<PDDocument> documents = splitter.split(document);
            splitDocs.addAll(documents);
            startPage = splitIdex + 1;
        }
        if(startPage <= document.getNumberOfPages())
        {
            Splitter splitter = new Splitter();
            splitter.setStartPage(startPage);
            splitter.setSplitAtPage(document.getNumberOfPages() - startPage);
            splitter.setEndPage(document.getNumberOfPages());
            List<PDDocument> documents = splitter.split(document);
            splitDocs.addAll(documents);
        }

        List<String> splitFileNames = new ArrayList<String>();
        for (PDDocument splitDoc : splitDocs) {
            String fileName1 = fileName.substring(0, fileName.indexOf(".PDF")) + splitDocs.indexOf(splitDoc) + ".pdf";
            splitDoc.save(fileName1);
            splitFileNames.add(fileName1);
        }
        document.close();
        return splitFileNames;
    }

    public static void main(String[] args) throws IOException {
        PDFSplitter splitter = new PDFSplitter();
        int[] pages = {3,5};
        List<String> splitFileNames = splitter.split("C:\\Users\\RSk\\Desktop\\rsk.pdf","", pages);

        System.out.println("splitFileNames = " + splitFileNames);
    }
}

1 Ответ

1 голос
/ 15 октября 2019

Мое главное намерение - мой код должен принимать pdf и интервалы в качестве входных данных, я принимаю выборочные входные данные как 2,6, где моя программа должна делить pdf на 3 части, то есть 1,2 страницы как один pdf. 3,4,5,6 как другие pdf и оставшиеся страницы в один pdf (если есть какая-либо дополнительная страница).

Это проще всего сделать, настроив Splitter путем переопределения splitAtPage method:

public class CustomSplitter extends Splitter {
    public CustomSplitter(int[] splitIndices) {
        this.splitIndices = splitIndices;
    }

    @Override
    protected boolean splitAtPage(int pageNumber) {
        return Arrays.binarySearch(splitIndices, pageNumber) >= 0;
    }

    final int[] splitIndices;
}

( CustomSplitter class)

Теперь вы можете разделить документ на заданные страницы, например так:

PDDocument document = PDDocument.load(SOURCE);
Splitter splitter = new CustomSplitter(new int[] {2,6});

List<PDDocument> documents = splitter.split(document);

for (int i=0; i < documents.size(); i++) {
    documents.get(i).save(String.format("result-%d.pdf", i));
}

( TestCustomSplitter test testSplitForSaiKrishna)

...