본문 바로가기

아빠별/.Net

.Net으로 PDF를 만들자(FOP) - 3편

반응형

드디어 Coding을 해보자.
오늘은 어제까지 만든 dll을 가지고 간단한 예제 파일을 작성해 보자.

먼저 xml 과 xslt 파일을 준비하자.

sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<projectteam>
  <projectname>The Killer Application</projectname>
  <member>
    <name>John Doe</name>
    <function>lead</function>
    <email>jon.doe@killerapp.fun</email>
  </member>
  <member>
    <name>Paul Coder</name>
    <function>dev</function>
    <email>paul.coder@killerapp.fun</email>
  </member>
  <member>
    <name>Max Hacker</name>
    <function>dev</function>
    <email>max.hacker@killerapp.fun</email>
  </member>
  <member>
    <name>Donna Book</name>
    <function>doc</function>
    <email>donna.book@killerapp.fun</email>
  </member>
  <member>
    <name>Henry Tester</name>
    <function>qa</function>
    <email>henry.tester@killerapp.fun</email>
  </member>
  <member>
    <name>홍길동</name>
    <function>dev</function>
    <email>yhseo93@gmail.com</email>
  </member>
</projectteam>

sample.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" exclude-result-prefixes="fo">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
  <xsl:param name="versionParam" select="'1.0'"/>
  <xsl:template match="projectteam">
    <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">Project: <xsl:value-of select="projectname"/>
          </fo:block>
          <fo:block font-size="12pt" space-after="5mm">Version <xsl:value-of select="$versionParam"/>
          </fo:block>
          <fo:block font-size="10pt">
            <fo:table table-layout="fixed" width="100%" border-collapse="separate">
              <fo:table-column column-width="4cm"/>
              <fo:table-column column-width="4cm"/>
              <fo:table-column column-width="5cm"/>
              <fo:table-body>
                <xsl:apply-templates select="member"/>
              </fo:table-body>
            </fo:table>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
  <xsl:template match="member">
    <fo:table-row>
      <xsl:if test="function = 'lead'">
        <xsl:attribute name="font-weight">bold</xsl:attribute>
      </xsl:if>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="name"/>
        </fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="function"/>
        </fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="email"/>
        </fo:block>
      </fo:table-cell>
    </fo:table-row>
  </xsl:template>
</xsl:stylesheet>

위의 파일을 저장 한 후에 VS.Net 2003의 Console Project를 하나 생성한다.

사용자 삽입 이미지

참조 추가를 하여
fop.dll 과 ikvm\bin 디렉토리에 있는 IKVM.OpenJDK.ClassLibrary.dll 을 참조한다
사용자 삽입 이미지

그리고 Source를 작성한다. 아래와 같다.

using System;

using java.io;
using org.apache.fop.apps;

using javax.xml.transform;
using javax.xml.transform.sax;
using javax.xml.transform.stream;

namespace PrjConsole
{
 class PDFClass
 {
  [STAThread]
  static void Main(string[] args)
  {
   try
   {
    File baseDir = new File("c:/pdf");

    File xmlfile = new File(baseDir, "xml/xml/sample.xml");
    File xsltfile = new File(baseDir, "xml/xslt/sample.xsl");
    File pdffile = new File(baseDir, "pdf/sample.pdf");

    FopFactory fopFactory = FopFactory.newInstance();
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

   
    OutputStream bout = new FileOutputStream(pdffile);
    bout = new BufferedOutputStream(bout);
   
    try
    {
     Fop fop = fopFactory.newFop(MimeConstants.__Fields.MIME_PDF, foUserAgent, bout);
    
     TransformerFactory factory = TransformerFactory.newInstance();
     Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
                            
     Source src = new StreamSource(xmlfile);
            
     Result res = new SAXResult(fop.getDefaultHandler());
    
     transformer.transform(src, res);

     System.Console.WriteLine("Success!!!");
    }
    finally {
     bout.close();
    }

   }
   catch(Exception ex)
   {
    System.Console.WriteLine(ex.Message);
   }
  }
 }
}


sample.pdf
짜잔~~ PDF 화면

사용자 삽입 이미지

엥 한글이 깨졌당 ㅠㅠ

다음시간에 한글폰트를 사용해서 한글뿐만 아니라 다양한 글꼴을 사용해 보자.

보너스 : 소스 파일을 첨부 해 드릴께요.


그럼 다음 시간에..

반응형