ラベル DocBook の投稿を表示しています。 すべての投稿を表示
ラベル DocBook の投稿を表示しています。 すべての投稿を表示

2013年5月19日日曜日

[FOP]FO 作成のパラメータ指定

次の xml ファイルに対して fo 作成用の xsl を操作して出力結果の違いを見てみる。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<article>
  <sect1>
    <title>Hello World</title>
    <para>Hello World</para>
  </sect1>
  <sect1>
    <title>日本語テスト</title>
    <para>日本語が正しく表示されますか?</para>
  </sect1>
  <sect1>
    <title>hoge</title>
    <para>hello</para>
    <sect2>
      <title>hoge2</title>
      <para>hogehoge</para>
    </sect2>
  </sect1>
</article>


標準
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>
  <xsl:import href="../docbook-xsl-1.75.0/fo/docbook.xsl"/>
  <xsl:output method="fo" encoding="UTF-8" indent="yes"/>

  <xsl:param name="section.autolabel" select="1"/>
  <xsl:param name="default.encoding" select="'UTF-8'"/>

  <xsl:param name="paper.type" select="'A4'"/>

  <xsl:param name="title.font.family" select="'Meiryo'"/>
  <xsl:param name="body.font.family" select="'Meiryo'"/>
  <xsl:param name="sans.font.family" select="'Meiryo'"/>
  <xsl:param name="monospace.font.family" select="'Meiryo'"/>
</xsl:stylesheet>


文章全体の上下 margin を調整
次の指定を xsl に追加
<xsl:param name="page.margin.top">10mm</xsl:param>
<xsl:param name="page.margin.bottom">10mm</xsl:param>


本文上下の margin を調整
次の指定を xsl に追加
<xsl:param name="body.margin.top">0mm</xsl:param>
<xsl:param name="body.margin.bottom">0mm</xsl:param>


本文左右の margin を調整
次の指定を xsl に追加
<xsl:param name="page.margin.inner">0mm</xsl:param>
<xsl:param name="page.margin.outer">0mm</xsl:param>


段落の開始位置 左 margin を調整
次の指定を xsl に追加
<xsl:param name="body.start.indent">0pt</xsl:param>


Table of Contents, List of Figures なし
次の指定を xsl に追加
<xsl:param name="generate.toc">
 article nop
</xsl:param>


Header に draft を入れる, Background に draft 画像を貼る
次の指定を xsl に追加
<xsl:param name="draft.mode">yes</xsl:param>
<xsl:param name="draft.watermark.image">file:///c:\usr\share\sgml\docbook-xsl-1.75.0\images\draft.png</xsl:param>
draft.watermark.image を指定しないと HTTP 通信をして draft.png ファイルを取得しようとするので, ネットワークがつながっていない・Proxy が設定されていない等でエラーとなった場合に下記の表示が出る
[fop] 致命的: Error with opening URL 'http://docbook.sourceforge.net/release/images/draft.png': Connection timed out: connect


Header, Footer に罫線なし
次の指定を xsl に追加
<xsl:param name="header.rule" select="0"></xsl:param>
<xsl:param name="footer.rule" select="0"></xsl:param>


ページ定義
<?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="297mm"
                         page-width="210mm"
                         margin-top="10mm"
                         margin-bottom="20mm"
                         margin-left="25mm"
                         margin-right="25mm">
   <fo:region-body margin-top="30mm"/>
   <fo:region-before extent="30mm"/>
   <fo:region-after extent="15mm"/>
  </fo:simple-page-master>
 </fo:layout-master-set>

 <fo:page-sequence master-reference="simple">
  <fo:flow flow-name="xsl-region-body">
   <fo:block font-size="18pt" padding-top="3pt" padding-bottom="10pt">
    TITLE
   </fo:block>
   <fo:block font-size="12pt" font-family="sans-serif">
    hogehoge
   </fo:block>
   <fo:block font-size="14pt" font-family="IPA Mincho">
    ほげほげ
   </fo:block>
  </fo:flow>
 </fo:page-sequence>
