Docbook to pdf using Apache Ant
1. 디렉토리 구조
src 디렉토리 아래에 docbook.xml 파일로부터 다음과 같은 파일을 생성한다.
- html 디렉토리 아래에 docbook.html
- fo 디렉토리 아래에 docbook.fo
- pdf 디렉토리 아래에 docbook.pdf
<property>
중 file.name 을 변경하면, 파일이름(docbook)을 변경할 수 있다.
lib 디렉토리 아래에 다음과 같은 패키지를 다운로드 받아 압축을 해제한다.
- docbook-xsl-1.79.1
- fop-2.3
- xalan-j_2_7_2
2. build.xml
<?xml version="1.0"?> <project name="docbook" default="html"> <property name="file.name" value="docbook" /> <property name="src.dir" value="src" /> <property name="html.dir" value="html" /> <property name="fo.dir" value="fo" /> <property name="pdf.dir" value="pdf" /> <property name="docbook.xsl.dir" value="lib/docbook-xsl-1.79.1" /> <property name="html.stylesheet" value="${docbook.xsl.dir}/html/docbook.xsl" /> <property name="fo.stylesheet" value="${docbook.xsl.dir}/fo/docbook.xsl" /> <property name="xalan.lib.dir" value="lib/xalan-j_2_7_2" /> <path id="xalan.classpath"> <fileset dir="${xalan.lib.dir}" id="xalan.fileset"> <include name="xalan.jar" /> <include name="xercesImpl.jar" /> </fileset> </path> <property name="fop.home" value="lib/fop-2.3/fop" /> <path id="fop.classpath"> <fileset dir="${fop.home}/lib"> <include name="*.jar" /> </fileset> <fileset dir="${fop.home}/build"> <include name="fop.jar" /> <include name="fop-hyph.jar" /> </fileset> </path> <taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop"> <classpath refid="fop.classpath" /> </taskdef> <target name="clean"> <delete dir="${html.dir}" /> <delete dir="${fo.dir}" /> <delete dir="${pdf.dir}" /> </target> <target name="depends"> <mkdir dir="${html.dir}" /> <mkdir dir="${fo.dir}" /> <mkdir dir="${pdf.dir}" /> </target> <target name="html" depends="depends"> <xslt style="${html.stylesheet}" extension=".html" basedir="${src.dir}" destdir="${html.dir}" > <classpath refid="xalan.classpath" /> <outputproperty name="encoding" value="utf-8"/> </xslt> </target> <target name="pdf" depends="depends"> <xslt style="${fo.stylesheet}" extension=".fo" basedir="${src.dir}" destdir="${fo.dir}" > <classpath refid="xalan.classpath" /> <include name="${file.name}.xml" /> <param name="paper.type" expression="A4" /> </xslt> <fop format="application/pdf" fofile="${fo.dir}/${file.name}.fo" outfile="${pdf.dir}/${file.name}.pdf" userconfig="${fop.home}/conf/fop.xconf" /> </target> </project>
3. docbook.xml
이 파일은 UTF-8 로 저장해야 한다.
<?xml version="1.0" encoding="utf-8"?> <article xml:lang="ko" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.0"> <info> <title>DocBook Publishing</title> <subtitle>(PDF Publishing)</subtitle> <authorgroup> <author> <personname>DocBook Author Name</personname> <email>AuthorEmail@</email> </author> </authorgroup> <pubdate>2019-10-30</pubdate> </info> <section id="s.intro"> <title>Title</title> <para> Introduction </para> </section> </article>
4. fop.xconf 에서 한글 폰트 설정
Linux 에서 한글이 정상적으로 표시된 PDF를 출력되기 위해서는 Apache FOP 디렉토리 아래의 /conf/fop.xconf 에서 mime 속성값이 [application/pdf] 인 renderer 요소를 찾아 fonts 요소를 다음과 같이 변경한다.
나눔글꼴을 사용했으며, 글꼴 파일(ttf) 의 경로는 적절하게 변경해야 한다.
<fonts> <!-- <auto-detect/> --> <font kerning="yes" embed-url="/usr/share/fonts/truetype/nanum/NanumGothic.ttf" > <font-triplet name="Helvetica" style="normal" weight="normal"/> <font-triplet name="sans-serif" style="normal" weight="normal"/> <font-triplet name="SansSerif" style="normal" weight="normal"/> </font> <font kerning="yes" embed-url="/usr/share/fonts/truetype/nanum/NanumGothicBold.ttf" > <font-triplet name="Helvetica" style="normal" weight="bold"/> <font-triplet name="sans-serif" style="normal" weight="bold"/> <font-triplet name="SansSerif" style="normal" weight="bold"/> </font> <font kerning="yes" embed-url="/usr/share/fonts/truetype/nanum/NanumMyeongjo.ttf" > <font-triplet name="Times" style="normal" weight="normal"/> <font-triplet name="Times Roman" style="normal" weight="normal"/> <font-triplet name="Times-Roman" style="normal" weight="normal"/> <font-triplet name="serif" style="normal" weight="normal"/> <font-triplet name="any" style="normal" weight="normal"/> </font> <font kerning="yes" embed-url="/usr/share/fonts/truetype/nanum/NanumMyeongjoBold.ttf" > <font-triplet name="Times" style="normal" weight="bold"/> <font-triplet name="Times Roman" style="normal" weight="bold"/> <font-triplet name="Times-Roman" style="normal" weight="bold"/> <font-triplet name="serif" style="normal" weight="bold"/> <font-triplet name="any" style="normal" weight="bold"/> </font> <font kerning="yes" embed-url="/usr/share/fonts/truetype/nanum/NanumGothic_Coding.ttf" > <font-triplet name="Courier Courier" style="normal" weight="normal"/> <font-triplet name="monospace" style="normal" weight="normal"/> <font-triplet name="Monospaced" style="normal" weight="normal"/> </font> <font kerning="yes" embed-url="/usr/share/fonts/truetype/nanum/NanumGothic_Coding_Bold.ttf" > <font-triplet name="Courier Courier" style="normal" weight="bold"/> <font-triplet name="monospace" style="normal" weight="bold"/> <font-triplet name="Monospaced" style="normal" weight="bold"/> </font> </fonts>
5. 여담
- 최근에는 docbook 의 자리를 MarkDown 이 많이 대체했지만, 문서 분량이 많은 경우 쓸모가 있기도 하다.
- Linux 에서 한글 폰트 문제까지 해결된다. 만약 한글이 깨진다면, fop.xconf 파일과 관련이 있을 가능성이 높다.