2009年4月23日木曜日

DocBook,FOP,ビルド

いろいろいじくった挙句の DocBook -> fo -> PDF まで一括で行うbuild.xml

-----------------------------------------------

<project name="docbooktest" basedir="." default="pdf">

<property name="LIBDIR" value="D:/DocBook"/>
<property name="DOCBOOK_DTD" value="${LIBDIR}/xml-4.5/docbookx.dtd"/>
<property name="XSLTLIBDIR" value="${LIBDIR}/xalan-j_2_7_1"/>
<property name="FOPBASEDIR" value="${LIBDIR}/fop-0.95"/>
<property name="FOPOPT" value="-c ${FOPBASEDIR}/conf/JFConf.xml"/>

<property name="DOCBOOK_PUBLIC_ID" value="-//OASIS//DTD DocBook XML V4.5//EN"/>

<property name="STYLESHEET" value="${LIBDIR}/docbook-xsl-1.74.3/fo/docbook.xsl"/>

<!-- ********************************************************** -->
<!-- **** コメントなどに日本語を使うならUTF8で保存すること **** -->
<!-- ********************************************************** -->

<property name="DOCNAME" value="sourceDocs"/>

<!--
property name="SOURCE" value="${basedir}/sourceDocs.xml"/ <= この書き方だとだめ
-->
<property name="SOURCE" value="${DOCNAME}.xml"/>


<!-- ********************************************************** -->

<taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop">
<classpath>
<fileset dir="${FOPBASEDIR}/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${FOPBASEDIR}/build/fop.jar"/>
</classpath>
</taskdef>

<!-- ********************************************************** -->

<target name="fo">

<xmlvalidate warn="false">

<xmlcatalog>
<dtd publicId="${DOCBOOK_PUBLIC_ID}" location="${DOCBOOK_DTD}"/>
</xmlcatalog>
<fileset dir="${basedir}">
<include name="${SOURCE}"/>
</fileset>
</xmlvalidate>

<xslt basedir="${basedir}"
destdir="${basedir}"
style="${STYLESHEET}"
extension=".fo"
includes="${SOURCE}">

<classpath>
<pathelement location="${XSLTLIBDIR}/xalan.jar"/>
</classpath>
<xmlcatalog>
<dtd publicId="${DOCBOOK_PUBLIC_ID}" location="${DOCBOOK_DTD}"/>
</xmlcatalog>

<outputproperty name="method" value="xml"/>
<outputproperty name="encoding" value="UTF-8"/>
<outputproperty name="indent" value="yes"/>

<!-- param name="admon.graphics" expression="1"/ -->
<!-- param name="section.autolabel" expression="1"/ -->
<!-- param name="html.stylesheet" expression="doc.css"/ -->

</xslt>

</target>

<target name="pdf" depends="fo">

<!--

<java classname="org.apache.fop.cli.Main" fork="true">

<jvmarg line="-Denv.windir=C:\WINDOWS"/>
<arg line="${FOPOPT} -fo ${DOCNAME}.fo -pdf ${DOCNAME}.pdf"/>

<classpath>
<pathelement location="${FOPBASEDIR}/build/fop.jar"/>
<pathelement location="${FOPBASEDIR}/build/fop-sandbox.jar"/>
<pathelement location="${FOPBASEDIR}/build/fop-hyph.jar"/>
<pathelement location="${FOPBASEDIR}/lib/xml-apis-1.3.04.jar"/>
<pathelement location="${FOPBASEDIR}/lib/xml-apis-ext-1.3.04.jar"/>
<pathelement location="${FOPBASEDIR}/lib/xercesImpl-2.7.1.jar"/>
<pathelement location="${FOPBASEDIR}/lib/xalan-2.7.0.jar"/>
<pathelement location="${FOPBASEDIR}/lib/serializer-2.7.0.jar"/>
<pathelement location="${FOPBASEDIR}/lib/batik-all-1.7.jar"/>
<pathelement location="${FOPBASEDIR}/lib/xmlgraphics-commons-1.3.1.jar"/>
<pathelement location="${FOPBASEDIR}/lib/avalon-framework-4.2.0.jar"/>
<pathelement location="${FOPBASEDIR}/lib/commons-io-1.3.1.jar"/>
<pathelement location="${FOPBASEDIR}/lib/commons-logging-1.0.4.jar"/>
<pathelement location="${FOPBASEDIR}/lib/jai_imageio.jar"/>
<pathelement location="${FOPBASEDIR}/lib/fop-hyph.jar"/>
</classpath>

</java>

-->

