- - PR -
FOPでのLFを改行出力したい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2002-12-18 16:48
お世話になります。
FOP0.20.4を使って、 XML→FO→PDF を作成するプログラムを作っています。 ■質問 FOPでブロック内のLFを改行として出力したいのですが、 方法をご存知でしたら教えていただけないでしょうか? ■例 <fo:block> hoge1 hoge2 </fo:block> ↓ ■期待結果 hoge1 hoge2 ■現状の結果 hoge1 hoge2 ■補足 linefeed-treatment="preserve" プロパティーは効きませんでした。 最近fop-0.20.5rc出たみたいですね。 |
|
投稿日時: 2002-12-19 12:57
私も昔はまったことがありまして、↓に対策方法を書き込みしました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1865&forum=9 たぶんこれでいいと思いますよー。 |
|
投稿日時: 2002-12-19 15:03
小僧さん
回答ありがとうございます。 過去ログの方興味深く読ませていただきました。 全角と半角での改行、折り返しの情報、大変役立ちました。 ところで、 <fo:block/>で改行コードを改行を入れる場合、 XML→FO変換のXSLで置換or挿入を行うんですよね。 この場合、 #テキスト要素のLF(\n)を<fo:block/>に変換する ってどうやるものでしょうか? translate()もちょっと試してみたのですが、 うまくいきませんでした。 ちょっとはまっています。 よろしくお願いします。 |
|
投稿日時: 2002-12-19 16:19
私も例外無くはまりましたが、関数ではできないんですよこれが。
call-templateを再帰関数のように使うとできます。 1行当たりの文字数を制限しているコードが手元にあるので、 参考にしてください。文字数制限の部分をcontains()関数に置き かえれば使えると思いますよ。 ------------------------------------------------------ <!--文字列に改行コード付加する処理--> <xsl:template name="InsertLineBreak"> <!--変換対象文字列--> <xsl:param name="value" select="''"/> <!--1行の文字数--> <xsl:param name="width" select="8"/> <xsl:choose> <xsl:when test="string-length($value) < $width"> <xsl:value-of select="$value"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring($value,1,$width)"/> <fo:block white-space-collapse="false"> </fo:block> <!--再起呼び出し--> <xsl:call-template name="InsertLineBreak"> <xsl:with-param name="width" select="$width"/> <xsl:with-param name="value" select="substring($value,1 + $width,string-length($value))"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> ------------------------------------------------------ 全角半角の文字数を1文字としてカウントするのって、英語圏以外 の国にとっては、かなり辛いっすよ。後から書きかえることの出来 ない変数ってのも納得いかないし。まだまだ人に優しくないね、 XSLTって。 |
|
投稿日時: 2002-12-19 22:05
小僧さん、貴重なサンプルありがとうございます。
指定したテキストと、MAX文字数に対して折り返し処理を行うことができました。 やけくそに長い連続半角データをFOPでPDFに変換すると、 Acrobat Readerで開けない(データが複雑すぎて読めませんとか出る)という問題が これで解決できます。 実はもう一つ解決したい問題がありまして、 というのは、 #XMLのテキスト中の改行コードをPDF上でも改行にしたい というものです。 テキスト中のLFを<fo:block/>に置換できれば可能だと思うんですが、 まだXSLTの経験も浅く、いきづまっている状態です。 アイデアや方法をご存知でしたら、 教えていただけないでしょうか? よろしくお願いします。 >全角半角の文字数を1文字としてカウントするのって、英語圏以外 >の国にとっては、かなり辛いっすよ。後から書きかえることの出来 >ない変数ってのも納得いかないし。まだまだ人に優しくないね、 >XSLTって。 ブロックに流し込むだけで、自動的に折り返し改行してくれる時代 に早くなってほしいものです。 変数は最初とても混乱しました。 変更できないのに変数っていう名前も変ですよね。 |
|
投稿日時: 2002-12-19 23:16
>参考にしてください。文字数制限の部分をcontains()関数に置き
>かえれば使えると思いますよ。 こ、これではだめっすかねー。試してみてねー。 (^^;) |
|
投稿日時: 2002-12-20 11:22
すみません。努力を怠っていたようです(汗)
教えていただいたInsertLineBreakに以下のようにcontains条件を追加することで、 改行文字があれば、そこで改行することができました。 ・・・ <xsl:choose> <xsl:when test="contains($value,' ')"> <xsl:value-of select="substring-before($value,' ')"/> <fo:block white-space-collapse="false"> </fo:block> <xsl:call-template name="InsertLineBreak"> <xsl:with-param name="width" select="$width"/> <xsl:with-param name="value" select="substring-after($value,' ')"/> </xsl:call-template> </xsl:when> <xsl:when test="string-length($value) < $width"> <xsl:value-of select="$value"/> </xsl:when> ・・・ 小僧さん、度々ありがとうございます。 今回の件では大変助かりました。 |
1