| Developer: Java
Oracle XML Publisher와 Oracle JDeveloper 10g의 통합
저자 – Deepak Vohr
게시일: 2006년 11월
오라클의 XSL-FO 기반 리포팅 툴인 Oracle XML Publisher는 GUI, 코어 API 컴포넌트 셋의 두 가지 형태로 제공됩니다. 아래의 코어 API를 Oracle JDeveloper 10.1.3과 통합하여 PDF, Excel, HTML, RFT 리포트 생성에 활용할 수 있습니다:
- PDF Form Processing Engine API. PDF 템플릿과 XML 데이터를 병합하여 PDF 문서를 생성합니다. RTF Processor. RTF 템플릿을 XSL-FO (Extensible Style Language-Formatting Objects) 파일로 변환하고, 다시 이를 FO Processor Engine에 입력으로 전달합니다.
- FO Processor Engine. XML 파일(데이터 소스 파일)과 XSLT 파일(템플릿)을 병합하여 PDF, Excel, HTML, RTF 리포트를 생성합니다.
- XSL-FO Utility. XML 파일과 XSLT 파일로, 또는 일련의 XML, XSLT 파일로부터 XSL-FO 파일을 생성합니다. PDF Document Merger. PDF 문서들을 병합하고 페이지 넘버링을 추가합니다.
- PDF Book Binder Processor. 일련의 PDF 문서들을 챕터, 섹션, 서브섹션, 목차 등을 가진 PDF 문서로 병합합니다.
- Document Processor Engine. 템플릿, 데이터소스, 출력 등을 정의한 단일 XML 문서를 이용하여 위의 API들에 대한 배치 처리 작업을 수행합니다.
본 문서는 FO Processor Engine, XSL-FO Utility, PDF Document Merger를 사용하는 방법을 설명하고 있습니다. 또 데이터베이스로부터 XML 문서를 생성하는 Data Engine API에 대한 개요 정보가 소개됩니다. 이 API는 XML 템플릿을 이용하여 데이터베이스에 대한 SQL 쿼리와 생성된 XML 문서의 구조를 정의합니다.
Oracle XML Publisher API 중 일부는 입력으로 RFT, PDF 템플릿을 요구합니다. RTF 템플릿을 생성하기 위해서는 Microsoft Word 애드인 프로그램인 Oracle XML Publisher Desktop이 필요합니다. PDF 템플릿을 생성하려면, Word 문서에서 레이아웃을 정의한 후 Adobe Acrobat Distiller를 사용하여 문서를 PDF로 변환하면 됩니다. 이 문서에서는 RTF, PDF 템플릿을 요구하는 API들에 대해 설명하고 있지 않지만, 이러한 API를 이용하여 리포트를 생성하는 작업 절차는 Oracle XML Publisher API의 경우와 유사합니다.
Oracle XML Publisher의 설치
- Oracle XML Publisher Enterprise 5.6.2 for Microsoft Windows를 다운로드한 후 XMLP562_WIN.zip 파일의 압축을 풉니다.
- Oracle JDeveloper 10.1.3에서 File>New를 선택하여 New Gallery Wizard를 엽니다.
- General>Application을 선택한 후 OK 버튼을 눌러 새로운 애플리케이션을 생성합니다.
- Create Application 프레임에서 애플리케이션 이름(예: XMLPublisher)을 정의한 후 OK를 클릭합니다.
- Create Project 프레임에서 프로젝트 이름(예: XMLPublisher)를 정의한 후 OK를 클릭합니다. 이제 애플리케이션과 프로젝트가 Application Navigator에 추가됩니다.
- 다음으로 New Gallery 프레임에서 General>Java Class를 선택하여 프로젝트에 Java 클래스를 추가합니다.
- Create Java Class 프레임에서 클래스 이름(예: XMLPublisher)와 패키지 이름(예: 'xmlpublisher')을 명시한 후 OK 버튼을 누릅니다. Oracle XML Publisher 프로젝트에 Java 클래스가 추가됩니다.
- 본 문서에서는 XML 문서로부터 PDF 리포트를 생성하는 작업을 수행해 보겠습니다. New Gallery 프레임에서 General>XML>XML Document를 선택하여 프로젝트에 XML 문서를 추가합니다.
다음 섹션에서는 다른 XML, XSLT 문서를 프로젝트에 추가하게 됩니다. 그림 1은 Oracle XML Publisher 프로젝트의 디렉토리 구조를 보여 주고 있습니다:
그림 1: Oracle XML Publisher의 프로젝트 디렉토리 구조.
- 다음으로 Tools>Project Properties를 선택하여 Oracle XML Publisher 프로젝트에 Oracle XML Publisher의 Jar 파일을 추가합니다..
- Project Properties 프레임에서 Libraries를 선택합니다.
- Add Jar/Directory 버튼을 사용해서 Jar 파일을 추가합니다. Oracle XML Publisher Jar 파일은 <XMLP562_WIN>\manual\lib 디렉토리에 위치하고 있습니다. 여기서 <XMLP562_WIN>은 Oracle XML Publisher zip 파일의 압축을 푼 디렉토리를 의미합니다.
- Add Library 버튼을 사용해서 Oracle JDBC 라이브러리를 추가합니다. 이 라이브러리는 오라클 데이터베이스에 JDBC 연결을 설정할 때 필요합니다. OK를 클릭합니다.
그림 2은 Oracle XML Publisher 프로젝트의 Jar 파일/라이브러리를 보여 주고 있습니다:
그림 2: Oracle XML Publisher 프로젝트 라이브러리.
Oracle Database 10g를 다운로드/설치하고, 샘플 스키마를 포함하는 데이터베이스 인스턴스를 생성합니다. 그런 다음, 아래와 같이 SQL 스크립트를 사용하여 OE 스키마에 데이터베이스 테이블을 생성합니다.
CREATE TABLE OE.Catalog(CatalogId VARCHAR(25) PRIMARY KEY,
Journal VARCHAR(25), Publisher VARCHAR(25),
Edition VARCHAR(25), Title Varchar(45), Author Varchar(25));
INSERT INTO OE.Catalog VALUES('catalog1', 'Oracle Magazine', 'Oracle Publishing',
'March-April 2006', 'Commanding ASM', 'Arup Nanda');
INSERT INTO OE.Catalog VALUES('catalog2', 'Oracle Magazine', 'Oracle Publishing',
'May-June 2006', 'Tuning Your View Objects', 'Steve Muench');
INSERT INTO OE.Catalog VALUES('catalog3', 'Oracle Magazine', 'Oracle Publishing',
'May-June 2006', 'Managing Oracle Portal', 'Aradhana Puri');
FO Processor Engine
FO Processor Engine API는 XML 파일과 XSLT 파일로부터 PDF, Excel, HTML, RTF 리포트를 생성하는데 사용됩니다. 이번 섹션에서는 PDF 문서를 생성해 보겠습니다. PDF 리포트 생성을 위해 입력되는 XML 문서가 아래와 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<!--A Oracle Magazine Catalog-->
<catalog title="Oracle Magazine" publisher="Oracle Publishing">
<magazine date="March-April 2006">
<article>
<title>Using Bind Variables</title>
<author>Steve Muench</author>
</article>
<article>
<title>Commanding ASM</title>
<author>Arup Nanda</author>
</article>
</magazine>
<magazine date="May-June 2006">
<article>
<title>Tuning Your View Objects</title>
<author>Steve Muench</author>
</article>
<article>
<title>Managing Oracle Portal</title>
<author>Aradhana Puri</author>
</article>
</magazine>
</catalog>
PDF 리포트를 생성하기 위해서는 XSL-FO 파일이 필요합니다. 오브젝트를 포맷하는 방법은 XSL 스팩에서 설명되고 있습니다. 여기에서는 XML 파일을 XSL-FO 파일로 변환하는 XSLT 스타일 시트를 정의해야 합니다. 그런 다음 FO Processor Engine을 이용하여 파일을 리포트로 변환합니다.
XSL-FO 파일은 레이아웃, 폰트, 테이블등을 포함하는 리포트로 데이터를 포맷하는 방법을 정의하고 있습니다. XSL-FO 파일의 엘리먼트는 fo’ prefix namespace에 위치합니다(네임스페이스 선언부 xmlns:fo=http://www.w3.org/1999/XSL/Format을 통해 정의되었습니다). XSL-FO 파일을 위한 DTD는 fo.zip에서 확인할 수 있습니다.
XSL-FO 파일을 위한 DTD를 XML 스키마로 변환함으로써 XML 스키마에 대해 XSL-FO 파일을 검증할 수 있습니다. Oracle JDeveloper는 XSL-FO 파일의 XML 스키마를 등록하고 XSL-FO 파일의 인스턴스를 생성/검증하는 기능을 제공합니다. XSL-FO 파일을 검증한다는 것은 XSL-FO 파일의 포맷을 확인함을 의미합니다. XSL-FO 파일의 엘리먼트가 표 1과 같습니다.
Table 1. XSL-FO 문서의 엘리먼트
| 엘리먼트 |
설 명 |
fo:root |
XSL-FO 문서의 루트 엘리먼트 |
fo:layout-master-set |
페이지 마스터(page master) 셋을 정의 |
fo:simple-page-master |
페이지 레이아웃 |
fo:page-sequence |
페이지 마스터의 순서를 정의 |
fo:flow |
페이지 컨텐트 |
fo:block |
블럭 컨텐트 |
fo:list-block |
리스트를 정의 |
fo:list-item |
아이템 리스트 |
fo:table |
테이블 |
fo:table-column |
테이블 컬럼 |
fo:table-header |
테이블 헤더 |
fo:table-body |
테이블 본문 |
fo:table-row |
테이블 로우 |
fo:table-cell |
테이블 셀 |
예제 XSLT 스타일 시트(catalog.xsl)은 입력 XML 파일(catalog.xml)로부터 XSL-FO 파일을 생성하는데 이용됩니다.
catalog.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" version="1.0"
omit-xml-declaration="no" indent="yes"/>
<!-- ========================= -->
<!-- root element: catalog -->
<!-- ========================= -->
<xsl:template match="/catalog">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm"
page-width="21cm" margin-top="2cm" margin-bottom="2cm"
margin-left="2cm" margin-right="2cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="16pt" font-weight="bold" space-after="5mm">
Catalog: <xsl:value-of select="@title"/>
</fo:block>
<fo:block font-size="16pt" font-weight="bold" space-after="5mm">
Publisher: <xsl:value-of select="@publisher"/>
</fo:block>
<fo:block font-size="10pt">
<fo:table table-layout="fixed">
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="5cm"/>
<fo:table-header>
<fo:table-row font-weight="bold"><fo:table-cell>
<fo:block>
<xsl:text>Date</xsl:text>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:text>Title</xsl:text>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:text>Author</xsl:text>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:apply-templates select="magazine"/>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="magazine">
<xsl:for-each select="article">
<fo:table-row>
<fo:table-cell>
<fo:block>
<xsl:value-of select="../@date"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="title"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="author"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
다음으로, Oracle XML Publisher API를 이용하여 리포트를 생성하는 Java 애플리케이션을 개발해 보겠습니다. XMLPublisher.java 클래스에서 Oracle XML Publisher 클래스를 임포트합니다:
import oracle.apps.xdo.template.FOProcessor;
import oracle.apps.xdo.template.fo.util.FOUtility;
import oracle.apps.xdo.common.pdf.util.PDFDocMerger;
import oracle.apps.xdo.dataengine.DataProcessor;
import oracle.apps.xdo.XDOException;
FOProcessor 오브젝트를 생성합니다. FOProcessor 클래스는 FO Processing Engine을 사용하기 위한 메인 클래스입니다.
FOProcessor processor = new FOProcessor();
입력 XML 파일을 설정합니다:
processor.setData("catalog.xml");
XSLT 템플릿을 설정합니다:
processor.setTemplate("catalog.xsl");
출력 파일과 출력 포맷(PDF 문서)를 설정합니다:
processor.setOutput("catalog.pdf");
processor.setOutputFormat(FOProcessor.FORMAT_PDF);
표 2는 지원되는 출력 포맷을 설명하고 있습니다.
표 2. FO Processor 출력 포맷
| 출력 포맷 |
설명 |
FORMAT_AWT |
AWT 포맷 |
FORMAT_EXCEL |
Excel 스프레드시트 포맷 |
FORMAT_HTML |
HTML 포맷 |
FORMAT_PDF |
PDF 포맷t |
FORMAT_RTF |
RTF 포맷 |
FORMAT_UIX |
UIX 포맷 |
HTML 출력이 필요한 경우, 아래와 같이 HTML 출력 파일과 HTML 출력 포맷을 설정합니다:
processor.setOutput("catalog.html");
processor.setOutputFormat(FOProcessor.FORMAT_HTML);
FO Processor Engine을 실행합니다:
processor.generate();
FO Processor Engine에 의해 생성된 PDF 리포트(catalog.pdf)는 샘플 코드 zip 파일에서 확인할 수 있습니다.
XSL-FO Utility
앞 섹션에서는 XML 파일, XSLT 파일로부터 Oracle XML Publisher 리포트를 생성하는 방법을 설명했습니다. 여기서 입력에 여러 개의 XML 파일, XSLT 파일을 사용할 수도 있습니다. XSL-FO Utility는 일련의 XML, XSLT 파일로부터 XSL-FO 파일을 생성합니다.
예를 들어, 아래와 같은 두 개의 입력 XML 파일(catalog2.xml, catalog3.xml)로부터 XSL-FO 파일을 생성해 보겠습니다.
catalog2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--A Oracle Magazine Catalog-->
<catalog title="Oracle Magazine" publisher="Oracle Publishing">
<magazine date="July-August 2006">
<article>
<title>Archiving Data Using XML</title>
<author>Arup Nanda</author>
</article>
</magazine>
</catalog>
catalog3.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--A Oracle Magazine Catalog-->
<catalog title="Oracle Magazine" publisher="Oracle Publishing">
<magazine date="July-August 2006">
<article>
<title>XML in Databases</title>
<author>Ari Kaplan</author>
</article>
</magazine>
<magazine date="Sept-Oct 2006">
<article>
<title>Harnessing the Active Data Model</title>
<author>Steve Muench</author>
</article>
</magazine>
</catalog>
이제부터 XSLT 파일(catalog.xsl)을 이용하여 입력 XML 파일을 위한 XSL-FO 파일들을 생성하고, 생성된XSL-FO 파일들을 하나의 XSL-FO 파일로 병합하는 작업을 수행하겠습니다.
입력된 XML, XSLT 파일들로부터 XSL-FO 파일을 위한 InputStream 오브젝트 어레이를 생성합니다:
InputStream[] input = new InputStream[2];
XSL-FO Utility의 메인 클래스 FOUtility를 이용하여 입력 XML, XSLT 파일들로부터 XSL-FO 파일을 생성합니다. 정적 메소드 createFO(java.lang.String xmlFile,java.lang.String xslFile)를 이용하여 XSL-FO 파일을 생성합니다:
InputStream firstFOStream = FOUtility.createFO("catalog2.xml",
"catalog.xsl");InputStream secondFOStream =
FOUtility.createFO("catalog3.xml", "catalog.xsl");
InputStream 어레이에 XSL-FO InputStream 오브젝트들을 설정합니다:
Array.set(input, 0, firstFOStream);
Array.set(input, 1, secondFOStream);
정적 메소드 mergeFOs()를 이용하여 XSL-FO InputStream 오브젝트들을 병합합니다:
InputStream mergedFOStream = FOUtility.mergeFOs(input, null);
병합된 XSL-FO 파일들로부터 PDF 리포트를 생성하는데 사용할 FOProcessor 오브젝트를 생성합니다:
FOProcessor processor = new FOProcessor();
FOProcessor 오브젝트에 병합된 XSL-FO InputStream을 설정합니다:
processor.setData(mergedFOStream);
XSL-FO 파일이 FOProcessor에 대한 데이터소스로 명시된 경우, XSLT 문서를 설정할 필요가 없습니다. XSLT 템플릿을 null로 설정합니다:
processor.setTemplate((String)null);
출력 PDF 파일과 출력 포맷를 설정한 후 PDF 리포트를 생성합니다:
processor.setOutput("catalog2.pdf");
processor.setOutputFormat(FOProcessor.FORMAT_PDF);
processor.generate();
병합된 XSL-FO InputStream으로부터 생성된 PDF 리포트(catalog2.pdf)는 샘플 코드에서 확인할 수 있습니다.
PDF Document Merger
때로는 여러 개의 PDF 문서들을 병합해야 할 필요가 있을 수도 있습니다. PDF Document Merger는 PDF 문서를 병합하고, 병합된 문서에 페이지 넘버링을 추가하는 기능을 제공합니다. 이번 섹션에서는 앞에서 생성한 catalog.pdf와 catalog2.pdf를 병합해 보기로 하겠습니다.
먼저 catalog.pdf와 catalog2.pdf로부터 InputStream을 생성합니다:
FileInputStream[] inputStreams = new FileInputStream[2];
inputStreams[0] = new FileInputStream("catalog.pdf");
inputStreams[1] = new FileInputStream("catalog2.pdf");
병합된 PDF 문서를 위한 FileOutputStream을 생성합니다:
FileOutputStream outputStream = new FileOutputStream("catalog3.pdf");
PDFDocMerger 클래스를 사용하여 PDf 문서들을 병합합니다:
PDFDocMerger pdfMerger = new PDFDocMerger(inputStreams, outputStream);
페이지 넘버링을 추가하기 위해, 페이지 넘버링 좌표와 페이지 넘버링 폰트를 설정합니다:
pdfMerger.setPageNumberCoordinates(300, 20);
pdfMerger.setPageNumberFontInfo("Courier", 10);
setPageNumberValue(int initialValue, int startPageIndex) 메소드를 사용하여 페이지 넘버링 값을 설정합니다. initialValue는 페이지 넘버링의 초기값을 의미합니다. 그리고 startPageIndex는 넘버링이 시작되는 페이지 넘버를 의미합니다:
pdfMerger.setPageNumberValue(1, 1);
PDF Document Merger를 실행합니다:
pdfMerger.process();
병합된 PDF 문서(catalog3.pdf)는 샘플 코드에서 확인할 수 있습니다.
Data Engine
Data Engine API는 데이터베이스 데이터로부터 XML 문서를 생성하는 기능을 제공합니다. 데이터 템플릿으로부터 XML 문서를 생성하기 위해 DataProcessor 클래스가 사용됩니다. 이 템플릿은 입력 매개변수, 데이터베이스 조회를 위한 SQL 쿼리, 생성할 XML 문서의 데이터 구조를 정의하는 XML 파일의 형태로 구현됩니다. Data Engine API는 XML 문서의 엘리먼트 계위(hierarchy)를 생성하는 기능을 제공한다는 점에서 유사한 기능을 제공하는 XML SQL Utility와 차별화됩니다. 표 3은 데이터 템플릿에서 자주 사용되는 엘리먼트들을 설명하고 있습니다.
표 3. 데이터 템플릿 엘리먼트
| 엘리먼트 |
설 명 |
속 성 |
dataTemplate (필수) |
루트 엘리먼트 |
name(필수)
version(필수) |
매개변수 |
SQL 쿼리에 대한 입력 매개변수를 설정. <parameter> 엘리먼트들로 구성. 매개변수 값은 런타임에 설정될 수 있음 |
name(필수)
dataType - “character”, “date” 또는 “number” 데이터 타입이 사용됨. 디폴트 값은 "character". |
dataQuery(필수) |
데이터베이스로부터 데이터를 가져오는데 필요한 SQL 쿼리를 정의. <sqlstatement> 엘리먼트들로 구성. |
- |
sqlstatement (필수) |
사용되는 SQL 구문을 정의./p> |
name(필수) |
dataStructure(여러 개의 쿼리를 정의하는 경우 필요) |
출력 XML의 구조를 정의. <group>, <element> 엘리먼트들로 구성. 단일 쿼리가 사용되지 않은 경우, 출력 XML은 SQL 쿼리의 각 컬럼에 대응하는 엘리먼트들로 구성됨. |
- |
group |
엘리먼트 그룹과 서브그룹을 정의. 서브그룹 엘리먼트에 대해 엘리먼트 계위(hierarchy)를 정의할 수 있음. |
name(필수)
source(필수) - 그룹의 엘리먼트를 가져오는데 사용할 SQL 구문을 위한 쿼리 식별자(query identifier)를 정의. |
element (필수) |
출력 XML 문서의 엘리먼트를 설 |
name(필수)
value(필수) - SQL 구문의 컬럼 네임을 설정. |
데이터베이스 테이블로부터 XML 문서를 생성하기 위해 샘플 데이터 템플릿(catalogDataTemplate.xml)이 사용됩니다:
catalogDataTemplate.xml
<?xml version="1.0" encoding="WINDOWS-1252" ?>
<dataTemplate name="catalogDataTemplate" description="Magazine
Catalog" defaultPackage="" Version="1.0">
<parameters>
<parameter name="id" dataType="character" />
</parameters>
<dataQuery>
<sqlStatement name="Q1">
<![CDATA[
SELECT CatalogId, Journal, Publisher, Edition, Title,
Author from OE.CATALOG WHERE CatalogId=:id]]>
</sqlStatement>
</dataQuery>
<dataStructure>
<group name="G_Catalog" source="Q1">
<element name="CATALOGID" value="CatalogId" />
<element name="JOURNAL" value="Journal" />
<element name="PUBLISHER" value="Publisher"/>
<element name="EDITION" value="Edition" />
<element name="TITLE" value="Title"/>
<element name="AUTHOR" value="Author" />
</group>
</dataStructure>
</dataTemplate>
샘플 데이터 템플릿은 character 타입의 매개변수와 id를 정의하고 있습니다. 또 Catalog 컬럼의 값을 id 매개변수로 설정하기 위해 SQL 쿼리에서 바인드 변수를 사용합니다. CatalogId 컬럼의 값은 런타임에 설정됩니다. 예제 쿼리의 모든 컬럼들은 VARCHAR 타입으로 정의되어 있습니다. SQL 쿼리에서 정의될 수 있는 컬럼 타입이 다음과 같습니다: VARCHAR2, CHAR, NUMBER, DATE, TIMESTAMP, BLOB, CLOB, XMLType.
다음으로, Data Engine API를 이용하여 데이터베이스 데이터로부터 XML 문서를 생성해 보겠습니다. 먼저, DataProcessor 오브젝트를 생성합니다:
DataProcessor dataProcessor = new DataProcessor();
DataProcessor 오브젝트에 데이터 템플릿을 설정합니다:
dataProcessor.setDataTemplate("catalogDataTemplate.xml");
매개변수를 위한 값을 설정하고, DataProcessor 오브젝트에 매개변수를 설정합니다:
Hashtable parameters = new Hashtable();
parameters.put("id","catalog1");
dataProcessor.setParameters(parameters);
오라클 데이터베이스에 대한 JDBC 연결을 생성하고, 이 연결을 DataProcessor 오브젝트에 설정합니다:
Class.forName("oracle.jdbc.OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:ORCL";
java.sql.Connection jdbcConnection = DriverManager.getConnection(url,
"OE", "password");
dataProcessor.setConnection(jdbcConnection);
출력 XML 문서를 설정하고 데이터 프로세서를 실행합니다:
dataProcessor.setOutput("catalogData.xml");
dataProcessor.processData();
데이터베이스가 아래와 같은 XML 문서(catalogData.xml)를 생성합니다:
<?xml version="1.0" encoding="UTF-8"?>
<catalogDataTemplate>
<id>catalog1</id>
<LIST_G_CATALOG>
<G_CATALOG>
<CATALOGID>catalog1</CATALOGID>
<JOURNAL>Oracle Magazine</JOURNAL>
<PUBLISHER>Oracle Publishing</PUBLISHER>
<EDITION>March-April 2006</EDITION>
<TITLE>Commanding ASM</TITLE>
<AUTHOR>Arup Nanda</AUTHOR>
</G_CATALOG>
</LIST_G_CATALOG>
</catalogDataTemplate>
XMLPublisher.java 클래스는 아래와 같이 정의됩니다:
package xmlpublisher;
import com.sun.java.util.collections.Hashtable;
import oracle.apps.xdo.XDOException;
import oracle.apps.xdo.common.pdf.util.PDFDocMerger;
import oracle.apps.xdo.dataengine.DataProcessor;
import oracle.apps.xdo.template.FOProcessor;
import oracle.apps.xdo.template.fo.util.FOUtility;
import oracle.xml.parser.v2.NSResolver;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.sql.DriverManager;
import java.sql.SQLException;
public class XMLPublisher {
public XMLPublisher() {
}
public void foProcessorEngine() {
try {
FOProcessor processor = new FOProcessor();
processor.setData("catalog.xml");
processor.setTemplate("catalog.xsl");
processor.setOutput("catalog.pdf");
processor.setOutputFormat(FOProcessor.FORMAT_PDF);
processor.generate();
} catch (XDOException e) {
System.out.println("XDOException " + e.getMessage());
}
}
public void xslFoUtility() {
try {
InputStream[] input = new InputStream[2];
InputStream firstFOStream = FOUtility.createFO("catalog2.xml", "catalog.xsl");
InputStream secondFOStream = FOUtility.createFO("catalog3.xml", "catalog.xsl");
Array.set(input, 0, firstFOStream);
Array.set(input, 1, secondFOStream);
InputStream mergedFOStream = FOUtility.mergeFOs(input, null);
if (mergedFOStream == null) {
System.out.println("Merge failed.");
}
FOProcessor processor = new FOProcessor();
processor.setData(mergedFOStream);
processor.setTemplate((String) null);
processor.setOutput("catalog2.pdf");
processor.setOutputFormat(FOProcessor.FORMAT_PDF);
processor.generate();
} catch (XDOException e) {
System.out.println("XDOException" + e.getMessage());
}
}
public void pdfDocumentMerger() {
try {
FileInputStream[] inputStreams = new FileInputStream[2];
inputStreams[0] = new FileInputStream("catalog.pdf");
inputStreams[1] = new FileInputStream("catalog2.pdf");
FileOutputStream outputStream = new FileOutputStream("catalog3.pdf");
PDFDocMerger pdfMerger = new PDFDocMerger(inputStreams, outputStream);
pdfMerger.setPageNumberCoordinates(300, 20);
pdfMerger.setPageNumberFontInfo("Courier", 10);
pdfMerger.setPageNumberValue(1, 1);
pdfMerger.process();
pdfMerger = null;
} catch (XDOException e) {
System.out.println("XDOException" + e.getMessage());
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException " + e.getMessage());
}
}
public void dataEngine() {
try {
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
java.sql.Connection jdbcConnection = DriverManager.getConnection(url,
"OE", "password");
DataProcessor dataProcessor = new DataProcessor();
dataProcessor.setDataTemplate("catalogDataTemplate.xml");
Hashtable parameters = new Hashtable();
parameters.put("id", "catalog1");
dataProcessor.setParameters(parameters);
dataProcessor.setConnection(jdbcConnection);
dataProcessor.setOutput("catalogData.xml");
dataProcessor.processData();
} catch (SQLException e) {
System.out.println("SQLException " + e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFoundException " + e.getMessage());
} catch (XDOException e) {
System.out.println("XDOException" + e.getMessage());
}
}
public static void main(String[] argv) {
XMLPublisher xmlPublisher = new XMLPublisher();
xmlPublisher.foProcessorEngine();
xmlPublisher.xslFoUtility();
xmlPublisher.pdfDocumentMerger();
xmlPublisher.dataEngine();
}
}
다음으로, Oracle XML Publisher 애플리케이션을 실행합니다. XMLPublisher.java 클래스를 마우스 오른쪽 버튼으로 클릭하고 Run을 선택하여(그림 3 참고) PDF, XML 리포트를 생성합니다:
그림 3. XMLPublisher.java의 실행
FO Processor Engine 섹션의 출력이 HTML로 설정된 경우, 그림 4와 같이 출력으로 HTML 리포트가 생성됩니다:
그림 4. HTML 리포트
여기서 설명되지 않은 XMLPublisher API 역시 비슷한 방법으로 통합할 수 있습니다.
- PDF Form Processing Engine을 위한 XML Publisher 클래스는 oracle.apps.xdo.template.FormProcessor입니다.
- RTF Processor를 위한 클래스는 oracle.apps.xdo.template.RTFProcessor입니다.
- Document Processor를 위한 클래스는 oracle.apps.xdo.batch.DocumentProcessor입니다.
- PDF Book Binder Processor를 위한 클래스는 oracle.apps.xdo.template.pdf.book.PDFBookBinder입니다.
결론
축하합니다. 지금까지 Oracle XML Publisher API를 Oracle JDeveloper에 통합하여 PDF, Excel, HTML, XML 리포트를 생성하는 방법을 배우셨습니다.
Deepak Vohra (dvohra09@yahoo.com) is a NuBean Consultant, a web developer, a Sun Certified Java Programmer, and an Oracle Certified Associate.
|