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;
}
'Back-end > Spring&SpringBoot' 카테고리의 다른 글
spring-boot-configuration-processor (0) | 2023.01.04 |
---|---|
Springboot2.x에서 @Transactional 을 사용하기 위하여@EnableTransactionManagement 를 꼭 써줘야 하는가 ? (0) | 2023.01.04 |
Springboot email 전송기능구현 (0) | 2022.12.20 |
Spring에서 자주는 주는 확장방식들 (0) | 2022.12.19 |
System.currentTimeMillis 말고 ? (0) | 2022.12.19 |