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 공식 문서를 참조하시기 바랍니다.