0

私は PDFNet SDK を初めて使用し、PDF 機能の一部がどのように機能するかをまとめようとしています。SDK の幅広さと深さに感銘を受けましたが、SDK がレイヤー (オプションのコンテンツ グループまたは OCG) でどのように機能するかを理解しようとしています。特に、どのレイヤーが非表示 (OFF) であるかを検出して、レイヤーとそのコンテンツを PDF から削除できるようにする方法を決定しようとしています。最初に、pdftron.PDF.OCG 名前空間のクラス、特に Group クラスに焦点を当てました。これにより、以下のコード スニペットに示すように、グループを繰り返し、名前や現在の状態 (オン/オフ) などの基本情報を取得できます。

Config init_cfg = doc.GetOCGConfig(); 
Context ctx = new Context(init_cfg); 


Obj ocgs = doc.GetOCGs(); // Get the array of all OCGs in the document. 
if (ocgs != null) 
{ 
    int i, sz = ocgs.Size(); 
    for (i = 0; i < sz; ++i) 
    { 
        Group ocg = new Group(ocgs.GetAt(i)); 
        bool ocgState = ocg.GetCurrentState(ctx);  // check if ocg is OFF or ON 
        if (!ocgState) // layer is not visible
        {
            // need calls here to delete layer and content
        }
    } 
} 

ここまでは順調ですね。ただし、これらのクラス内のレイヤーと関連するコンテンツを削除する方法がわかりません。何か不足していますか?そうでない場合、SDK でレイヤーを削除する別の方法はありますか?

前もって感謝します!

4

1 に答える 1

0

さて、SDK サンプルをさらに研究し、多くの実験を行った結果、私が試した PDF でこれまでに機能する 1 つのアプローチを見つけました。このソリューションは、ElementEdit サンプルに基づいており、Context.SetNonOCDrawing()、Context.SetOCDrawMode()、および Element.IsOCVisible() メソッドと組み合わせて、レイヤーのオン/オフ状態に基づいて表示されないページ要素を除外します。 . 最終的な結果として、オフになっているレイヤーのコンテンツが削除され、レイヤー自体はまだ残されていますが、空になっています。完璧ではありませんが、私の目的には十分です。とにかく、SDKサンプルに基づいて私が思いついたコードは次のとおりです。

    private void ProcessElements(ElementReader reader, ElementWriter writer, XSet visited)
    {
        Element element;
        while ((element = reader.Next()) != null)   // Read page contents
        {

            switch (element.GetType())
            {
                //always write these element types (visible or non-visible)
                case Element.Type.e_marked_content_begin:
                case Element.Type.e_marked_content_end:
                case Element.Type.e_marked_content_point:
                case Element.Type.e_group_begin:
                case Element.Type.e_group_end:
                    writer.WriteElement(element);
                    continue;
            }

            // do not retain other elements that are not visible
            if (!element.IsOCVisible())
                continue;

            // retain remaining element types if visible
            switch (element.GetType())
            {

                // special processing for form elements
                case Element.Type.e_form:
                    {
                        writer.WriteElement(element); // write Form XObject reference to current stream

                        Obj form_obj = element.GetXObject();
                        if (!visited.Contains(form_obj.GetObjNum())) // if this XObject has not been processed
                        {
                            // recursively process the Form XObject
                            visited.Add(form_obj.GetObjNum());
                            ElementWriter new_writer = new ElementWriter();

                            reader.FormBegin();
                            new_writer.Begin(form_obj, true);
                            ProcessElements(reader, new_writer, visited);
                            new_writer.End();
                            reader.End();
                        }
                        break;
                    }

                default:
                    writer.WriteElement(element);
                    break;
            }
        }
    }


    private void RemoveNonVisibleLayers_Click(string filename, string outputfile)
    {

        PDFNet.Initialize();

        try
        {

            // Open the test file
            XSet visited = new XSet();

            using (PDFDoc doc = new PDFDoc(filename))
            using (ElementReader page_reader = new ElementReader())
            using (ElementWriter writer = new ElementWriter())
            {
                doc.InitSecurityHandler();
                Config init_cfg = doc.GetOCGConfig();
                Context ctx = new Context(init_cfg);

                ctx.SetNonOCDrawing(false);
                ctx.SetOCDrawMode(Context.OCDrawMode.e_VisibleOC);

                PageIterator itr;
                for (itr = doc.GetPageIterator(); itr.HasNext(); itr.Next())        //  Read every page
                {
                    itr.GetPageNumber());

                    page_reader.Begin(itr.Current(), ctx);
                    writer.Begin(itr.Current(), ElementWriter.WriteMode.e_replacement, false);

                    ProcessElements(page_reader, writer, visited);
                    writer.End();
                    page_reader.End();
                }

                doc.Save(outputfile, SDFDoc.SaveOptions.e_remove_unused);
                doc.Close();
            }
        }
        catch (PDFNetException ee)
        {
            Console.WriteLine(ee.Message);
        }

    }
于 2015-08-18T16:51:58.960 に答える