<fop format="application/pdf"
basedir="${basedir}"
outdir="${basedir}"
messagelevel="debug"
userconfig="${FOPBASEDIR}/conf/JFConf.xml">

<fileset dir="${basedir}">
<include name="${DOCNAME}.fo"/>
</fileset>

</fop>

</target>

</project>

-----------------------------------------------

コメントアウトした部分はFOPの起動バッチを参考にした場合。この場合は fork="true" 設定をしないと駄目だった。セキュリティとかクラスローダとかの関係らしいが、よくわからない。

ant から呼び出す場合は専用のクラスが準備されているのでそちらを利用する。

2009年4月21日火曜日

FOP

http://ja.wikipedia.org/wiki/XSL_Formatting_Objects
http://ja.wikipedia.org/wiki/Apache_FOP
http://nanasi.jp/articles/others/fop.html
http://www.sm.u-tokai.ac.jp/~sugita/xml/japanese.html
http://xmlgraphics.apache.org/fop/

---------------------------------------------

そのままでは日本語が表示できないのでフォント設定を行う

http://www.02.246.ne.jp/~torutk/fop/fop4sdoc.html
http://www.nslabs.jp/apache_fop.rhtml
http://d.hatena.ne.jp/ditahack/20090331/1238513240
http://d.hatena.ne.jp/mitsu48/
http://liosk.blog103.fc2.com/blog-entry-71.html

手順(1) MSゴシック/MS明朝のフォント名を調べる

コマンドプロンプトより

java -cp ../build/fop.jar;../lib/commons-io-1.3.1.jar;../lib/commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader c:/windows/Fonts/msmincho.ttc msmincho.xml
java -cp ../build/fop.jar;../lib/commons-io-1.3.1.jar;../lib/commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader c:/windows/Fonts/msgothic.ttc msgothic.xml

すると下記のような形でエラーと共にフォント名(ttcname)を表示してくれる。

D:\DocBook\fop-0.95\JFonts>java -cp ../build/fop.jar;../lib/commons-io-1.3.1.jar;../lib/commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader c:/windows/Fonts/msmincho.ttc msmincho.xml
TTF Reader for Apache FOP 0.95

Parsing font...
Reading c:/windows/Fonts/msmincho.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
MS Mincho
MS PMincho
Error while building XML font metrics file.
java.lang.IllegalArgumentException: For TrueType collection you must specify which font to select (-ttcname)


手順(2) フォントメトリクスファイルを作成する

上記の手順で得たフォント名をコマンドラインに追加して実行

java -cp ../build/fop.jar;../lib/commons-io-1.3.1.jar;../lib/commons-logging-1.0.4.jar;../lib/xmlgraphics-commons-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "MS Mincho" c:/windows/Fonts/msmincho.ttc msmincho.xml
java -cp ../build/fop.jar;../lib/commons-io-1.3.1.jar;../lib/commons-logging-1.0.4.jar;../lib/xmlgraphics-commons-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "MS Gothic" c:/windows/Fonts/msgothic.ttc msgothic.xml

※必要なクラスライブラリが増えている


手順(3) フォントメトリクスファイルを修正する

TTFReader にはバグがあって、msmincho.xml / msgothic.xml ないのフォントファミリ名の部分が文字化けしているのでそれぞれ MS 明朝 MS ゴシック に修正する。


手順(4) ユーザコンフィグファイルの作成

fop の conf フォルダに fop.xconf というファイルがあるが、これはただのサンプルファイル。
これをベースにユーザコンフィグファイル JFConf.xml を作成する(ファイル名はxmlファイルあるなら何でもかまわない)

