- PR -

FOPでのLFを改行出力したい

1
投稿者投稿内容
みやも
ベテラン
会議室デビュー日: 2002/04/22
投稿数: 74
投稿日時: 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/08/14
投稿数: 526
投稿日時: 2002-12-19 12:57
私も昔はまったことがありまして、↓に対策方法を書き込みしました。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1865&forum=9

たぶんこれでいいと思いますよー。
みやも
ベテラン
会議室デビュー日: 2002/04/22
投稿数: 74
投稿日時: 2002-12-19 15:03
小僧さん
回答ありがとうございます。

過去ログの方興味深く読ませていただきました。
全角と半角での改行、折り返しの情報、大変役立ちました。

ところで、
<fo:block/>で改行コードを改行を入れる場合、
XML→FO変換のXSLで置換or挿入を行うんですよね。

この場合、
#テキスト要素のLF(\n)を<fo:block/>に変換する
ってどうやるものでしょうか?

translate()もちょっと試してみたのですが、
うまくいきませんでした。

ちょっとはまっています。
よろしくお願いします。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 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) &lt; $width">
<xsl:value-of select="$value"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring($value,1,$width)"/>
<fo:block white-space-collapse="false">&#10;</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/04/22
投稿数: 74
投稿日時: 2002-12-19 22:05
小僧さん、貴重なサンプルありがとうございます。

指定したテキストと、MAX文字数に対して折り返し処理を行うことができました。
やけくそに長い連続半角データをFOPでPDFに変換すると、
Acrobat Readerで開けない(データが複雑すぎて読めませんとか出る)という問題が
これで解決できます。

実はもう一つ解決したい問題がありまして、
というのは、
#XMLのテキスト中の改行コードをPDF上でも改行にしたい
というものです。

テキスト中のLFを<fo:block/>に置換できれば可能だと思うんですが、
まだXSLTの経験も浅く、いきづまっている状態です。

アイデアや方法をご存知でしたら、
教えていただけないでしょうか?
よろしくお願いします。


>全角半角の文字数を1文字としてカウントするのって、英語圏以外
>の国にとっては、かなり辛いっすよ。後から書きかえることの出来
>ない変数ってのも納得いかないし。まだまだ人に優しくないね、
>XSLTって。

ブロックに流し込むだけで、自動的に折り返し改行してくれる時代
に早くなってほしいものです。

変数は最初とても混乱しました。
変更できないのに変数っていう名前も変ですよね。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-12-19 23:16
>参考にしてください。文字数制限の部分をcontains()関数に置き
>かえれば使えると思いますよ。

こ、これではだめっすかねー。試してみてねー。
(^^;)
みやも
ベテラン
会議室デビュー日: 2002/04/22
投稿数: 74
投稿日時: 2002-12-20 11:22
すみません。努力を怠っていたようです(汗)

教えていただいたInsertLineBreakに以下のようにcontains条件を追加することで、
改行文字があれば、そこで改行することができました。

・・・
  <xsl:choose>

   <xsl:when test="contains($value,'&#10;')">
    <xsl:value-of select="substring-before($value,'&#10;')"/>

    <fo:block white-space-collapse="false">&#10;</fo:block>

    <xsl:call-template name="InsertLineBreak">
     <xsl:with-param name="width" select="$width"/>
     <xsl:with-param
      name="value"
      select="substring-after($value,'&#10;')"/>
    </xsl:call-template>
   </xsl:when>

   <xsl:when test="string-length($value) &lt; $width">
    <xsl:value-of select="$value"/>
   </xsl:when>
・・・

小僧さん、度々ありがとうございます。
今回の件では大変助かりました。

1

スキルアップ/キャリアアップ(JOB@IT)