Java와 Jacob을 활용한 Office 문서(Word/Excel/PPT) PDF 변환 자동화
Java 환경에서 Jacob 라이브러리를 통해 Windows COM 객체를 제어하고, Word, Excel, PowerPoint 문서를 PDF로 일괄 변환하는 실무 코드를 상세히 정리했습니다.
1. Jacob 라이브러리 설정 및 의존성 추가
엔터프라이즈 환경에서 문서 자동화를 구현할 때, 가장 확실한 방법 중 하나는 Windows의 COM(Component Object Model) 인터페이스를 활용하여 MS Office 프로그램을 직접 제어하는 것입니다. Java에서는 Jacob(Java COM Bridge) 라이브러리가 이 역할을 수행합니다.
Maven 프로젝트에서 Jacob을 사용하기 위해 pom.xml에 아래 의존성을 추가합니다.
jacob.dll 파일이 반드시 시스템 라이브러리 경로(path)나 프로젝트 루트에 존재해야 합니다.
<dependency>
<groupId>net.sf.jacob-project</groupId>
<artifactId>jacob</artifactId>
<version>1.14.3</version>
</dependency>
2. Word 문서를 PDF로 변환하기
Word 변환의 핵심은 Word.Application 객체를 호출하고 SaveAs 메서드에서 PDF 포맷 상수를 사용하는 것입니다. 여기서 wdFormatPDF 상수는 17입니다.
public void word2pdf(String source, String target) {
ActiveXComponent app = null;
try {
app = new ActiveXComponent("Word.Application");
app.setProperty("Visible", false);
Dispatch docs = app.getProperty("Documents").toDispatch();
Dispatch doc = Dispatch.call(docs, "Open", source, false, true).toDispatch();
File tofile = new File(target);
if (tofile.exists()) tofile.delete();
// 17 = wdFormatPDF 포맷 상수
Dispatch.call(doc, "SaveAs", target, 17);
Dispatch.call(doc, "Close", false);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (app != null) app.invoke("Quit", 0);
}
}
3. Excel 스프레드시트 변환 로직
Excel은 Excel.Application을 사용하며, 워크북을 열고 저장하는 방식이 유사합니다. Excel의 PDF 저장 포맷 상수는 57을 사용합니다.
public void excel2pdf(String source, String target) {
ActiveXComponent app = new ActiveXComponent("Excel.Application");
try {
app.setProperty("Visible", false);
Dispatch workbooks = app.getProperty("Workbooks").toDispatch();
Dispatch workbook = Dispatch.call(workbooks, "Open", source, false, true).toDispatch();
// 57 = xlTypePDF 포맷 상수
Dispatch.invoke(workbook, "SaveAs", Dispatch.Method,
new Object[] { target, new Variant(57) }, new int[1]);
Dispatch.call(workbook, "Close", new Variant(false));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (app != null) app.invoke("Quit");
}
}
4. PowerPoint 프레젠테이션 변환 로직
PowerPoint는 Powerpoint.Application을 호출합니다. PPT 변환 시 주의할 점은 ppSaveAsPDF 상수인 32를 사용하는 것입니다. 또한, 프레젠테이션을 열 때 창을 활성화하는 옵션 설정이 필요할 수 있습니다.
public void ppt2pdf(String source, String target) {
ActiveXComponent app = new ActiveXComponent("Powerpoint.Application");
try {
Dispatch presentations = app.getProperty("Presentations").toDispatch();
// Open(FileName, ReadOnly, Untitled, WithWindow)
Dispatch presentation = Dispatch.call(presentations, "Open", source, true, true, false).toDispatch();
File tofile = new File(target);
if (tofile.exists()) tofile.delete();
// 32 = ppSaveAsPDF 포맷 상수
Dispatch.call(presentation, "SaveAs", target, 32);
Dispatch.call(presentation, "Close");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (app != null) app.invoke("Quit");
}
}
5. 보너스: 이미지 파일의 PDF 변환 (iText)
Office 문서 외에 단순 이미지를 PDF로 묶어야 한다면 Jacob보다는 iText 라이브러리가 더 가볍고 효율적입니다. 아래는 간단한 구현 예제입니다.
// iText 의존성 필요 (pom.xml 확인)
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));
document.open();
Image image = Image.getInstance(imgFilePath);
image.setAlignment(Image.ALIGN_CENTER); // 가운데 정렬
document.add(image);
document.close();
6. 전체 실행 예제 및 요약
위에서 작성한 메서드들을 실제 서비스 로직에서 호출하여 일괄 변환을 수행할 수 있습니다. Office 자동화는 백그라운드 프로세스가 남지 않도록 finally 블록에서 Quit 처리를 확실하게 하는 것이 중요합니다.
public static void main(String[] args) throws IOException {
Word2Pdf converter = new Word2Pdf();
// 각 파일 경로에 맞춰 변환 실행
converter.word2pdf("c:/test/doc_sample.docx", "c:/test/doc_sample.pdf");
converter.excel2pdf("c:/test/xls_sample.xlsx", "c:/test/xls_sample.pdf");
converter.ppt2pdf("c:/test/ppt_sample.pptx", "c:/test/ppt_sample.pdf");
System.out.println("✅ 모든 문서 변환이 완료되었습니다.");
}
이 가이드를 통해 Java 환경에서도 강력한 문서 변환 파이프라인을 구축해 보시기 바랍니다. Jacob 라이브러리는 Windows 환경 의존적이지만, 사내 시스템(Intranet) 구축 시 가장 확실한 호환성을 보장합니다.
댓글
댓글 쓰기