DioDocs for PDF
レイヤー
機能 > レイヤー

PDF内のレイヤーはオプションのコンテンツであり、特定のコンテンツセクションを選択的に表示または非表示にします。レイヤーは、主にPDFに描画されるグラフィックオブジェクトの可視性を制御するために使用されます。以下は、PDFレイヤーを使用できるいくつかの例です。

DioDocs for PDFでは、レイヤーを作成し、コンテンツストリーム、FormXObject、注釈などのコンテンツをさまざまなレイヤーに関連付けて、それらのプロパティを設定できます。OptionalContentPropertiesクラスは、PDFにレイヤーを実装するためにさまざまなメソッドとプロパティを提供します。

PDFでのレイヤーの作成

PDFでレイヤーを作成して、描画するには、

  1. OptionalContentPropertiesクラスのAddLayerメソッドを使用して、レイヤーを作成して名前を付けます。
  2. 特定のレイヤーで描画を開始するには、GcPdfGraphicsBeginLayerメソッドを呼び出して、ターゲットレイヤーの名前を指定します。
  3. GcPdfGraphicsのDrawString メソッドを使用して、レイヤーにコンテンツを追加します。
  4. GcPdfGraphicsのEndLayerメソッドを呼び出して、現在のレイヤーでの描画を終了します。
  5. 同様に、BeginLayerおよびEndLayerメソッドを使用して他のレイヤーに描画して、コンテンツを追加できます。
    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は、特定のレイヤーに関連付けることができます。 次のコードは、FormXObjectをレイヤーに関連付ける方法を示します。

  1. 上記で説明したようにレイヤーを作成し、AddLayerメソッドによって返される作成されたレイヤーオブジェクトへの参照を保存します。
  2. FormXObjectを作成します。詳細については、「FormXObject」を参照してください。
  3. FormXObjectのLayerプロパティを、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");        
}

上記のサンプルコードの結果は、次のようになります。

 

レイヤーに対する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]);