第15章 iText PDF 生成

Seam には iText を使ったドキュメント生成用のコンポーネントセットが含まれるようになります。 Seam の iText ドキュメントサポートで主に焦点を置いているのは PDF の生成ですが、 Seam は RTF ドキュメントの生成についても基本的なサポートを提供します。

15.1. PDF サポートを使う

iText サポートは jboss-seam-pdf.jar で提供されます。 この JAR には、 PDF にレンダリングが可能となるビューの作成に使用される iText JSF 制御、 およびレンダリングされたドキュメントをユーザーに提供する DocumentStore コンポーネントが含まれています。 PDF サポートをご使用のアプリケーションに含ませるには、 iText JAR ファイルと一緒に WEB-INF/lib ディレクトリに jboss-seam-pdf.jar を含ませます。 Seam の iText サポートを使用するのに必要な設定はこれだけで他にはありません。

Seam iText モジュールにはビューテクノロジーとして Facelets を使用する必要があります。 ライブラリの今後のバージョンは JSP の使用にも対応する可能性があります。 また、 seam-ui パッケージの使用も必要となります。

examples/itext プロジェクトには実行可能なデモ用 PDF サポートのサンプルが含まれています。 正確なパッケージ化の導入を行い、 現在サポートされている PDF 生成の主要な機能を実際に示すサンプルがいくつか含まれています。

15.2. ドキュメントを作成する

ドキュメントは http://jboss.com/products/seam/pdf 名前空間にあるタグを使って facelets documents で生成されます。 ドキュメントには必ずドキュメントの root に document タグがなければなりません。 document タグは Seam がドキュメントを DocumentStore に生成し HTML リダイレクトをその格納コンテントにレンダリングする準備を行います。 次は 1 行のみのテキストから成る小規模の PDF ドキュメントです。

<p:document xmlns:p="http://jboss.com/products/seam/pdf">                                                      
   The document goes here.                                                                                             
</p:document>
        

15.2.1. p:document

p:document タグは次の属性をサポートしています。

type

生成されるドキュメントのタイプです。 有効な値は、 PDFRTFHTML の各モードになります。 Seam のデフォルト設定は PDF 生成で、 多くの機能が正常に動作するのは PDF ドキュメントを生成している場合に限られます。

pageSize

生成されるページのサイズです。 もっとも一般的に使用される値は LETTERA4 でしょう。 対応ページサイズの一覧は com.lowagie.text.PageSize クラスをご覧ください。 代わりに、 pageSize はページ幅と高さを直接提供することができます。 例えば、 "612 792" という値は LETTER のページサイズに相当します。

orientation

ページ位置です。 有効な値は portraitlandscape です。 横モードでは、 ページ幅と高さのサイズ値が逆転します。

margins

右、 左、上部、 下部 の余白部分の値です。

marginMirroring

余白の設定が交互のページで逆転されることを示します。

ドキュメントのメタデータもドキュメントタグの属性として設定されます。 次のメタデータフィールドがサポートされています。

title

subject

keywords

author

creator

15.3. 基本的なテキストのエレメント

役に立つドキュメントにはテキスト以外のものも含まれる必要があります。 ただし、 標準 UI コンポーネントは HTML 生成に対して適合されるので、 PDF コンテントの生成には役に立ちません。 Seam は特殊な UI コンポーネントを適切な PDF コンテントの生成に対して提供しています。 <p:image><p:paragraph> のようなタグはシンプルなドキュメントのベーシックな基盤となります。 <p:font> のようなタグはその回りのコンテントすべてに対してスタイル情報を提供します。

<p:document xmlns:p="http://jboss.com/products/seam/pdf"> 
    <p:image alignment="right" wrap="true" resource="/logo.jpg" />
    <p:font size="24">
        <p:paragraph spacingAfter="50">My First Document</p:paragraph>
    </p:font>

    <p:paragraph alignment="justify">
        This is a simple document.  It isn't very fancy.
    </p:paragraph>
</p:document>
        

15.3.1. p:paragraph

テキストでの使用が多く、 文章をひとかたまりごとに区切るため理にかなったグループでテキストの断片の流れを作り、形成、スタイル化することができます。

firstLineIndent

extraParagraphSpace

leading

multipliedLeading

spacingBefore

エレメントの前に挿入される空白スペースです。

