article thumbnail image
Published 2021. 11. 2. 22:27

하아~~~쥔쨔...이러기 있긔~? 없긔~? 

아니 그냥 office에서 pdf로 만들어서 첨부파일로 올리면 되쟈나~~~~

도대체 나한태 왜 그러는거야~~ ㅠㅠ

이번에 또 황당한 요구 사항이 들어 왔다...오피스 파일 즉 엑셀, 파워포인트, 워드 문서를 자동으로 pdf로 변환을 해서 파일 업로드를  해달라는 황당한 요청 사항이었다...거절을 하고 싶었으나...내가 받은 요청이 아니라 이미 고객에게는 해주겠다고 돈까지 받았단다...ㅅㅂ...돈까지 받았다는데...꽁짜로 무료 봉사 해달라고 안하는게 어디인가...라고는 생각 하지만...

닝기리..#@%$#(%ㅕ#@()%*&$#)(^#$*%#{)@

 

무튼 각설하고 또 구글 성님께 굽신굽신 했더니 대략 3가지 정도의 방법을 정하고 알아봤다...

1. documents4j + vbs 를 이용한 방법.

2. 상용 유료 .jar 라이브러리를 사용한 방법.

3. apache poi + itextpdf 를 이용한 방법.

4. JodConverter + OpenOffice[or LibreOffice] 를 이용한 방법.

 

 

첫번째 방법인 documents4j + vbs 은 문제가 있었다...서버에 MS Office가 설치되어 있어야 가능한 방법이었다.

오피스 라이센스도 걸리고, 또 무엇보다 서버에 그 무거운 MS Office를 설치를 해야 한다니...;;;

 

두번째 상용 유료 .jar 라이브러리를 이용한 방법은 솔직하게 걍 돈주고 쓸까 생각하고 트라이얼 버전을 받아서 테스트 해봤는데...음...일단 pdf로 변환해야 하는 문서들이 단순한 리스트나 표들만 있는것들이 아니라 복잡한 도형과 선들이 짬뽕되어 있는 문서들이라 그런가 변환이 되기는 하는데 그렇게 퀄이 좋지 못했다...그래서 일단 안되는건 아니기 때문에 최후의 수단으로 두기로 했다.(테스트 해본 상용 라이브러리는 아래 Maven에 있는 e-iceblue의 spire.xls.free 만 해봤다. 조금만 검색해 보면 많은 상용 라이브러리들이 나온다.)

 

세번째 방법인 apache poi + itextpdf은 ppt, pptx 문서의 슬라이드를 이미지로 변환을 하고 변환된 이미지를 pdf로 만드는데 

나쁘지는 않았다..그런데 문제는 엑셀이 문제다...단순 표만 있는게 아니라 엑셀에다 무슨 도형과 선이 떡칠이 되어 있는거라서, 어떻게 할수가 없다는 결론이 나서 pass...

(그리고 최신 버전에 대한 정보가 많이 없다...아래 소스는 poi + itextpdf로 변환하는 건데 최신 버전에 대한 내용이 많이 보이지 않아서 남겨둔다.)

        <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.2</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>5.0.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
        </dependency>

        <dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.xls.free</artifactId>
            <version>3.9.2</version>
        </dependency>

OfficeToPDFConverter.java
0.01MB

드뎌 대망의 네번째 JodConverter + OpenOffice[or LibreOffice]...

서버에 OpenOffice 또는 LibraOffice를 설치 해야 하지만, MS Office에 비하면 상전이다...

OpenOffice는 용량이라고 해봤자 150메가도 안되고, LibraOffice도 300메가 좀 넘는 수준이라서 서버에 설치 해도 크게 부담이 될거 같지 않아 보였다. 

처음에는 OpenOffice(Windows는 32비트만 지원한다.)를 설치했고 나중에는 OpenOffice 삭제 하고 LibreOffice(64비트 지원)를 다시 설치 했다. 그리고 OpenOffice를 오로지 설치 해야된다고 문서에 나와 있는데 LibreOffice는 왠지 무설치로 인스턴스만 가지도고 될거 같은 느낌이 든다...

어제부터 이거 잡고 삽질만 했다...ㅡㅡ;;;