</fo:root>
  • ページの定義は以下の部分
    page-height="297mm"
    page-width="210mm"
    margin-top="10mm"
    margin-bottom="20mm"
    margin-left="25mm"
    margin-right="25mm"
    長さ 297mm x 幅 210mm は A4 サイズの用紙
  • 文章本体は以下の部分で定義
    <fo:region-body margin-top="30mm"/>
  • ヘッダ部分
    <fo:region-before extent="30mm"/>
  • フッター部分
    <fo:region-after extent="15mm"/>
  • 以下の箇所が文章本体。master-reference では先に定義していたページ情報を指定する。
    <fo:page-sequence master-reference="simple">
            :
    </fo:page-sequence>
  • 以下の箇所でbody 部分に記載する内容を定義する。body 部分であることは xsl-region-body で指定している。
    <fo:flow flow-name="xsl-region-body">
          :
    </fo:flow>


region
<?xml version="1.0" encoding="UTF-8"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xml:lang="ja">
 <fo:layout-master-set>
  <fo:simple-page-master page-height="148mm"
                         page-width="105mm"
                         margin-top="10mm"
                         margin-left="20mm"
                         margin-right="20mm"
                         margin-bottom="10mm"
                         master-name="PageMaster">
   <fo:region-body   background-color="#cccccc"
                     margin-top="20mm"
                     margin-left="20mm"
                     margin-right="20mm"
                     margin-bottom="20mm"/>
   <fo:region-before background-color="#00ffff"  extent="15mm"/>
   <fo:region-after  background-color="#00ffff"  extent="15mm"/>
   <fo:region-start  background-color="#ffffcc" extent="15mm"/>
   <fo:region-end    background-color="#ffffcc" extent="15mm"/>
  </fo:simple-page-master>
 </fo:layout-master-set>

 <fo:page-sequence initial-page-number="1" master-reference="PageMaster">
  <fo:static-content flow-name="xsl-region-start">
   <fo:block>region-start</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="xsl-region-end">
   <fo:block>region-end</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="xsl-region-before">
   <fo:block>region-before</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="xsl-region-after">
   <fo:block>region-after</fo:block>
  </fo:static-content>

  <fo:flow flow-name="xsl-region-body">
   <fo:block>region-body</fo:block>
  </fo:flow>
 </fo:page-sequence>
</fo:root>
文章位置調整のパラメータは下表・下図のようになっている

Table: region
simple-page-mastermargin-top(1)
margin-left(2)
margin-right(3)
margin-bottom(4)
region-bodymargin-top(5)
margin-left(6)
margin-right(7)
margin-bottom(8)
region-beforeextent(9)
region-startextent(10)
region-endextent(11)
region-afterextent(12)

[FOP]生成した fo ファイルから PDF を生成する

fo ファイル生成で sample_fo.xml というファイルが生成されたので、fop に渡して PDF を生成する。
C:\home\docbook\sample>..\fop-0.95\fop.bat -c ..\fop-0.95\conf\fop.xconf sample.fo sample.pdf
pdf を生成できるように build.xml に追記
Example: build.xml
<taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop">
  <classpath>
    <pathelement location="../fop-0.95/build/fop.jar"/>
    <fileset dir="../fop-0.95/lib">
      <include name="*.jar"/>
    </fileset>
  </classpath>
</taskdef>

<target name="pdf">
  <xslt basedir="${basedir}"
        destdir="${basedir}"
        style="sample_fo.xsl"
        extension=".fo"
        includes="sample.xml">
    <classpath>
      <pathelement location="${LIBDIR}/xalan.jar"/>
    </classpath>
    <xmlcatalog>
      <dtd publicId="${DOCBOOK_PUBLIC_ID}"
           location="${DOCBOOK_DTD}"/>
    </xmlcatalog>
  </xslt>
  <fop format="application/pdf"
       basedir="${basedir}"
       outdir="${basedir}"
       userconfig="../fop-0.95/conf/fop.xconf"
       messagelevel="debug">
    <fileset dir="${basedir}">
      <include name="*.fo"/>
    </fileset>
  </fop>
</target>
Ant を実行して fo ファイルを生成する
> ant pdf

[FOP]DocBook から PDF を生成する