spacingAfter

エレメントの後に挿入される空白スペースです。

indentationLeft

indentationRight

keepTogether

15.3.2. p:text

text タグによりテキストの断片が通常の JSF コンバータのメカニズムを使用してアプリケーションデータから生成されるようになります。 HTML ドキュメントをレンダリングする場合に使用される outputText タグに非常に似ています。 次に例を示します。

<p:paragraph>
    The item costs <p:text value="#{product.price}">
        <f:convertNumber type="currency" currencySymbol="$"/>
    </p:text>
</p:paragraph>
            
value

表示される値です。 一般的には値バインディング表現になります。

15.3.3. p:font

フォントの宣言にはダイレクトがありません。

familyName

フォントファミリーです。 COURIERHELVETICATIMES-ROMANSYMBOLZAPFDINGBATS のいずれかになります。

size

フォントのポイントサイズです。

style

フォントのスタイルです。 NORMALBOLDITALICOBLIQUEUNDERLINELINE-THROUGH などの組み合わせになります。

15.3.4. p:newPage

p:newPage は改ページを挿入します。

15.3.5. p:image

p:image はドキュメントにイメージを挿入します。 イメージはクラスパスから、またはresource 属性を使ってウェブアプリケーションコンテキストからロードすることができます。

<p:image resource="/jboss.jpg" />

リソースはアプリケーションコードで動的に生成することもできます。 imageData 属性は値バインディング表現を指定することができ、 この値は java.awt.Image オブジェクトになります。

<p:image imageData="#{images.chart}" />
resource

含ませるイメージリソースの場所です。 リソースはウェブアプリケーションのドキュメントルートに対して相対的でなければなりません。

imageData

アプリケーション生成のイメージにバインドするメソッド表現です。

rotation

度数によるイメージの回転です。

height

イメージの高さです。

width

イメージの幅です。

alignment

イメージの位置です。 (可能な値については 項15.8.2. 「位置調整の値」 を参照)

alt

イメージに対して代替として表示されるテキストです。

indentationLeft

indentationRight

spacingBefore

エレメントの前に挿入される空白スペースです。

spacingAfter

エレメントの後に挿入される空白スペースです。

widthPercentage

initialRotation

dpi

scalePercent

イメージに使用する倍率です (百分率) 。 1 つの値または x と y 別々の倍率を示す 2 つの値で表すことができます。

wrap

underlying

15.3.6. p:anchor

p:anchor はドキュメントからクリックできるリンクを定義します。 次の属性をサポートしています。

name

ドキュメント内のアンカー目的地の名前です。

reference

リンクの参照先です。 ドキュメント内の別のポイントへのリンクは「#」で開始してください。 たとえば、 link1 という name を持つアンカー位置を参照するには「#link1」を使います。 リンクはドキュメントの外にあるリソースをポイントする完全 URL でも構いません。

15.4. ヘッダとフッタ

15.4.1. p:header and p:footer

p:headerp:footer コンポーネントは、 最初のページを除き生成されたドキュメントの各ページにヘッダとフッタのテキストを配置する機能を提供します。 ヘッダとフッタの宣言はドキュメント上部付近に表されます。

alignment

ヘッダ/フッタのボックスセクションの位置です。 (位置の値は 項15.8.2. 「位置調整の値」 を参照)

backgroundColor

ヘッダ/フッタボックスの背景色です。 (色の値は 項15.8.1. 「Color Values」 を参照)

borderColor

ヘッダ/フッタボックスの境界線の色です。 borderColorLeftborderColorRightborderColorTopborderColorBottom を使って各線は別々に設定することができます。 (色の値は 項15.8.1. 「Color Values」 を参照)

borderWidth

境界線の幅です。 borderWidthLeftborderWidthRightborderWidthTopborderWidthBottom を使って各線は別々に指定することができます。

15.4.2. p:pageNumber

現在のページ番号は p:pageNumber タグを使うとヘッダまたはフッタの内側に配置することができます。 このページ番号タグはヘッダまたはフッタのコンテキスト内で 1 度だけ使用することができます。

15.5. 章とセクション

生成されるドキュメントが本または論文の構造をとる場合、 p:chapterp:section の各タグを使用して必要となる構造を構成することができます。 セクションは章の内側でのみ使用できますが、 適宜、 ネストさせることができます。 ほとんどの PDF ビューワはドキュメント内の章とセクション間を簡単に移動できる機能を提供しています。

