[java] Java Apache FOP와 웹 기반 문서 뷰어 연동

Apache FOP는 XML 형식의 데이터를 사용하여 PDF, PostScript, AFP 등의 문서 형식으로 변환하는 데 사용되는 Java 기반의 오픈 소스 라이브러리입니다. 이 글에서는 Java Apache FOP와 웹 기반 문서 뷰어를 연동하는 방법에 대해 알아보겠습니다.

1. Apache FOP 설치하기

먼저, Apache FOP를 다운로드하고 설치해야 합니다. Apache FOP의 공식 웹사이트에서 소스 파일을 다운로드하거나, Maven을 사용하여 의존성을 추가할 수 있습니다.

2. XML로부터 PDF 생성하기

Apache FOP를 사용하여 XML 데이터로부터 PDF 문서를 생성하는 예제를 살펴보겠습니다. 아래는 XML 데이터와 XSLT 스타일시트를 사용하여 PDF를 생성하는 Java 코드입니다.

import java.io.File;
import java.io.FileOutputStream;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.xmlgraphics.util.MimeConstants;

public class XMLToPDFConverter {
    public static void main(String[] args) {
        try {
            // XML 및 XSLT 파일 경로 설정
            File xmlFile = new File("data.xml");
            File xsltFile = new File("stylesheet.xsl");
            
            // FOP 팩토리 및 FOP 생성
            FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, new FileOutputStream("output.pdf"));
            
            // XSLT 트랜스포머 생성
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltFile));
            
            // FOP에 대한 결과 설정
            Result result = new SAXResult(fop.getDefaultHandler());
            
            // XML에서 PDF로 변환
            Source source = new StreamSource(xmlFile);
            transformer.transform(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 코드에서는 data.xml 파일과 stylesheet.xsl 파일을 사용하여 XML 데이터에서 PDF 문서를 생성합니다. FopFactory를 사용하여 Fop 객체를 생성하고, TransformerFactory를 사용하여 XSLT 트랜스포머를 생성합니다. 그리고 SAXResult를 사용하여 FOP에 대한 결과를 설정하고, StreamSource를 사용하여 XML 데이터를 읽어들입니다. 마지막으로 transform() 메서드를 호출하여 XML을 PDF로 변환합니다.

3. 웹 기반 문서 뷰어 연동하기

Apache FOP를 사용하여 생성된 PDF 문서를 웹 기반 문서 뷰어에 연동하여 사용자에게 보여줄 수 있습니다. 여기서는 PDF.js를 예로 들겠습니다. PDF.js는 웹 브라우저에서 PDF 파일을 렌더링하는 JavaScript 라이브러리입니다.

3.1. PDF.js 다운로드하기

PDF.js를 사용하기 위해 먼저 다운로드해야 합니다. PDF.js의 공식 GitHub 저장소에서 소스 파일을 다운로드하거나, npm을 사용하여 패키지를 설치할 수 있습니다.

3.2. HTML에 PDF.js 추가

다음은 PDF.js를 사용하여 PDF 파일을 보여주는 간단한 HTML 예제입니다. 아래 코드를 웹 페이지에 추가하면 PDF.js를 사용하여 문서 뷰어를 연동할 수 있습니다.

<!DOCTYPE html>
<html>
<head>
  <title>PDF Viewer</title>
  
  <style>
    #pdfviewer {
      width: 100%;
      height: 100vh;
    }
  </style>
</head>
<body>
  <div id="pdfviewer"></div>
  
  <script src="pdf.js"></script>
  <script src="pdf.worker.js"></script>
  <script>
    // PDF.js를 사용하여 PDF 보기
    var pdfViewer = document.getElementById('pdfviewer');
    var pdfjsLib = window['pdfjs-dist/build/pdf'];
    
    pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdf.worker.js';
    
    var loadingTask = pdfjsLib.getDocument('output.pdf');
    loadingTask.promise.then(function(pdf) {
      pdf.getPage(1).then(function(page) {
        var canvas = document.createElement('canvas');
        pdfViewer.appendChild(canvas);
        
        var context = canvas.getContext('2d');
        var viewport = page.getViewport({ scale: 1.5 });
        canvas.width = viewport.width;
        canvas.height = viewport.height;
        
        var renderContext = {
          canvasContext: context,
          viewport: viewport
        };
        
        page.render(renderContext);
      });
    });
  </script>
</body>
</html>

위의 코드에서는 PDF.js 스크립트 파일을 포함하고, pdf.viewer 엘리먼트를 만들어 PDF를 렌더링하는 JavaScript 코드를 작성하였습니다. pdfjsLib.getDocument('output.pdf')을 사용하여 PDF를 로드하고, getPage(1)을 사용하여 첫 번째 페이지를 가져옵니다. 그리고 canvas 엘리먼트를 생성하여 페이지를 렌더링합니다.

4. 결론

이번 글에서는 Java Apache FOP와 웹 기반 문서 뷰어를 연동하는 방법을 알아보았습니다. Apache FOP를 사용하여 XML 데이터에서 PDF 문서를 생성하고, 그 결과를 웹 기반 문서 뷰어에 연동하여 사용자에게 보여줄 수 있습니다. PDF.js를 사용한 예제를 통해 실제로 PDF 파일을 브라우저에서 렌더링하는 방법을 확인할 수 있었습니다.