DocBook から PDF に出力するには以下の手順を踏む
  1. DocBook の XML から fo ファイルを生成する
  2. Apache FOP を使って fo から PDF を生成する


DocBook → fo
Example: 原稿 (sample.xml)
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" >

<article>
  <title>DocBook sample</title>
  <articleinfo>
    <author>
      <firstname>Hoge</firstname>
      <surname>Fuga</surname>
    </author>

    <copyright>
      <year>2009</year>
    </copyright>
  </articleinfo>

  <sect1><title>Hello World</title><para>Hello World</para></sect1>
  <sect1>
    <title>日本語テスト</title>
    <para>日本語が正しく表示されますか?</para>
  </sect1>
  <sect1>
    <title>hoge</title>
    <para>hello</para>
    <sect2>
      <title>hoge2</title>
      <para>hogehoge</para>
    </sect2>
  </sect1>
</article>
Example: fo を生成するための xsl ファイル (sample_fo.xsl)
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version='1.0'>
  <xsl:import href="../docbook-xsl-1.75.0/fo/docbook.xsl"/>
  <xsl:output method="fo" encoding="UTF-8" indent="yes"/>

  <xsl:param name="section.autolabel" select="1"/>
  <xsl:param name="default.encoding" select="'UTF-8'"/>
  <xsl:param name="paper.type" select="'A4'"/>
  <xsl:param name="draft.mode" select="'no'"/>
  <xsl:param name="hyphenate">false</xsl:param>
  <xsl:param name="callout.graphics.extension" select="'.gif'"/>
  <xsl:param name="title.font.family" select="'Meiryo'"/>
  <xsl:param name="body.font.family" select="'Meiryo'"/>
  <xsl:param name="sans.font.family" select="'Meiryo'"/>
  <xsl:param name="monospace.font.family" select="'Meiryo'"/>
</xsl:stylesheet>
fo を生成するためのルールを build.xml に記述
Example: build.xml
<project name="docbooktest" basedir="." default="xslt">
  <property name="DOCBOOK_DTD" value="../docbook-xml-4.5/docbookx.dtd"/>
  <property name="DOCBOOK_PUBLIC_ID" value="-//OASIS//DTD DocBook XML V4.5//EN"/>
  <property name="LIBDIR" value="../xalan-j_2_7_1/build"/>

  <target name="fo">
    <xslt basedir="${basedir}"
          destdir="${basedir}"
          style="sample_fo.xsl"
          extension=".fo"
          includes="sample.xml">
      <classpath>
        <pathelement location="${LIBDIR}/xalan.jar"/>
      </classpath>
      <xmlcatalog>
        <dtd publicId="${DOCBOOK_PUBLIC_ID}"
             location="${DOCBOOK_DTD}"/>
      </xmlcatalog>
    </xslt>
  </target>
</project>
Ant を実行して fo ファイルを生成する
> ant fo

[FOP]region-body margin

XSL ファイルの fo:region-body margin の値を変更してみる
<fo:simple-page-master master-name="A4">
  <fo:region-body margin="0cm"/>
</fo:simple-page-master>
左が margin="2cm" の場合、右が margin="0cm" の場合

[FOP]日本語対応

fop.jar 内にある org.apache.fop.fonts.apps.TTFReader を実行すると下記のように org.apache.commons.logging.LogFactory クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar org.apache.fop.fonts.apps.TTFReader
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
この場合は java\lib 内に commons-logging-1.0.4.jar があるのでクラスに指定して実行する。
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader
TTF Reader for Apache FOP 1.0

java org.apache.fop.fonts.apps.TTFReader [options] fontfile.ttf xmlfile.xml

where options can be:
-d  Debug mode
-q  Quiet mode
-enc ansi
    With this option you create a WinAnsi encoded font.
    The default is to create a CID keyed font.
    If you're not going to use characters outside the
    pdfencoding range (almost the same as iso-8889-1)
    you can add this option.