<p:document xmlns:p="http://jboss.com/products/seam/pdf"
            title="Hello">

   <p:chapter number="1">
      <p:title><p:paragraph>Hello</p:paragraph></p:title>
      <p:paragraph>Hello #{user.name}!</p:paragraph>
   </p:chapter>

   <p:chapter number="2">
      <p:title><p:paragraph>Goodbye</p:paragraph></p:title>
      <p:paragraph>Goodbye #{user.name}.</p:paragraph>
   </p:chapter>

</p:document>    
        

15.5.1. p:chapter and p:section

number

章の番号です。 各章は章番号が割り当てられなければなりません。

numberDepth

セクション番号付けの奥行きです。 セクションはすべて回りの章/セクションに相対的に番号付けされます。 デフォルトの奥行き 3 で表示される場合は、 第 3 章の セクション 1 の小セクション 4 はセクション 3.1.4 と表されるでしょう。 章番号を省略するには、 奥行き 2 を使用してください。 この場合、 セクション番号は 1.4 と表されます。

15.5.2. p:title

いずれの章やセクションも p:title を含むことができます。 タイトルは章/セクション番号のとなりに表示されます。 タイトルのボディは、 生テキストを含ませることも、 p:paragraph にすることもできます。

15.6. 一覧

一覧の構成は p:listp:listItem のタグを使って表示させることができます。 一覧には適宜、 ネストされたサブリストを含ませることもできます。 一覧のアイテムは一覧の外側では使用できません。 次のドキュメントは ui:repeat タグを使って Seam コンポーネントから取得した値の一覧を表示しています。

<p:document xmlns:p="http://jboss.com/products/seam/pdf"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            title="Hello">
   <p:list style="numbered">
      <ui:repeat value="#{documents}" var="doc">
         <p:listItem>#{doc.name}</p:listItem>
      </ui:repeat>
   </p:list>
</p:document>                
        

15.6.1. p:list

p:list は次の属性をサポートしています。

style

一覧の順序付けと箇条書きのスタイルです。 NUMBEREDLETTEREDGREEKROMANZAPFDINGBATSZAPFDINGBATS_NUMBER のいずれかを使用します。 スタイルが指定されていないと一覧のアイテムは箇条書きスタイルになります。

listSymbol

箇条書きの一覧用で、 箇条書きの記号を指定します。

indent

一覧のインデントレベルです。

lowerCase

文字を使った一覧スタイル用で、 この文字を小文字にするかどうかを指示します。

charNumber

ZAPFDINGBATS 用で、 箇条書きの記号の文字コードを指示します。

numberType

ZAPFDINGBATS_NUMBER 用で、 番号付けのスタイルを指示します。

15.6.2. p:listItem

p:listItem は次の属性をサポートしています。

alignment

一覧のアイテムの位置です。 (可能な値は 項15.8.2. 「位置調整の値」 を参照)

indentationLeft

左インデントの量です。

indentationRight

右インデントの量です。

listSymbol

この一覧アイテムのデフォルト一覧記号を上書きします。

15.7. 表

表の構成は p:tablep:cell のタグを使って作成することができます。 多くの表構成とは異なり明示的な列の宣言はありません。 表にコラムが 3 つある場合は、 3 セルすべてが自動的に列を形成します。 表の構成が複数ページに渡る場合、 ヘッダとフッタは繰り返されます。

<p:document xmlns:p="http://jboss.com/products/seam/pdf"   
            xmlns:ui="http://java.sun.com/jsf/facelets"
            title="Hello">   
   <p:table columns="3" headerRows="1">
      <p:cell>name</p:cell>
      <p:cell>owner</p:cell>
      <p:cell>size</p:cell>
      <ui:repeat value="#{documents}" var="doc">
         <p:cell>#{doc.name}</p:cell>
         <p:cell>#{doc.user.name}</p:cell>
         <p:cell>#{doc.size}</p:cell>
      </ui:repeat>
   </p:table>
</p:document>            
        

15.7.1. p:table

p:table は次の属性をサポートしています。

columns

表の列を構成するコラム (セル) の数です。

widths

