PDF内のレイヤーはオプションのコンテンツであり、特定のコンテンツセクションを選択的に表示または非表示にします。レイヤーは、主にPDFに描画されるグラフィックオブジェクトの可視性を制御するために使用されます。以下は、PDFレイヤーを使用できるいくつかの例です。
DioDocs for PDFでは、レイヤーを作成し、コンテンツストリーム、FormXObject、注釈などのコンテンツをさまざまなレイヤーに関連付けて、それらのプロパティを設定できます。OptionalContentPropertiesクラスは、PDFにレイヤーを実装するためにさまざまなメソッドとプロパティを提供します。
PDFでレイヤーを作成して、描画するには、
C# |
コードのコピー
|
---|---|
GcPdfDocument doc = new GcPdfDocument(); doc.OptionalContent.AddLayer("レイヤー1"); doc.OptionalContent.AddLayer("レイヤー2"); var g = doc.NewPage().Graphics; g.BeginLayer("レイヤー1"); g.DrawString("レイヤー1", new TextFormat() { Font = StandardFonts.Courier }, new PointF(10, 10)); g.EndLayer(); g.BeginLayer("レイヤー2"); g.DrawString("レイヤー2", new TextFormat() { Font = StandardFonts.Courier }, new PointF(10, 30)); g.EndLayer(); doc.Save("SimpleLayers.pdf"); |
上記のサンプルコードの結果は、次のようになります。
FormXObjectは、特定のレイヤーに関連付けることができます。 次のコードは、FormXObjectをレイヤーに関連付ける方法を示します。
C# |
コードのコピー
|
---|---|
GcPdfDocument doc = new GcPdfDocument(); var l1 = doc.OptionalContent.AddLayer("レイヤー1"); var l2 = doc.OptionalContent.AddLayer("レイヤー2"); var g = doc.NewPage().Graphics; FormXObject fxo1 = new FormXObject(doc, new RectangleF(0, 0, 100, 100)); fxo1.Graphics.FillRectangle(new RectangleF(0, 0, 100, 100), Color.Blue); fxo1.Graphics.DrawString(l1.Name, new TextFormat() { Font = StandardFonts.Courier }, new PointF(10, 10)); fxo1.Layer = l1; FormXObject fxo2 = new FormXObject(doc, new RectangleF(0, 0, 100, 100)); fxo2.Graphics.DrawRectangle(new RectangleF(0, 0, 100, 100), Color.Blue, 4); fxo2.Graphics.DrawString(l2.Name, new TextFormat() { Font = StandardFonts.Courier }, new PointF(10, 10)); fxo2.Layer = l2; g.DrawForm(fxo1, new RectangleF(10, 10, 100, 100), null, ImageAlign.StretchImage); g.DrawForm(fxo2, new RectangleF(150, 10, 100, 100), null, ImageAlign.StretchImage); doc.Save("FormXObjectLayers.pdf"); |
上記のサンプルコードの結果は、次のようになります。
注釈を特定のレイヤーに関連付けることができます。 以下のコードは、AnnotationBaseクラスのLayerプロパティを対象のレイヤーに設定して、注釈を関連付ける方法を示します。
C# |
コードのコピー
|
---|---|
GcPdfDocument doc = new GcPdfDocument(); var l1 = doc.OptionalContent.AddLayer("レイヤー1"); var l2 = doc.OptionalContent.AddLayer("レイヤー2"); var p = doc.NewPage(); var ft = new FreeTextAnnotation(); ft.UserName = "UserName"; ft.Rect = new RectangleF(10, 10, 100, 100); ft.Contents = $"{l1.Name}からの注釈 "; ft.Layer = l1; p.Annotations.Add(ft); ft = new FreeTextAnnotation(); ft.UserName = "UserName"; ft.Rect = new RectangleF(150, 10, 100, 100); ft.Contents = $"{l2.Name}からの注釈 "; ft.Layer = l2; p.Annotations.Add(ft); doc.Save("AnnotationLayers.pdf"); |
上記のサンプルコードの結果は、次のようになります。
OptionalContentPropertiesクラスのメソッドを使用して、異なるレイヤーのさまざまなプロパティを変更できます。以下のコードは、レイヤーのプロパティを変更する方法を示しています。
C# |
コードのコピー
|
---|---|
GcPdfDocument doc = new GcPdfDocument(); using (FileStream fs = new FileStream("construction_drawing-final.pdf", FileMode.Open)) { doc.Load(fs); doc.OptionalContent.SetLayerLocked("Architecture", true); doc.OptionalContent.SetLayerInitialViewState("Equipment", LayerInitialViewState.VisibleWhenOn); doc.OptionalContent.Groups.FindByName("Electrical").Intent = new string[] { "Design" }; doc.OptionalContent.SetLayerDefaultState("HVAC", false); doc.OptionalContent.SetLayerPrintState("Pipe", LayerPrintState.Never); doc.Save("SetLayerProperties.pdf"); } |
上記のサンプルコードの結果は、次のようになります。
DioDocs for PDFでは、指定したレイヤーに対して、テキストの検索、テキストの抽出、注釈の描画など、特定のPDF操作を実行することができます。これは、環境設定を定義し、環境内のレイヤーの状態を取得できるViewStateクラスを使用することにより実現できます。特定のレイヤー上で操作を実行するには、その操作に対応するメソッドにViewStateクラスのインスタンスを渡します。
例えば、以下のコードは、PDFドキュメントの指定したレイヤーにあるテキストを検索する方法を示しています。
C# |
コードのコピー
|
---|---|
void FindInLayer(GcPdfDocument doc, string layer, string text, Color highlight) { // 指定されたレイヤーだけを表示したviewStateを作成します var viewState = new ViewState(doc); viewState.SetLayersUIStateExcept(false, layer); viewState.SetLayersUIState(true, layer); // 指定されたレイヤーに検索の対象が限定されるように、カスタマイズしたviewStateを使用して // FindTextParamsを作成します var ftp = new FindTextParams(text, false, false, viewState, 72f, 72f, true, true); // 検索文字列の表示箇所をすべて検索します var finds = doc.FindText(ftp, OutputRange.All); // 指定されたレイヤーにあるすべての検索結果を強調表示します foreach (var find in finds) foreach (var ql in find.Bounds) { var g = doc.Pages[find.PageIndex].Graphics; g.BeginLayer(layer); doc.Pages[find.PageIndex].Graphics.FillPolygon(ql, highlight); g.EndLayer(); } } |
複数レイヤーを持つPDFドキュメントにて、特定のレイヤーを削除する際に関連するコンテンツも削除するかどうかを選択したい場合があります。 DioDocs for PDFのOptionalContent.RemoveLayerメソッドを使用すると、レイヤーを削除する際に関連するコンテンツを削除するかどうかを設定できます。 RemoveLayerメソッドは、removeContentプロパティとOptionalContentGroupオブジェクトの配列をパラメータとして受け取ります。特定のレイヤーに関連するコンテンツを削除するには、Page.RemoveLayersContentメソッドを使用することもできます。
C# |
コードのコピー
|
---|---|
// 最後のレイヤーを除くすべてのレイヤーとそのコンテンツを削除します var layers = doc.OptionalContent.Groups.Take(doc.OptionalContent.Groups.Count - 1).ToArray(); doc.OptionalContent.RemoveLayers(true, layers); // 最後のレイヤーは、コンテンツを残して削除します doc.OptionalContent.RemoveLayer(doc.OptionalContent.Groups[0]); |