<?xml version="1.0" ?>
<fop version="1.0">
<renderers>
<renderer mime="application/pdf">
<fonts>
<font metrics-url="D:\DocBook\fop-0.95\JFonts\msmincho.xml" kerning="yes" embed-url="C:\windows\Fonts\msmincho.ttc">
<font-triplet name="MS-Mincho" style="normal" weight="normal"/>
<font-triplet name="MS-Mincho" style="normal" weight="bold"/>
<font-triplet name="MS-Mincho" style="italic" weight="normal"/>
<font-triplet name="MS-Mincho" style="italic" weight="bold"/>
<font-triplet name="MSMincho" style="normal" weight="normal"/>
<font-triplet name="MSMincho" style="normal" weight="bold"/>
<font-triplet name="MSMincho" style="italic" weight="normal"/>
<font-triplet name="MSMincho" style="italic" weight="bold"/>
<font-triplet name="Mincho" style="normal" weight="normal"/>
<font-triplet name="Mincho" style="normal" weight="bold"/>
<font-triplet name="Mincho" style="italic" weight="normal"/>
<font-triplet name="Mincho" style="italic" weight="bold"/>
<font-triplet name="MS明朝" style="normal" weight="normal"/>
<font-triplet name="MS明朝" style="normal" weight="bold"/>
<font-triplet name="MS明朝" style="italic" weight="normal"/>
<font-triplet name="MS明朝" style="italic" weight="bold"/>
<font-triplet name="serif" style="normal" weight="normal"/>
<font-triplet name="serif" style="normal" weight="bold"/>
<font-triplet name="serif" style="italic" weight="normal"/>
<font-triplet name="serif" style="italic" weight="bold"/>
</font>
<font metrics-url="D:\DocBook\fop-0.95\JFonts\msgothic.xml" kerning="yes" embed-url="C:\windows\Fonts\msgothic.ttc">
<font-triplet name="MS-Gothic" style="normal" weight="normal"/>
<font-triplet name="MS-Gothic" style="normal" weight="bold"/>
<font-triplet name="MS-Gothic" style="italic" weight="normal"/>
<font-triplet name="MS-Gothic" style="italic" weight="bold"/>
<font-triplet name="MSGothic" style="normal" weight="normal"/>
<font-triplet name="MSGothic" style="normal" weight="bold"/>
<font-triplet name="MSGothic" style="italic" weight="normal"/>
<font-triplet name="MSGothic" style="italic" weight="bold"/>
<font-triplet name="Gothic" style="normal" weight="normal"/>
<font-triplet name="Gothic" style="normal" weight="bold"/>
<font-triplet name="Gothic" style="italic" weight="normal"/>
<font-triplet name="Gothic" style="italic" weight="bold"/>
<font-triplet name="MSゴシック" style="normal" weight="normal"/>
<font-triplet name="MSゴシック" style="normal" weight="bold"/>
<font-triplet name="MSゴシック" style="italic" weight="normal"/>
<font-triplet name="MSゴシック" style="italic" weight="bold"/>
<font-triplet name="sans-serif" style="normal" weight="normal"/>
<font-triplet name="sans-serif" style="normal" weight="bold"/>
<font-triplet name="sans-serif" style="italic" weight="normal"/>
<font-triplet name="sans-serif" style="italic" weight="bold"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>


手順(5) サンプル実行

テストファイル JFT2.fo

<fo:root fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master name="PageMaster">
<fo:region-body top="3cm">
</fo:region-body>
</fo:simple-page-master>
<fo:page-sequence reference="PageMaster">
<fo:flow name="xsl-region-body">
<fo:block size="18pt" align="center">
Hello: XSL-FO to PDF 日本語フォントはどうか?
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:layout-master-set>

コマンドラインより

..\fop -c D:\DocBook\fop-0.95\conf\JFConf.xml -fo JFT2.fo -pdf a.pdf

と実行する。

2009年4月15日水曜日

Xalan と JavaSDK

いろいろ資料を眺めてみる。すると、JDK 1.4 以上には既にXalanはライブラリに組み込まれているという。なんてこったい!

すると、あのサンプルはJDKライブラリで実行したものなのか、ダウンロードしたXalanで実行したものなのか?

http://www.utj.co.jp/xml/dev/java/dxjava_2.html
http://tsumatec.blogspot.com/2005/10/xalan.html
http://www.nextindex.net/java/XML/Xalan.html

---------------------------

いろいろ調べてみた。
サンプルの build.xml にXSLTプロセッサへのクラスパス定義があり、そこにダウンロードしたXalanへのパスを書いていた。

(1) build.xml のクラスパスを削除して実行
(2) 環境変数classpath からXalanへのパスを削除
(3) (1)(2) 両方を行う

の三パターンでサンプルを実行してみた。
結果、(1)(2)では正常に動作した(っぽい)が、(3) ではエラーが吐き出された。

D:\DocBook\sample1>ant
Buildfile: build.xml

xslt:
[xmlvalidate] 1 file(s) have been successfully validated.
[xslt] Transforming into D:\DocBook\sample1
[xslt] Processing D:\DocBook\sample1\artsample.xml to D:\DocBook\sample1\artsample.html
[xslt] Loading stylesheet D:\DocBook\sample1\sample.xsl
[xslt] : Warning! file:/D:/DocBook/docbook-xsl-1.74.3/html/autoidx.xsl: line 476: 属性 'href' がエレメントの外側です。
[xslt] : Warning! file:/D:/DocBook/docbook-xsl-1.74.3/html/autoidx.xsl: line 514: 属性 'href' がエレメントの外側です。
[xslt] : Warning! file:/D:/DocBook/docbook-xsl-1.74.3/html/autoidx.xsl: line 537: 属性 'href' がエレメントの外側です。
         :
         :
         :
        (略)