各コラムに関連する幅です。 各コラムに 1 つの値があるはずです。 たとえば、 widths="2 1 1" なら、 コラムが 3 つあり 1 番目のコラムのサイズは 2 番目と 3 番目のコラムの 2 倍になっているはずです。

headerRows

ヘッダまたはフッタの列とみなされる最初の列番号で、 表が複数ページにわたる場合には繰り返されるはずです。

footerRows

フッタの列とみなされる列の番号です。 この値は headerRows 値から差し引かれます。 ドキュメントにヘッダを構成する列が 2 列ありフッタを構成する列が 1 列の場合、 headerRows は 3 に設定され footerRows は 1 に設定されているはずです。

widthPercentage

表が表示されるページ幅の割合です。

horizontalAlignment

表の横方向位置修正です。 (可能な値については 項15.8.2. 「位置調整の値」 を参照)

skipFirstHeader

runDirection

lockedWidth

splitRows

spacingBefore

エレメントの前に挿入される空白スペースです。

spacingAfter

エレメントの後に挿入される空白スペースです。

extendLastRow

headersInEvent

splitLate

keepTogether

15.7.2. p:cell

p:cell は次の属性をサポートしています。

colspan

colspan を 1 越える値に宣言するとセルが 1 コラムを越えることができます。 表を複数の列にわたって広げる機能はありません。

horizontalAlignment

セルの横方向位置調整です。 (可能な値は 項15.8.2. 「位置調整の値」 を参照)

verticalAlignment

セルの縦方向位置調整です。 (可能な値は 項15.8.2. 「位置調整の値」 を参照)

padding

paddingLeftpaddingRightpaddingToppaddingBottom を使って特定の側面を詰めることを指定することもできます。

useBorderPadding

leading

multipliedLeading

indent

verticalAlignment

extraParagraphSpace

fixedHeight

noWrap

minimumHeight

followingIndent

rightIndent

spaceCharRatio

runDirection

arabicOptions

useAscender

grayFill

rotation

15.8. ドキュメントの定数

本セクションでは複数のタグで属性により共有される定数のいくつか説明します。

15.8.1. Color Values

Seam のドキュメントはまだフルカラー仕様をサポートしていません。 現在、 次の指定色のみサポートされています。 whitegraylightgraydarkgrayblackredpinkyellowgreenmagentacyanblue です。

15.8.2. 位置調整の値

位置調整の値が使用される場所で、 Seam PDF は次の横方向の位置調整値、 leftrightcenterjustifyjustifyall をサポートしています。 縦方向の値は topmiddlebottombaseline です。

15.9. iText を設定する

ドキュメントの生成は特に設定を必要とすることなく、 そのまま動作させることができます。 ただし、 本格的なアプリケーションには必要となる設定ポイントがいくつかあります。

デフォルトの実装は汎用 URL /seam-doc.seam から PDF ドキュメントを提供します。 多くのブラウザ (そしてユーザー) は、 /myDocument.pdf などのように実際の PDF 名を含む URL を好みます。 これにはいくつか設定が必要になってきます。 PDF ファイルを提供するには、 すべての *.pdf リソースが Seam Servlet Filter および DocumentStoreServlet にマッピングされなければなりません。

<filter>
    <filter-name>Seam Servlet Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamServletFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>Seam Servlet Filter</filter-name>
    <url-pattern>*.pdf</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>Document Store Servlet</servlet-name>
    <servlet-class>org.jboss.seam.pdf.DocumentStoreServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Document Store Servlet</servlet-name>
    <url-pattern>*.pdf</url-pattern>
</servlet-mapping>

document store コンポーネントにある useExtensions オプションは、 document store に生成されているドキュメントタイプに対して正しいファイル名の拡張子を付けて URL を生成するよう指示することによりこの機能を補います。

        
<components xmlns="http://jboss.com/products/seam/components"
            xmlns:pdf="http://jboss.com/products/seam/pdf">
    <pdf:documentStore useExtensions="true" />
</components>

生成されるドキュメントは対話スコープに格納され、 対話が終了するときに期限が切れます。 この時点で、 ドキュメントへの参照は無効になります。 ドキュメントが存在しない場合、 documentStore の errorPage プロパティを使って表示されるデフォルトのビューを指定できます。

        
<pdf:documentStore useExtensions="true" errorPage="/pdfMissing.seam" />

15.10. iText のリンク

iText に関する詳細は、 次を参照してください。