Home • ChemFormatter • iText.NET • JFreeChart.NET • ConcatPDF • iTextFront • TIFF2PPT • J by J# • Programming J#
MSN Search

iText.NET

iText .NET
@SourceForge
ライセンス
更新履歴
ダウンロード
使い方
J# Examples
C# Examples
VB.NET Examples
コンパイル
ConcatPDF
iText (Java)
J by J#

SourceForge.net Logo

 

Optional Content

オプショナルコンテンツグループ(OCG)
オプショナルコンテンツは、PDF Reference Manual の 4.10節で次のように論じられています。
オプショナルコンテンツは、PDF 文書において、その文書の著者あるいは閲覧者により可視・不可視の選択ができるコンテンツの部分である。この機能は、CADの図面、レイヤーがあるアートワーク、地図、多言語文書などで有用である。
グラフィックスは、オプショナルコンテンツグループにグループ化して、可視・不可視を制御できます。あるひとつのグループに属しているコンテンツは、そのグループが ON の時に可視になり、OFF の時に不可視になります。
iText では、そのようなグループを'Layers'と呼びます。PdfLayer オブジェクトを作成し、コンテンツを PdfContentByte オブジェクトに加えるときに、表示すべき(あるいは隠すべき)コンテンツがどのレイヤー(=コンテンツグループ)に入るのかを指定します。
PdfContentByte cb = writer.getDirectContent();
PdfLayer l = new PdfLayer("My Layer", writer);
cb.beginLayer(l);
// add content to 'My Layer' here
cb.endLayer();
異なるPdfLayersをあわせて、PdfLayerMembership にすることができます
PdfContentByte cb = writer.getDirectContent();
PdfLayer l1 = new PdfLayer("Layer 1", writer);
PdfLayer l2 = new PdfLayer("Layer 2", writer);
PdfLayerMembership m = new PdfLayerMembership(writer);
m.addMember(l1);
m.addMember(l2);
cb.beginLayer(m);
// add content to 'Layer 1' and 'Layer 2' here
cb.endLayer();
次に単純な例を示します。 見てわかるように、すべての利用可能なレイヤーが Acrobat Reader の左ペインにあります。このうちの二つは、'2のグループ'にグループ化されています。目のシンボルをクリックすることでレイヤーを不可視にすることができます。
Writer を作成したあとに、(OCG は、バージョン 1.5 から導入されたので) PDF バージョンを 1.5 に設定し、さらに、開き方に、PageModeUseOC を設定していることに注意してください。
writer.setPdfVersion(PdfWriter.VERSION_1_5);
writer.setViewerPreferences(PdfWriter.PageModeUseOC);

すべての Writer オブジェクトは、PdfOCProperties ディクショナリ を持っています。このディクショナリーは、上記のように getOCProperties() によって取得できます。ディクショナリーは、PDF では頻繁に使われます。(ほかの PDF 特有のオブジェクトとしては、PdfArray, PdfString, PdfNull, PdfName, PdfNumber などがあります。) iText は、これらのオブジェクトを背後でたくさん作成します。PdfOCProperties ディクショナリーを使いたいというのは、iTextの内部構造についてより深くしるよい機会です。(これは、複雑な機能であるという意味の婉曲表現です。)下のコードでは、Writer から OC プロパティを得て、ORDER 配列を作成し、この配列に、レイヤー l1, l2, l3 を l2 と l3 は'2のグループ'に入れた後に加えています。

PdfOCProperties ocp = writer.getOCProperties();
PdfArray order = new PdfArray();
order.add(l1.getRef());
PdfArray group = new PdfArray();
group.add(new PdfString("A group of two", PdfObject.TEXT_UNICODE));
group.add(l2.getRef());
group.add(l3.getRef());
order.add(group);
PdfDictionary dict = new PdfDictionary();
dict.put(PdfName.ORDER, order);
ocp.put(PdfName.D, d);
次の例で得られる PDF を見れば、その効果が分かります。

若干の変更により、グループ化する代わりに、'ネスト'することもできます。

これを見ると、精巧で複雑であることがわかるでしょう。ごめんなさい。私は、iTextがどのように働いているかを示すために、意地悪していました。OCG を順序付け、グループ化、ネスト化するためには、もっと簡単な方法があります。ただ単に、PdfLayer.createTitle メソッドと PdfLayer.addChild メソッドを呼び出すだけで、iText は、この難しい作業をあなたに代わってすべて処理します。
Example: java com.lowagie.examples.directcontent.optionalcontent.Automatic
Automatic grouping and nesting of Optional Content: see automatic.pdf

PdfLayer クラスには、ほかのメソッドが見られます。PdfLayer.setZoom は、地図を描くのに便利でしょう。コンテンツが表示される拡大率を最大値から最小値の間で変更できます。PdfLayer.setPrint は、コンテンツを印刷用に設定します。PdfLayer.setOn は、そのレイヤーの可視の初期値を設定します。PdfLayer.setOnPanel は、Acrobat のレイヤーパネルの可視を設定します。これを、false にするとレイヤーは、ユーザが直接には制御できなくなります。これらのメソッドは、次のように使います。

Example: java com.lowagie.examples.directcontent.optionalcontent.Layers
Zooming and radio groups: see layers.pdf

PdfLayer クラスには、ほかにも多くのメソッドがありますが、それについていは、最後の例を見てください。

Example: java com.lowagie.examples.directcontent.optionalcontent.OptionalContent
Changing the visibility using an Action: see optionalcontent.pdf
External resources for this example: pngnow.png
Acrobat Readerで、レイヤーパネルによるレイヤーの切り替えを見てきましたが、レイヤーの可視ステータスを変更するアクションも作ることができます。
ArrayList state = new ArrayList();
state.add("toggle");
state.add(l1);
state.add(l2);
state.add(l3);
state.add(l4);
PdfAction action = PdfAction.setOCGstate(state, true);
Chunk ck = new Chunk("Click here to toggle the layers").setAction(action);
ステートとしては、"ON"、"OFF"、"Toggle"があり得ます。(PdfAction.setOCGstate のAPIも参照してください。)
先頭に戻る

Copyright (C) 2001-2007 Kazuya Ujihara. All rights reserved.