Microsoft 社는 2022년 6월 15일 Internet Explorer 11의 지원을 종료했습니다.

Docbook to pdf using Apache Ant

제목

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 파일과 관련이 있을 가능성이 높다.
제목

첨부파일