Seam には iText を使ったドキュメント生成用のコンポーネントセットが含まれるようになります。 Seam の iText ドキュメントサポートで主に焦点を置いているのは PDF の生成ですが、 Seam は RTF ドキュメントの生成についても基本的なサポートを提供します。
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 生成の主要な機能を実際に示すサンプルがいくつか含まれています。
ドキュメントは 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>
p:document タグは次の属性をサポートしています。
生成されるドキュメントのタイプです。 有効な値は、 PDF、 RTF、 HTML の各モードになります。 Seam のデフォルト設定は PDF 生成で、 多くの機能が正常に動作するのは PDF ドキュメントを生成している場合に限られます。
生成されるページのサイズです。 もっとも一般的に使用される値は LETTER と A4 でしょう。 対応ページサイズの一覧は com.lowagie.text.PageSize クラスをご覧ください。 代わりに、 pageSize はページ幅と高さを直接提供することができます。 例えば、 "612 792" という値は LETTER のページサイズに相当します。
ページ位置です。 有効な値は portrait と landscape です。 横モードでは、 ページ幅と高さのサイズ値が逆転します。
右、 左、上部、 下部 の余白部分の値です。
余白の設定が交互のページで逆転されることを示します。
ドキュメントのメタデータもドキュメントタグの属性として設定されます。 次のメタデータフィールドがサポートされています。
役に立つドキュメントにはテキスト以外のものも含まれる必要があります。 ただし、 標準 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>
テキストでの使用が多く、 文章をひとかたまりごとに区切るため理にかなったグループでテキストの断片の流れを作り、形成、スタイル化することができます。
エレメントの前に挿入される空白スペースです。
エレメントの後に挿入される空白スペースです。
text タグによりテキストの断片が通常の JSF コンバータのメカニズムを使用してアプリケーションデータから生成されるようになります。 HTML ドキュメントをレンダリングする場合に使用される outputText タグに非常に似ています。 次に例を示します。
<p:paragraph> The item costs <p:text value="#{product.price}"> <f:convertNumber type="currency" currencySymbol="$"/> </p:text> </p:paragraph>
表示される値です。 一般的には値バインディング表現になります。
フォントの宣言にはダイレクトがありません。
フォントファミリーです。 COURIER、 HELVETICA、 TIMES-ROMAN、 SYMBOL、 ZAPFDINGBATS のいずれかになります。
フォントのポイントサイズです。
フォントのスタイルです。 NORMAL、 BOLD、 ITALIC、 OBLIQUE、 UNDERLINE、 LINE-THROUGH などの組み合わせになります。
p:image はドキュメントにイメージを挿入します。 イメージはクラスパスから、またはresource 属性を使ってウェブアプリケーションコンテキストからロードすることができます。
<p:image resource="/jboss.jpg" />
リソースはアプリケーションコードで動的に生成することもできます。 imageData 属性は値バインディング表現を指定することができ、 この値は java.awt.Image オブジェクトになります。
<p:image imageData="#{images.chart}" />
含ませるイメージリソースの場所です。 リソースはウェブアプリケーションのドキュメントルートに対して相対的でなければなりません。
アプリケーション生成のイメージにバインドするメソッド表現です。
度数によるイメージの回転です。
イメージの高さです。
イメージの幅です。
イメージの位置です。 (可能な値については 項15.8.2. 「位置調整の値」 を参照)
イメージに対して代替として表示されるテキストです。
エレメントの前に挿入される空白スペースです。
エレメントの後に挿入される空白スペースです。
イメージに使用する倍率です (百分率) 。 1 つの値または x と y 別々の倍率を示す 2 つの値で表すことができます。
p:header と p:footer コンポーネントは、 最初のページを除き生成されたドキュメントの各ページにヘッダとフッタのテキストを配置する機能を提供します。 ヘッダとフッタの宣言はドキュメント上部付近に表されます。
ヘッダ/フッタのボックスセクションの位置です。 (位置の値は 項15.8.2. 「位置調整の値」 を参照)
ヘッダ/フッタボックスの背景色です。 (色の値は 項15.8.1. 「Color Values」 を参照)
ヘッダ/フッタボックスの境界線の色です。 borderColorLeft、 borderColorRight、 borderColorTop、 borderColorBottom を使って各線は別々に設定することができます。 (色の値は 項15.8.1. 「Color Values」 を参照)
境界線の幅です。 borderWidthLeft、 borderWidthRight、 borderWidthTop、 borderWidthBottom を使って各線は別々に指定することができます。
生成されるドキュメントが本または論文の構造をとる場合、 p:chapter と p: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>
章の番号です。 各章は章番号が割り当てられなければなりません。
セクション番号付けの奥行きです。 セクションはすべて回りの章/セクションに相対的に番号付けされます。 デフォルトの奥行き 3 で表示される場合は、 第 3 章の セクション 1 の小セクション 4 はセクション 3.1.4 と表されるでしょう。 章番号を省略するには、 奥行き 2 を使用してください。 この場合、 セクション番号は 1.4 と表されます。
一覧の構成は p:list と p: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>
p:list は次の属性をサポートしています。
一覧の順序付けと箇条書きのスタイルです。 NUMBERED、 LETTERED、 GREEK、 ROMAN、 ZAPFDINGBATS、 ZAPFDINGBATS_NUMBER のいずれかを使用します。 スタイルが指定されていないと一覧のアイテムは箇条書きスタイルになります。
箇条書きの一覧用で、 箇条書きの記号を指定します。
一覧のインデントレベルです。
文字を使った一覧スタイル用で、 この文字を小文字にするかどうかを指示します。
ZAPFDINGBATS 用で、 箇条書きの記号の文字コードを指示します。
ZAPFDINGBATS_NUMBER 用で、 番号付けのスタイルを指示します。
p:listItem は次の属性をサポートしています。
一覧のアイテムの位置です。 (可能な値は 項15.8.2. 「位置調整の値」 を参照)
左インデントの量です。
右インデントの量です。
この一覧アイテムのデフォルト一覧記号を上書きします。
表の構成は p:table と p: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>
p:table は次の属性をサポートしています。
表の列を構成するコラム (セル) の数です。
各コラムに関連する幅です。 各コラムに 1 つの値があるはずです。 たとえば、 widths="2 1 1" なら、 コラムが 3 つあり 1 番目のコラムのサイズは 2 番目と 3 番目のコラムの 2 倍になっているはずです。
ヘッダまたはフッタの列とみなされる最初の列番号で、 表が複数ページにわたる場合には繰り返されるはずです。
フッタの列とみなされる列の番号です。 この値は headerRows 値から差し引かれます。 ドキュメントにヘッダを構成する列が 2 列ありフッタを構成する列が 1 列の場合、 headerRows は 3 に設定され footerRows は 1 に設定されているはずです。
表が表示されるページ幅の割合です。
表の横方向位置修正です。 (可能な値については 項15.8.2. 「位置調整の値」 を参照)
エレメントの前に挿入される空白スペースです。
エレメントの後に挿入される空白スペースです。
p:cell は次の属性をサポートしています。
colspan を 1 越える値に宣言するとセルが 1 コラムを越えることができます。 表を複数の列にわたって広げる機能はありません。
セルの横方向位置調整です。 (可能な値は 項15.8.2. 「位置調整の値」 を参照)
セルの縦方向位置調整です。 (可能な値は 項15.8.2. 「位置調整の値」 を参照)
paddingLeft、 paddingRight、 paddingTop、 paddingBottom を使って特定の側面を詰めることを指定することもできます。
本セクションでは複数のタグで属性により共有される定数のいくつか説明します。
Seam のドキュメントはまだフルカラー仕様をサポートしていません。 現在、 次の指定色のみサポートされています。 white、 gray、 lightgray、 darkgray、 black、 red、 pink、 yellow、 green、 magenta、 cyan、 blue です。
ドキュメントの生成は特に設定を必要とすることなく、 そのまま動作させることができます。 ただし、 本格的なアプリケーションには必要となる設定ポイントがいくつかあります。
デフォルトの実装は汎用 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" />