회사에서 쓰는 OS가 데스크탑은 리눅스 노트북은 windows10을 쓰는데, 리눅스에서 office문서를 보려고 하면 

OpenOffice나 LibreOffice를 통해서 봐야 되서 이미 설치가 되어 있는데 혹시나 해서 테스트를 해봤더니 오우야~~ 퀄리티가 상당했다...

복잡한 엑셀도 문제 없이 변환이 됐다... 그래서 고객사 서버인 Windows Server 2008 R2 서버 OpenOffice를 설치하고 서비스 올려서 테스트를 했더니...

Caused by: java.io.IOException: Cannot run program "C:\Program Files (x86)\OpenOffice 4\program\soffice.exe": CreateProcess error=5, 액세스가 거부되었습니다.

라고 에러가 계속 나오길래, 노트북에 설치해서 서비스를 올려봤더니 매우 잘되길래 왜 그럴까 고민을 상당히 많이 하고 찾아 보기도 많이 찾아 봤는데, 저 에러 내용 가지고는 관련된 내용이 정말 별로 없었다... 그래서 어자피 java에서 exe파일 실행 하는거니까 java에서 실행 파일 실행시 나오는 에러로 방향을 잡고 검색을 하기 시작하니, 윈도우에 설치된 백신때문에 차단이 걸린다는 내용이 보여서 서버에 설치 되어 있는 V3 백신 시스템 감시를 비활성화 하고 해봤는데도 소용이 없었다.

(근데 이 백신 문제는 어쩌면 다른 측면에서는 해결이 될수도 있을거 같아 보인다. 예전에 같은 문제로(java에서 특정 프로그램 실행) 백신 실시간 감시에 예외로 등록하고 했었던게 기억이 어렴풋이 난다.)

그 다음에 알아 본게 soffice.exe의 실행 권한이다. 권한도 문제는 없어 보였는데, 문득 Tomcat의 실행 권한이 생각이 나서 혹시나 하는 마음에 톰켓을 실행해서 Log On 탭에 가서 아래 이미지처럼 했더니...거짓말 처럼 정상으로 됐다..ㅡㅡ;;;

 

변환하는 소스는 매우 간단하다.

Maven

        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-local</artifactId>
            <version>4.4.2</version>
        </dependency>
import org.jodconverter.core.DocumentConverter;
import org.jodconverter.core.document.DocumentFormat;
import org.jodconverter.core.office.OfficeException;
import org.jodconverter.core.office.OfficeManager;
import org.jodconverter.local.LocalConverter;
import org.jodconverter.local.office.LocalOfficeManager;

import java.io.File;

public class JodConverter {

    public void converter() throws OfficeException {
        OfficeManager officeManager = LocalOfficeManager.make();
        DocumentConverter converter = LocalConverter.make(officeManager);

//		OfficeManager officeManager = LocalOfficeManager.builder().build();
//		DocumentConverter converter = LocalConverter.builder().officeManager(officeManager).build();

        System.out.println("officeManager start");
        officeManager.start();
        try {
            System.out.println("convert start");

            File excelFile = new File("D:\\5.xls");
            File pdfFile = new File("D:\\5.pdf");
            converter.convert(excelFile).to(pdfFile).execute();

            excelFile = new File("D:\\1.pptx");
            pdfFile = new File("D:\\1.pdf");
            converter.convert(excelFile).to(pdfFile).execute();

            excelFile = new File("D:\\13.pptx");
            pdfFile = new File("D:\\13.pdf");
            converter.convert(excelFile).to(pdfFile).execute();

            System.out.println("convert end");
        } finally {
            officeManager.stop();
        }
    }
}

JodConverter를 이용하는 소스는 이게 끝이다...

근데 단점이 있는데 좀 느리다...왜그런고 하니 .execute()를 하는 시점에 localhost에 서비스를 올린 상태서 컨버팅을 진행을 하게 된다. 그래서 초기 버전에서는 서비스를 올려 줬어야 하는거 같다...

그렇다 보니 좀 느린 감이 좀 있기는 한데, 이걸 우짜야 할지는 좀 고민을 해봐야 할거 같다.

 

 

복사했습니다!