画像をオーバーフローさせずにページに収める.(1)

以前横幅の大きな画像を左インデントを考慮してページ右端までに収めるXSL-FOのコーディングを紹介したことがあります.それは、画像をfo:block-containerで囲んで、fo:external-graphicにcontent-width="scale-down-to-fit", width="100%"を指定するものでした.

fo:external-graphic

この時は次のようなFOを生成していました.

<fo:block-container border="2pt red solid">
    <fo:block text-align="center" start-indent="0mm">
        <fo:external-graphic src="url(hakumokuren.jpg)" 
                             content-width="scale-down-to-fit" 
                         width="100%"/>
    </fo:block>
</fo:block-container>

しかしこれではまずい現象が発生してしまいました.画像が十分小さい場合でも、テーブルに入れて横並びにさせると、テーブルの行は横幅いっぱいに広がってしまうからです.これはwidth="100%"を指定していることによります.width="100%"指定で、画像の幅にかかわらずテーブルのセルが目いっぱいに広がってしまうのです.このようにならないようにするにはwidth="100%"をmax-width="100%"に変更します.これで画像が大きい場合にのみ広がってくれます.

イメージ 1


<fo:block-container border="2pt red solid">
    <fo:block text-align="center" start-indent="0mm">
        <fo:external-graphic src="url(hakumokuren.jpg)" 
                             content-width="scale-down-to-fit" 
                         max-width="100%"/>
    </fo:block>
</fo:block-container>

例えばセルに幅指定をした場合もうまく収まってくれます.次の例の麦の写真とバイクの写真は両方ともページには到底収まらない大きなサイズですが、セル幅の指定に従ってその最大幅を限度に広まってくれます.

イメージ 2


話のオマケですが、ページの縦方向にも収まらない画像が出てきた場合はどのようにするのでしょう?これは一癖も二癖もありました.その(2)で紹介したいと思います.