-ttcname <fontname>
    If you're reading data from a TrueType Collection
    (.ttc file) you must specify which font from the
    collection you will read metrics from. If you read
    from a .ttc file without this option, the fontnames
    will be listed for you.
 -fn <fontname>
    default is to use the fontname in the .ttf file, but
    you can override that name to make sure that the
    embedded font is used (if you're embedding fonts)
    instead of installed fonts when viewing documents
    with Acrobat Reader.
commons.logging も指定してメイリオフォントを読み込ませるようにすると、次は org.apache.commons.io.IOUtils クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils
この場合は java\lib 内に commons-io-1.3.1.jar があるのでクラスに指定して実行する。
commons.io も指定すると TTFReader が動作するようになる。ここでは ttcname オプションを指定していないのでエラーが発生しているが、meiryo.ttc ファイルに含まれるフォント名が "Meiryo", "Meiryo Italic" の 2 つであることが分かる。
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar org.apache.fop.fonts.apps.TTFReader c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo
Meiryo Italic
Error while building XML font metrics file.
java.lang.IllegalArgumentException: For TrueType collection you must specify which font to select (-ttcname)
ttcname オプションで "Meiryo" を選択すると org.apache.xmlgraphics.fonts.Gryphs クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "Meiryo" c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo <-- selected
Meiryo Italic
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/fonts/Glyphs
この場合は java\lib 内に xmlgraphics-commons-1.3.1.jar があるのでクラスに指定して実行する
これで meriyo.ttc から meiryo.xml が生成できた
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar;c:\usr\share\java\lib\xmlgraphics-commons-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "Meiryo" c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo <-- selected
Meiryo Italic
Font Family: [メイリオ, Meiryo]
Creating xml font file...
Creating CID encoded metrics...
Writing xml font file meiryo.xml...
This font contains no embedding license restrictions.

XML font metrics file successfully created.
Apache FOP を展開したディレクトリ以下の conf ディレクトリにある fop.xconf ファイルを開いてメイリオフォントの情報を追加する。<render mime="application/pdf"> 要素内の <fonts> 以下に使用するフォントを登録する。
<font metrics-url="file:///c:/usr/share/java/conf/meiryo.xml" kerning="yes" embed-url="file:///C:/WINDOWS/Fonts/meiryo.ttc">
  <font-triplet name="Meiryo" style="normal" weight="normal"/>
  <font-triplet name="Meiryo" style="normal" weight="bold"/>
</font>
上で生成した meiryo.xml も conf ディレクトリに置く
PDF 化するデータ (hello.fo) を準備
Example: hello.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">
         <fo:region-body margin-top="3cm"/>
         <fo:region-before extent="3cm"/>
         <fo:region-after extent="3cm"/>
      </fo:simple-page-master>
   </fo:layout-master-set>

   <fo:page-sequence master-reference="simple">
      <fo:flow flow-name="xsl-region-body">
         <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="18pt" text-align="center">
            こんにちは
         </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>
PDF に変換する
c オプションで使用する conf ファイルを指定し、上記の hello.fo を PDF に変換する
>..\fop-0.95\fop.bat -c ..\fop-0.95\conf\fop.xconf hello.fo hello.pdf
2009/05/19 11:24:57 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-height set to: 11in
2009/05/19 11:24:57 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-width set to: 8.26in
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: This is a TrueType collection file with 2 fonts
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Containing the following fonts:
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo <-- selected
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo Italic
生成した PDF ファイルで正しく日本語が表示されていれば成功

XSL でフォントを指定する場合
Example: pdf_jp.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output encoding="utf-8" indent="yes"/>
    <xsl:template match="/">
       <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" language="ja">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4">
                    <fo:region-body margin="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:apply-templates/>
        </fo:root>
    </xsl:template>

    <xsl:template match="/article">
        <fo:page-sequence master-reference="A4">
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="./info/title"/>
                <xsl:apply-templates select=".//para"/>
            </fo:flow>
         </fo:page-sequence>
    </xsl:template>

    <xsl:template match="//info/title">
        <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="20pt"><xsl:apply-templates/></fo:block>
    </xsl:template>

    <xsl:template match="//para">
        <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="10.5pt"><xsl:apply-templates/></fo:block>
    </xsl:template>
</xsl:stylesheet>
info - title, para 要素に対して font-family=Meiryo, font-weight=normal, font-style=normal を指定している
原稿となる XML ファイル (sample_pdf_jp.xml)
Example: sample_pdf_jp.xml
<?xml version="1.0" encoding="UTF-8"?>
<article version="5.0">
  <info>
    <title>Sample</title>
  </info>

  <para>Hello World</para>
  <para>こんにちは</para>
</article>
fop を使用して PDF 出力する
> c:\usr\share\java\fop.bat -c c:\usr\share\java\conf\fop.xconf -xml sample_pdf_jp.xml -xsl pdf_jp.xsl sample_jp.pdf
2011/04/13 13:53:14 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-height set to: 11in
2011/04/13 13:53:14 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-width set to: 8.26in
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: This is a TrueType collection file with 2 fonts
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Containing the following fonts:
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo <-- selected
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo Italic
参考: Apache FOPでPDF
参考: Apache FOP: Fonts

[FOP]動作確認

pdf 化する XML ファイルを作成
Example: hello.xml
<?xml version="1.0" encoding="UTF-8"?>
<article version="5.0">
  <info>
    <title>Sample</title>
  </info>

  <para>Hello World</para>
</article>
XSL ファイルを作成
Example: pdf.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output encoding="utf-8" indent="yes"/>
    <xsl:template match="/">
       <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4">
                    <fo:region-body margin="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:apply-templates/>
        </fo:root>
    </xsl:template>

    <xsl:template match="/article">
        <fo:page-sequence master-reference="A4">
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="./info/title"/>
                <xsl:apply-templates select=".//para"/>
            </fo:flow>
         </fo:page-sequence>
    </xsl:template>

    <xsl:template match="//info/title">
        <fo:block font-size="20pt"><xsl:apply-templates/></fo:block>
    </xsl:template>

    <xsl:template match="//para">
        <fo:block font-size="10.5pt"><xsl:apply-templates/></fo:block>
    </xsl:template>
</xsl:stylesheet>
Table: FOP コマンドのオプション
引数意味
-fo infilexsl:fo input file
-xml infilexml input file, -xsl と一緒に使用すること
-xsl stylesheetxslt stylesheet
-awt出力結果をディスプレイに表示
-pdf outfilePDF ファイルを生成
-foout outfileXSL-FO ファイルを生成する
参考: DocBookで文系論文を書いてみる 1日目

PDF に変換する
>..\fop-0.95\fop.bat -xsl pdf.xsl -xml sample_pdf.xml -pdf sample.pdf


XML, XSL から FO ファイルを生成
>..\fop-0.95\fop.bat -xsl pdf.xsl -xml sample_pdf.xml -pdf -foout sample.fo
生成された 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="A4">
<fo:region-body margin="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10.5pt">Hello World</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

[FOP]インストール

Apache FOP を入れて XML → PDF が生成できる環境を整える
  1. Apache FOP: Downloading A Distribution からバイナリをダウンロードする
  2. ダウンロードしたファイルを解凍する


LinuxMint12 へのインストール
  1. Menu -> その他 -> ソフトウェアの管理
  2. 右上の検索窓に fop と入力
  3. fop を選択
  4. [インストール] ボタンを押す

2013年3月8日金曜日

[DocBook]itemizedlist, orderdlist で項目間が広い場合

<itemizedlist>
  <listitem>
    <para>各支店の従業員数を表にする</para>
  </listitem>
  <listitem>
    <para>全支店の従業員数の合計を計算する</para>
  </listitem>
</itemizedlist>
と記述しておくと HTML に変換した時に各項目が %lt;p\> で括られてしまい行間が広くなってしまう。

HTML での出力結果
<ul class="itemizedlist" type="disc">
   <li class="listitem">
      <p>各支店の従業員数を表にする</p>
   </li>
   <li class="listitem">
      <p>全支店の従業員数の合計を計算する</p>
   </li>
</ul>
その場合は <para> ではなく <simpara> を使うことで <p> で括られることがなくなり行間が純粋なリスト表示の幅になる。
<itemizedlist>
  <listitem>
    <simpara>各支店の従業員数を表にする</simpara>
  </listitem>
  <listitem>
    <simpara>全支店の従業員数の合計を計算する</simpara>
  </listitem>
</itemizedlist>

HTML での出力結果
<ul class="itemizedlist" type="disc">
   <li class="listitem">各支店の従業員数を表にする</li>
   <li class="listitem">全支店の従業員数の合計を計算する</li>
</ul>

simpara を使わない方法
生成した HTML から参照する css で <p> のパラメータを変更する
P {
   margin: 0.2em 0px;
}

[DocBook]クロスリファレンス

クロスリファレンスは以下のようにして作成する。
<sect1>
  <title>クロスリファレンス</title>
  <para>クロスリファレンスの例</para>

  <sect2>
    <title>参照元</title>
    <para>こちらから次セクションにクロスリファレンスを張る。参照先: <xref linkend="xref_sect"/></para>
  </sect2>

  <sect2 id="xref_sect">
    <title>Hoge セクション</title>
    <para>次のセクションです。</para>
  </sect2>
</sect1>
出力結果は以下のようになる。「Section 8.2, ..」の部分は内部リンクとなる。
こちらから次セクションにクロスリファレンスを張る。参照先: Section 8.2, “Hoge セクション”

[DocBook]HTML で google-code-prettify を使う

XSL に以下を追加

myDocbook.xsl
<xsl:template name="system.head.content">
  <script type="text/javascript" src="/google-code-prettify/prettify.js"></script>
  <link href="/google-code-prettify/prettify.css" rel="stylesheet" type="text/css"></link>
</xsl:template>
<xsl:template name="body.attributes">
  <xsl:attribute name="onload">prettyprint</xsl:attribute>
</xsl:template>

[DocBook]HTML ヘッダに CSS 追加

XSLT Proessor に渡す XSL ファイルを自分で作成した XSL ファイルを経由するようにする。
その XSL ファイル内に css を指定する

myDocbook.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:import href="/usr/share/sgml/docbook/xsl-stylesheets/xhtml/docbook.xsl"/>
  <xsl:output method="html" encoding="UTF-8" indent="yes"/>
  <xsl:param name="admon.graphics" select="1"/>
  <xsl:param name="section.autolabel" select="1"/>
  <xsl:param name="html.stylesheet">doc.css</xsl:param>
  <xsl:param name="default.encoding" select="'UTF-8'"/>
</xsl:stylesheet>
XSLT Process 実行
$ java -jar /usr/share/java/saxon.jar -s:hello.xml -xsl:myDocbook.xsl -o:helloWithCss.html
Warning: at xsl:stylesheet on line 2 column 80 of sample.xsl:
  Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
/usr/share/sgml/docbook/xsl-stylesheets/xhtml/docbook.xsl を直接指定した場合の出力結果
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Hello, world</title>
    <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"/>
  </head>
(以下略)
myDocbook.xsl を指定した場合の出力結果
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <title>Hello, world</title>
      <link rel="stylesheet" href="doc.css" type="text/css"></link>
      <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"></meta>
   </head>
(以下略)

[DocBook]スタイルファイル (DSL) カスタマイズ

db2html に渡す dsl ファイルを準備する
myStyleSheet.dsl
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY dbstyle SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/docbook.dsl" CDATA DSSSL>
]>

