기본 콘텐츠로 건너뛰기

Java와 Jacob을 활용한 Office 문서(Word/Excel/PPT) PDF 변환 자동화

BACKEND / AUTOMATION

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에 아래 의존성을 추가합니다.

⚠️ 주의사항: 실행 환경의 OS 비트(32/64bit)에 맞는 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) 구축 시 가장 확실한 호환성을 보장합니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...