てな具合で、DocBookスタイルシートに対してエラーを吐いているようだ。

ついでに

import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class test {

public static void main(String[] args) {

try {

TransformerFactory trfactory = TransformerFactory.newInstance();
Transformer t = trfactory.newTransformer( new StreamSource(args[0]) );

String s = t.toString();

System.out.printf( s );

} catch(Exception e) {

e.printStackTrace();
}
}
}

こんなプログラムをclasspath環境変数でxalanを指定してある状態、ない状態で実行したところ、ある方は

D:\DocBook\test>java test sample.xsl
org.apache.xalan.transformer.TransformerImpl@16fd0b7

ない方は

D:\DocBook\test>java test sample.xsl
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl@503429

と吐き出した。


つまり
(1) SDK(うちのは1.6.0_13)にXalanは含まれる?
(2) 但し、必ずしも最新というわけでもない
(3) classpath指定があればそちらを優先する。

上記参考サイトによるとclasspath指定よりデフォルトライブラリ優先とあったのだが・・・仕様が変わったのだろうか?


付記

xalan のバージョン確認は

java org.apache.xalan.Version

でも良い(こちらの方が新しいやりかた?)


付記2

SDK1.5以上には Xalanは含まれない、という記述も見かけた。

2009年4月11日土曜日

100回突破

4/10 に100回突破
週100回ペースなら2年弱でタイトル取れる計算になるが、きっついわ・・・

次は累積500回が目標(目標は5/9)

2009年4月8日水曜日

Ant

http://members.at.infoseek.co.jp/pokopensjant/j/docs/manual/index.html
http://terai.xrea.jp/Ant.html

導入手順
1.アーカイブをダウンロードし、任意のフォルダに展開する
2.下記の三つの環境変数を設定する

ANT_HOME=c:\ant
JAVA_HOME=c:\jdk1.2.2
PATH=%PATH%;%ANT_HOME%\bin

ANT_HOMEはantを展開したディレクトリ、
JAVA_HOMEはJDK を展開したディレクトリ
PATHにはantを展開したディレクトリの中のbin ディレクトリへのパスを追加する

Xalan:追記

参考 http://mozjp.hp.infoseek.co.jp/study/java_xalanworking.pdf

だが、ネットのファイルはいつ消えてもおかしくないので要約を控えておく。

1.最新のJDKを導入する。インストーラーを起動し、画面指示に従う。
2.Xalanをダウンロード、アーカイブを展開する。
3.Windows環境変数 PathにJDKのパスを設定する。 注:システム環境変数の戦闘に設定すること。
4.Windows環境変数 ClassPathにXalan各ファイルへのパスを設定する。 注:システム環境変数の戦闘に設定すること。

例: C:¥xalan-j_2_7_1¥xml-apis.jar;C:¥xalan-j_2_7_1¥xercesImpl.jar;C:¥xalan-j_2_7_1¥xalan.jar;

5.サンプルを実行してみる

C:\>cd C:\xalan-j_2_7_1\samples\SimpleTransform
C:\xalan-j_2_7_1\samples\SimpleTransform>javac SimpleTransform.java
C:\xalan-j_2_7_1\samples\SimpleTransform>java SimpleTransform
************* The result is in birds.out *************
C:\xalan-j_2_7_1\samples\SimpleTransform>

サンプルのjavaプログラムをコンパイル実行し、おかしなエラーが出なければok

2009年4月6日月曜日

Xalan

1.Java6の導入

インストーラーをダブルクリック、以後画面の指示に従う。
どうやら古い版のJava環境があると一掃してくれるらしい。
便利と言えば便利だし、仕方ないといえば仕方ないのだろうけれど、知らぬところで環境をいじくり回されるのは好きではない。


2.Xalanの導入

参考 http://mozjp.hp.infoseek.co.jp/study/java_xalanworking.pdf

インストーラーをダブルクリック、だけでもjavaは起動する。でもpathは設定されていない。どうやらwindows\system32 にランタイムだけコピーされているらしい。
java.exeは

C:\Program Files\Java\jdk1.6.0_13\bin
C:\Program Files\Java\jre6\bin
C:\windows\system32

と、都合三箇所にコピーされているようだ(ちょいと面白くない)。
とりあえず、参考資料どおりにpathを通し、Xalanのサンプルが動作することを確認。


