[java] Java Apache FOP를 사용한 배치 처리

Apache FOP (Formatting Objects Processor)는 XML을 기반으로한 XSL-FO(Extensible Stylesheet Language - Formatting Objects)를 PDF, PostScript, AFP 등 다른 형식으로 변환할 수 있는 오픈 소스 라이브러리입니다. 이 라이브러리를 사용하면 Java로 배치 처리를 구현할 수 있습니다.

FOP 라이브러리 설치

먼저 FOP 라이브러리를 설치해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음 종속성을 추가합니다.

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>fop</artifactId>
    <version>2.6</version>
</dependency>

직접 다운로드하여 사용하려면 Apache FOP 다운로드 페이지에서 최신 버전을 다운로드 받으실 수 있습니다.

XML과 XSL-FO 파일 작성

배치 처리를 위해 먼저 XML 데이터와 XSL-FO 스타일시트 파일을 작성해야 합니다. XML 파일은 데이터를 포함하고, XSL-FO 파일은 XML 데이터를 어떻게 스타일링하고 출력할지 정의합니다.

XML 파일 예제 (data.xml)

<employees>
    <employee>
        <name>John</name>
        <position>Manager</position>
    </employee>
    <employee>
        <name>Jane</name>
        <position>Developer</position>
    </employee>
</employees>

XSL-FO 파일 예제 (style.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4" page-width="21cm" page-height="29.7cm">
                    <fo:region-body/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="A4">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block font-size="18pt">Employee List:</fo:block>
                    <fo:table table-layout="fixed" width="100%">
                        <fo:table-column column-width="proportional-column-width(1)"/>
                        <fo:table-column column-width="proportional-column-width(1)"/>
                        <fo:table-header>
                            <fo:table-row>
                                <fo:table-cell>
                                    <fo:block font-weight="bold">Name</fo:block>
                                </fo:table-cell>
                                <fo:table-cell>
                                    <fo:block font-weight="bold">Position</fo:block>
                                </fo:table-cell>
                            </fo:table-row>
                        </fo:table-header>
                        <fo:table-body>
                            <xsl:for-each select="employees/employee">
                                <fo:table-row>
                                    <fo:table-cell>
                                        <fo:block><xsl:value-of select="name"/></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell>
                                        <fo:block><xsl:value-of select="position"/></fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </xsl:for-each>
                        </fo:table-body>
                    </fo:table>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
</xsl:stylesheet>

Java 코드 작성

import org.apache.fop.apps.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class BatchProcessWithFOP {

    public static void main(String[] args) {
        try {
            // XML 데이터 파일 읽기
            byte[] xmlData = Files.readAllBytes(Paths.get("data.xml"));

            // XSL-FO 스타일시트 파일 읽기
            byte[] xslData = Files.readAllBytes(Paths.get("style.xsl"));

            // FopFactory 인스턴스 생성
            FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());

            // TransformerFactory 인스턴스 생성
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer(new StreamSource(new ByteArrayInputStream(xslData)));

            // Fop 인스턴스 생성
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, null, new FileOutputStream("output.pdf"));

            // XML 데이터를 Result 객체로 변환
            Source source = new StreamSource(new ByteArrayInputStream(xmlData));
            Result result = new SAXResult(fop.getDefaultHandler());

            // XML 데이터를 XSL-FO로 변환하여 출력
            transformer.transform(source, result);

            // 결과 파일 생성
            File outFile = new File("output.pdf");

            System.out.println("PDF 파일 생성 완료: " + outFile.getAbsolutePath());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위 예제는 data.xml을 XML 데이터로, style.xsl을 XSL-FO 스타일시트로 사용하여 PDF 파일을 생성하는 Java 코드입니다.

먼저 XML 데이터와 XSL-FO 스타일시트 파일을 바이트 배열로 읽어옵니다. 그 후 FopFactory와 TransformerFactory를 생성하고, Fop 인스턴스를 만듭니다. XML 데이터를 StreamSource로 변환하여 SAXResult로 출력하면 PDF 파일이 생성됩니다.

실행 및 결과 확인

위의 Java 코드를 실행하면 현재 디렉토리에 “output.pdf” 파일이 생성됩니다. 이 파일을 열어보면 XML 데이터를 기반으로한 XSL-FO 스타일링이 적용된 PDF 문서를 확인할 수 있습니다.

이것은 Java Apache FOP를 사용하여 배치 처리할 수 있는 간단한 예제입니다. 향후 자세한 내용은 Apache FOP 공식 문서를 참조하시기 바랍니다.