オプショナルコンテンツは、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();
次に単純な例を示します。Ordering Optional Content Groups: see orderedlayers.pdf
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 を見れば、その効果が分かります。Grouping Optional Content: see contentgroups.pdf
若干の変更により、グループ化する代わりに、'ネスト'することもできます。
Nesting Optional Content: see nestedlayers.pdf
Automatic grouping and nesting of Optional Content: see automatic.pdf
PdfLayer クラスには、ほかのメソッドが見られます。PdfLayer.setZoom は、地図を描くのに便利でしょう。コンテンツが表示される拡大率を最大値から最小値の間で変更できます。PdfLayer.setPrint は、コンテンツを印刷用に設定します。PdfLayer.setOn は、そのレイヤーの可視の初期値を設定します。PdfLayer.setOnPanel は、Acrobat のレイヤーパネルの可視を設定します。これを、false にするとレイヤーは、ユーザが直接には制御できなくなります。これらのメソッドは、次のように使います。
Zooming and radio groups: see layers.pdf
PdfLayer クラスには、ほかにも多くのメソッドがありますが、それについていは、最後の例を見てください。
Changing the visibility using an Action: see optionalcontent.pdf
External resources for this example: pngnow.png
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も参照してください。)