(注意)Path/Classpath設定は、システム環境変数に設定する(ユーザではない)。

2009年4月5日日曜日

6人目

メイン垢につくった6人目
基本は倉庫だが、どうするか考えた挙句、勤勉王タイトルを狙ってみよう、などと考えた。
二年で取れれば御の字・・・

キャラ作成2008/4/4
トライ開始2008/4/5

2009年4月1日水曜日

DocBookで必要なもの

DocBook にて必要なもの

(参考)http://www.ii-okinawa.ne.jp/~hrk/docbook/tutorial/doc.html






J2SE (1.4以上)現在の最新は1.6.0_13
ant現在の最新は1.7.1
Xalan現在の最新は2.7.1
DocBook DTDSchemas よりXML DTD 4.x系の最新(現在は4.5)
DocBook スタイルシートdocbook-xsl の最新版(現在1.74.3)

・・・・うんざりである

※DocBookスキーマの最新は5.x 系列だが、こちらはRELAXER NGメインで記述されており、他方、Xalan(Xerces)はRELAXER NGを解さない。XML DTDで記述された5.x 系列スキーマも存在するが、とりあえず4.x系列で試してみようかと思う

DITA

Darwin Information Typing Architecture = DITA

DocBookと類似のもの

http://www.antenna.co.jp/XML/dita.html
http://www.antenna.co.jp/XML/archspec-ja.html


類似といったらめちゃ怒られそうな気もする。
DocBookは一冊の(もしくは一つの)ドキュメントを多種多様のフォーマットに変換するための技術。PDFかHTMLか、というフォーマットの違いはあっても作成される内容は(多分、基本的には)同一。

DITAは個々の独立した小さな文章(トピックと呼ぶ)をばらばらに作成し、それを繋ぎ合わせて一つの文章に纏め上げる、というシステム。一群のトピックから操作説明書だの仕様書だのリファレンスだの内容に強い関連性はあるが異なるドキュメント群を生成するのに使う技術。


DITAというのも面白そうだが、今はまだ手出しするには早い。記録を残すだけにとどめる。

DocBook

本家 http://www.docbook.org/

    http://www.dear-jpn.com/main/2007/10/docbook.html
    http://yoshihiro.toda.name/docbook/docs/howto/
    http://neverbird.sourceforge.jp/articles/docbook-intro.html

そもそもの目的はDocBookでドキュメント(仕様書など)を作るには、ということ。

現在MSWordやExcelなどを使っているが、どうにも使いづらい。
周囲の人に聞いても使いやすい、という返事が来たことはないし、これは、という文書(書式)にも出あった事がない。あるいはこの世のどこかに素晴らしい文書(書式)作成例が存在しているのかも知れないが、あまり見かけない--ということはWordで技術文書を作るのは結構困難、ということではないだろうか。
(MS内部の技術文書作成管理はどうなってるのか知りたいものだ)

だがこれはMSの罪、というわけばかりでもなかろう。WordやExcelは汎用性を追い求めすぎ、機能が複雑になりすぎている。必要な機能がどこに埋もれてるのか判らなかったり、引っ張り出すまでに多くの操作やら設定やらが必要だったり、要らん機能がでしゃばってきたり。
使いこなせればあるいは・・・かもしれないが、当方はWordのエキスパートになりたいんじゃない。必要最低限の努力で文書を書きたいだけなのだ。

なんとかならんかなぁ、でいろいろ検索した結果たどり着いたのがDocBook。
DocBookはワープロの類ではない。wikiによれば「DocBookは技術文書のためのマークアップ言語、ただの規格である。
XML型式でDocBookの規格に従った型式で文章を書き、XSLTにより変換をかけることによりHTML・XSL-FO・PDFなど多種多様な書式で出力することが出来る・・・・・ということになっている。

最終的には紙に印刷した文書を作成することを目的としているので、手順としては

DocBook文書作成 → [XSLT] → XSL-FO型式文書 → [フォーマッティング] → PDF型式文書 → [印刷] → [紙]

という手順になるようだ。
二回変換しなければならず、ざっと検索してみるけれどまとまった日本語資料も多くない、変換ツールの導入だけでも一苦労、おそらく日本語フォントの問題も大有り、で、OFFICEのエキスパートになったほうが早いんじゃないかと思えなくもない。

とりあえずぼちぼち調べてみようかと思う。

リンク集

SQLite

http://www.3rd-impact.net/Document/SQLite/Translation/Current/

リンク集

WSH リファレンス

http://wsh.style-mods.net/

http://www.wmifun.net/