[java] Java Apache FOP와 표 생성

Apache FOP는 Java 기반의 오픈 소스 프로젝트로, XML 기반의 포맷을 사용하여 PDF 파일을 생성할 수 있는 도구입니다. 이번 포스트에서는 Apache FOP를 사용하여 Java에서 표를 생성하는 방법에 대해 알아보겠습니다.

Apache FOP 설치

먼저 Apache FOP를 사용하기 위해서는 다음과 같이 Apache FOP를 다운로드하고 설치해야 합니다.

  1. Apache FOP의 공식 웹사이트(https://xmlgraphics.apache.org/fop/download.html)에서 최신 버전의 Apache FOP를 다운로드합니다.
  2. 압축 파일을 원하는 디렉토리에 추출합니다.

XML 파일과 XSL-FO 파일 작성

Apache FOP를 사용하여 표를 생성하기 위해서는 XML 파일과 XSL-FO 파일이 필요합니다. 먼저 XML 파일을 작성해보겠습니다. 다음은 예시 XML 파일입니다.

<?xml version="1.0" encoding="UTF-8"?>
<employees>
  <employee>
    <name>John Doe</name>
    <position>Software Engineer</position>
    <salary>5000</salary>
  </employee>
  <employee>
    <name>Jane Smith</name>
    <position>Project Manager</position>
    <salary>6000</salary>
  </employee>
</employees>

다음으로 XSL-FO 파일을 작성해보겠습니다. XSL-FO는 XML 기반의 포맷으로, PDF 파일 생성을 지원하는데 사용됩니다. 다음은 예시 XSL-FO 파일입니다.

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="simple">
    <fo:flow flow-name="xsl-region-body">
      <fo:table>
        <fo:table-body>
          <fo:table-row>
            <fo:table-cell>
              <fo:block>Name</fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block>Position</fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block>Salary</fo:block>
            </fo:table-cell>
          </fo:table-row>
          <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-cell>
                <fo:block><xsl:value-of select="salary"/></fo:block>
              </fo:table-cell>
            </fo:table-row>
          </xsl:for-each>
        </fo:table-body>
      </fo:table>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

Java 코드 작성

이제 Java 코드를 작성하여 Apache FOP를 사용하여 표를 생성해보겠습니다. 다음은 예시 Java 코드입니다.

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

public class TableExample {

    public static void main(String[] args) {
        try {
            // XML 파일과 XSL-FO 파일 경로 설정
            File xmlFile = new File("employees.xml");
            File xslfoFile = new File("table.xsl");

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

            // 출력 파일 생성
            File pdfFile = new File("table.pdf");
            FileOutputStream outputStream = new FileOutputStream(pdfFile);

            // Fop 생성 및 설정
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outputStream);

            // XSL-FO 파일 불러오기
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer(new StreamSource(xslfoFile));

            // XML 파일을 Source로 변환
            Source source = new StreamSource(xmlFile);

            // PDF 생성
            transformer.transform(source, fop.getDefaultHandler());

            // 자원 해제
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

이 코드를 실행하면 employees.xml과 table.xsl 파일을 사용하여 table.pdf로 표가 생성됩니다.

마무리

이번 포스트에서는 Java Apache FOP를 사용하여 표를 생성하는 방법을 알아보았습니다. Apache FOP를 사용하면 XML 데이터와 XSL-FO 스타일시트를 이용하여 간단하게 표를 생성할 수 있습니다. 더 많은 기능을 사용하려면 Apache FOP의 공식 문서를 참조해보세요.

참고: Apache FOP - 사용자 가이드