728x90

프로젝트에서 PDF를 통합하는 솔루션을 고민하다가 간단한 기능만(병합,분리) 필요하니 그냥 오픈소스를 활용하는것도 나쁘지 않을것 같아서 작성하였다.

iText vs PDFBox 둘중 고민하다가 그냥 PDFBox 를 사용하기로 했다. google 검색하니 소스가 널려 있어서 잘 되는걸로 가져다가 조금 수정하였다.

 

pom.xml 에서 library 추가.

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>3.0.0-RC1</version>
</dependency>

java 코드는 아래 와같다.

path는 맥북 기준이니 windows 사용자는 알아서 수정하면 될것 같다.

public static void main(String[] args) {

        //pdf 분리
        // 테스트 시 path는  맥북 기준...windows 경로는 알아서...
        separate(new File("/Users/blake/Documents/pdf/pns_1_5.pdf"),2);
        //pdf 합치기
        File file1=new File("/Users/blake/Documents/pdf/merge_1.pdf");
        File file2=new File("/Users/blake/Documents/pdf/merge_2.pdf");
        List<File> files= List.of(file1,file2);
        merge(files,"/Users/blake/Documents/pdf/new_merge.pdf");
    }



    public static boolean separate(File file, int page){
        try {
            PDDocument document = Loader.loadPDF(file);
            int pages=  document.getNumberOfPages();
            if(pages>page){
                separate(file,1,page);
                return separate(file,page+1,pages);
            }
        } catch (IOException e) {
            return false;
        }
        return false;
    }
    public static boolean separate(File file,int startPage,int endPage){
        return separate(file,endPage-startPage+1,startPage,endPage);
    }
    public static boolean separate(File file,int page,int startPage,int endPage){
        try {
            //pdf 파일 로드
            PDDocument document = Loader.loadPDF(file);
            // 분리함수사용하기 위한 객체 생성.
            Splitter splitter = new Splitter();
            splitter.setStartPage(startPage);
            splitter.setSplitAtPage(page);
            splitter.setEndPage(endPage);
            // 분리후 파일 리스트
            List<PDDocument> Pages = splitter.split(document);

            Iterator<PDDocument> iterator = Pages.listIterator();
            //분리된 파일 저장
            int i = 1;
            while (iterator.hasNext()) {
                PDDocument pd = iterator.next();
                String folderPath= file.getParent();
                String fileName=file.getName().substring(0,file.getName().lastIndexOf("."));
                int start=startPage+(i-1)*page;
                int end=i*page>endPage?i*page:endPage;
                pd.save(folderPath+File.separator+fileName+(start+"~"+end)+".pdf");
            }
            System.out.println("PDF 분리완료!");
            document.close();
            return true;
        }catch (Exception e){
            return false;
        }
    }

    public static boolean merge(List<File> files,String path){
        PDFMergerUtility merger = new PDFMergerUtility();
        //파일 merge 설정
        merger.setDestinationFileName(path);
        files.forEach(f->{
            try {
                merger.addSource(f);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        });
        try {
            //병합시작...
            merger.mergeDocuments(null);
            System.out.println("PDF merge 완료!");
        } catch (IOException e) {
            return  false;
        }
        return true;
    }

스크린샷 2023-03-07 오후 3.17.29.png
0.05MB

 

+ Recent posts