<style-sheet>
<style-specification use="docbook">
<style-specification-body>

;

</style-specification-body>
</style-specification>
<external-specification id="docbook" document="dbstyle">
</style-sheet>

HTML 出力での header に付加される文字コードを指定する
style-spcification-body 部に以下を追記する
(define %html-header-tags% '(
  ("META" ("http-equiv" "Content-Type") ("CONTENT" "text/html; charset=euc-jp"))
))

Table of Contents を付加する
style-specification-body 部に以下を追記する
(define %generate-article-toc%
  #t)

[DocBook]db2html の使い方

出力を 1 つのファイルにする
-V nochunks オプションを付ける
db2html -V nochunks hello.xml

Custom DSL ファイルを使用する
-d オプションで指定する
db2html hello.xml -d myStyleSheet.dsl

[DocBook]Windows で動作確認

  1. sample ディレクトリを作成し、build.xml, sample.xml, sample.xsl doc.css を置く
    • build.xml
      <project name="docbooktest" basedir="." default="xslt">
        <property name="DOCBOOK_DTD" value="c:/usr/docbook/docbook-xml-4.5/docbookx.dtd"/>
        <property name="DOCBOOK_PUBLIC_ID" value="-//OASIS//DTD DocBook XML V4.5//EN"/>
        <property name="XSLDIR" value="c:/usr/docbook/docbook-xsl-1.75.0"/>
        <property name="LIBDIR" value="c:/usr/docbook/xalan-j_2_7_1/build"/>
        <property name="XALANJAR" value="${LIBDIR}/xalan.jar"/>
        <target name="xslt">
          <xmlvalidate warn="false">
            <xmlcatalog>
              <dtd publicId="${DOCBOOK_PUBLIC_ID}"
                   location="${DOCBOOK_DTD}"/>
            </xmlcatalog>
            <fileset dir="${basedir}">
              <include name="sample.xml"/>
            </fileset>
          </xmlvalidate>
          <xslt
            basedir="${basedir}"
            destdir="${basedir}"
            style="${basedir}/sample.xsl"
            extension=".html"
            includes="sample.xml">
            <classpath>
              <pathelement location="${XALANJAR}"/>
            </classpath>
            <xmlcatalog>
              <dtd publicId="${DOCBOOK_PUBLIC_ID}"
                   location="${DOCBOOK_DTD}"/>
            </xmlcatalog>
          </xslt>
        </target>
      
        <target name="all" depends="xslt"/>
          <target name="clean">
            <delete file="sample.html"/>
          </target>
      </project>
    • sample.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
      <article>
        <title>DocBook sample</title>
        <sect1>
          <title>Hello World</title>
          <para>Hello World</para>
        </sect1>
        <sect1>
    • sample.xsl
      <?xml version="1.0"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:import href="../docbook-xsl-1.75.0/html/docbook.xsl"/>
        <xsl:output method="html" encoding="UTF-8" indent="yes"/>
        <xsl:param name="admon.graphics" select="1"/>
        <xsl:param name="section.autolabel" select="1"/>
        <xsl:param name="html.stylesheet">doc.css</xsl:param>
        <xsl:param name="default.encoding" select="'UTF-8'"/>
      </xsl:stylesheet>
    • doc.css
      H1.title {
         padding: 5px 5px 5px 10px;
         border-left: 10px solid blue;
         border-bottom: 2px solid blue;
      }
      
      H2.title {
         padding: 3px 3px 3px 5px;
         border-left: 5px solid blue;
         border-bottom: 2px solid blue;
      }
      
      H3.title {
         padding: 3px 3px 3px 5px;
         border-left: 5px solid blue;
         border-bottom: 1px solid blue;
      }
      
      H4.title {
         padding: 3px 3px 3px 5px;
         border-left: 5px solid blue;
         border-bottom: 1px solid blue;
      }
      
      
      DIV.article {
          margin: 30px 30px 30px 30px;
      }
      
      DIV.caution {
         background: #FFCCCC;
      }
      DIV.important {
         background: #FFCCCC;
      }
      DIV.note {
         background: #CCCCFF;
      }
      DIV.tip {
         background: #CCCCFF;
      }
      DIV.warning {
         background: #FFCCCC;
      }
      
      PRE.programlisting {
         border-width: 1ex;
         border-color: blue;
         border-style: solid;
         color: white;
         background-color: blue;
      }
      
      PRE.screen {
         border-width: 1ex;
         border-color: black;
         border-style: solid;
         color: white;
         background-color: black;
      }
      
      BODY {
         font-family: gill, helvetica, sans-serif;
         font-size: 12pt;
      }
  2. sample ディレクトリ内で ant を実行し build を行う

[DocBook]Fedora13 で動作確認

  1. sampleBook.xml を作成する
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE book PUBLIC "-//OASIS/DTD DocBook XML V4.5//EN"
    "/usr/share/sgml/docbook/xml-dtd-4.5/docbookx.dtd">
    
    <book>
      <bookinfo>
        <title>Hello, world</title>
      </bookinfo>
    
      <chapter>
        <title>Hello, world</title>
        <para>This is my first DocBook file.</para>
        <para>日本語表示</para>
      /chapter>
    </book>
  2. html 出力
    $ db2html docbook.xml
    output is docbook
    Using catalogs: /etc/sgml/xml-docbook-4.5.cat
    Using stylesheet: /usr/share/sgml/docbook/utils-0.6.14/docbook-utils.dsl#html
    Working on: docbook.xml
    
    (略)
    jade:/usr/share/sgml/docbook/xml-dtd-4.5/ent/isogrk4.ent:84:30:E: "1D6C7" は文書文字セット内の文字番号ではありません
    jade:sampleBook.xml:13:9:E: 非SGML数字 151
    jade:sampleBook.xml:13:12:E: 非SGML数字 156
    jade:sampleBook.xml:13:16:E: 非SGML数字 158
1 行目の文字コード指定で encoding="UTF-8" とすると jade が日本語文字を "非SGML数字" としてエラー出力する。文章が長くなってくるとエラーが多すぎて処理が途中停止してしまう。
これを防ぐには encoding="EUC-JP" とすればよいのだが、出力 HTML では文字コードが指定されていないので Web ブラウザで表示すると文字化けとなる。Web ブラウザの文字コード設定で EUC-JP を選択すると見れるようになる。
出力 HTML の文字コード指定方法は調査中。

[DocBook]Windows へのインストール

必要なもの (各バージョンは 2009/5/15 時のもの)
  • Java
  • Ant
  • Xalan-j
  • DocBook DTD
  • DocBook Style Sheet

Xalan-j インストール
  1. Index of /net/apache/xml/xalan-j から xalan-j_2_7_1-src.zip をダウンロードする
  2. C:\usr\docbook に xalan-j_2_7_1-src.zip を置き解凍する
  3. xalan ディレクトリで Ant を実行し build を行う

DocBook DTD, DocBook Style Sheet インストール
  1. DocBook Release から docbook-xml-4.5.zip をダウンロードする
  2. DocBook - Browse Files at SourceForge.net から docbook-xsl-1.75.0.zip をダウンロードする
  3. ダウンロードしたファイルを C:\usr\docbook に置き、解凍する

[DocBook]Linux Mint 12 へのインストール

  1. DocBook をインストール
    1. Menu -> その他 -> ソフトウェアの管理
    2. 右上の検索窓に docbook と入力
    3. docbook を選択
    4. [インストール] ボタンを押す
    5. 検索結果に戻り docbook-xsl を選択
    6. [インストール] ボタンを押す
    7. 検索結果に戻り docbook-xsl-doc-html を選択
    8. [インストール] ボタンを押す
  2. Java JDK をインストール
    tools.jar が必要なので Java JDK をインストールする
    1. Menu -> その他 -> ソフトウェアの管理
    2. 右上の検索窓に java と入力
    3. sun-java6-jdk を選択
    4. [インストール] ボタンを押す
  3. Saxon をインストール
    1. Menu -> その他 -> ソフトウェアの管理
    2. 右上の検索窓に saxon と入力
    3. docbook-xsl-saxon を選択
    4. [インストール] ボタンを押す

注意点
Linux Mint の場合は Fedora と異なり以下の修正が必要
  • xsl ファイルで指定する xsl:import は Fedora の場合
    <xsl:import href="/usr/share/sgml/docbook/xsl-stylesheets/xhtml/docbook.xsl"/>
    となっているが、Linux Mint の場合は以下のようにする
    <xsl:import href="/usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml/docbook.xsl"/>
  • build.xml および各文章 xml ファイルの DTD 指定が Fedora では
    /usr/share/sgml/docbook/xml-dtd-4.5/docbookx.dtd
    になっているが、Linux Mint では以下のようにする
    /usr/share/sgml/docbook/dtd/xml/4.5/docbookx.dtd
  • build.xml にある以下の記述も Linux Mint では不要
    <factory name="net.sf.saxon.TransformerFactoryImpl"/>

[DocBook]Fedora13 へのインストール

  1. DocBook 関連ツールをインストール
    # yum install docbook-*