// Copyright (C) 2003-2026, Foxit Software Inc..
// All Rights Reserved.
//
// http://www.foxitsoftware.com
//
// The following code is copyrighted and contains proprietary information and trade secrets of Foxit Software Inc..
// You cannot distribute any part of Foxit PDF SDK to any third party or general public,
// unless there is a separate license agreement with Foxit Software Inc. which explicitly grants you such rights.
//
// This file contains an example to demonstrate how to use Foxit PDF SDK to operate PDF objects directly.

using System;

using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.pdf.graphics;
using foxit.pdf.objects;

namespace pdfobjectsCS
{
    class pdfobjects
    {
        // This function is to do some operation to PDF object.
        static void ObjectOperation(PDFDoc document)
        {
            PDFObject boolean_object = PDFObject.CreateFromBoolean(true);
            int boolean_object_number = document.AddIndirectObject(boolean_object);

            Console.WriteLine("Object number of new boolean object: " + boolean_object_number);
            Boolean boolean_object_value = boolean_object.GetBoolean();
            String value = (boolean_object_value != false) ? "true" : "false";
            Console.WriteLine("\tValue of new boolean object: " + value);

            PDFObject float_object = PDFObject.CreateFromFloat(0.1f);
            int float_object_number = document.AddIndirectObject(float_object);
            Console.WriteLine(String.Format("Object number of new number object (as float): " + float_object_number));
            float float_object_value = float_object.GetFloat();
            Console.WriteLine(String.Format("\tValue of new number object (as float): " + float_object_value.ToString("0.000000")));

            PDFObject integer_object = PDFObject.CreateFromInteger(1);
            int integer_object_number = document.AddIndirectObject(integer_object);
            Console.WriteLine(String.Format("Object number of new number object (as integer): " + integer_object_number));
            int integer_object_value = integer_object.GetInteger();
            Console.WriteLine(String.Format("\tValue of new number object (as integer): " + integer_object_value));

            PDFObject string_object = PDFObject.CreateFromString("foxit");
            int string_object_number = document.AddIndirectObject(string_object);
            Console.WriteLine(String.Format("Object number of new string object: " + string_object_number));
            String string_object_value = string_object.GetWideString();
            Console.WriteLine(String.Format("\tValue of new string object: "+ string_object_value));

            PDFObject name_object = PDFObject.CreateFromName("sdk");
            int name_object_number = document.AddIndirectObject(name_object);
            Console.WriteLine(String.Format("Object number of new name object: " + name_object_number));
            String name_object_value = name_object.GetName();
            Console.WriteLine(String.Format("\tValue of new name object: "+ name_object_value));

            foxit.common.DateTime date_time = new foxit.common.DateTime(2017, 9, 27, 19, 36, 6, 0, (short)8, 0);
            PDFObject datetime_object = PDFObject.CreateFromDateTime(date_time);
            int datetime_object_number = document.AddIndirectObject(datetime_object);
            Console.WriteLine(String.Format("Object number of new string object (as date-time):  " + datetime_object_number));
            String datetime_object_value = datetime_object.GetWideString();
            Console.WriteLine(String.Format("\tValue of new string object (as date-time): " + datetime_object_value));

            PDFArray array = PDFArray.Create();
            PDFObject boolean_object_reference = PDFObject.CreateReference(document, boolean_object_number);
            int boolean_object_reference_number = boolean_object_reference.GetObjNum();
            Console.WriteLine(String.Format("Object number of a new reference object to a boolean object: "+ boolean_object_reference_number));
            PDFObject float_object_reference = PDFObject.CreateReference(document, float_object_number);
            PDFObject integer_object_reference = PDFObject.CreateReference(document, integer_object_number);
            PDFObject integer_object_direct = integer_object_reference.GetDirectObject();
            Console.WriteLine(String.Format("Object number of the direct number object: "+ integer_object_direct.GetObjNum()));
            PDFObject string_object_reference = PDFObject.CreateReference(document, string_object_number);
            PDFObject name_object_reference = PDFObject.CreateReference(document, name_object_number);
            PDFObject datetime_object_reference = PDFObject.CreateReference(document, datetime_object_number);

            array.AddElement(boolean_object_reference);
            array.AddElement(float_object_reference);
            array.AddElement(integer_object_reference);
            array.AddElement(string_object_reference);
            array.AddElement(name_object_reference);
            array.AddElement(datetime_object_reference);
            array.AddElement(boolean_object.CloneObject());

            int array_object_number = document.AddIndirectObject(array);
            Console.WriteLine(String.Format("Object number of array object: " + array_object_number));
        }
        // This function is to remove some properties from catalog dictionary.
        static void RemoveCatalogKey(PDFDoc document)
        {
            if (document.IsEmpty())
            {
                return;
            }

            PDFDictionary catalog = document.GetCatalog();
            if (null == catalog)
            {
                return;
            }

            String[] key_strings = { "Type", "Boolean", "Name", "String", "Array", "Dict" };
            int count = key_strings.Length;
            for (int i = 0; i < count; i++)
            {
                if (catalog.HasKey(key_strings[i]))
                {
                    catalog.RemoveAt(key_strings[i]);
                }
            }
        }
        static void Main(String[] args)
        {
            string input_path = "../input_files/";
            string output_path = "../output_files/pdfobjects/";
            System.IO.Directory.CreateDirectory(output_path);
            string sn = "Rew1vB0TqoMIxX444UcpScARWdhgJpsJfzmyMLR32a0+EgrCjp2NaQ==";
            string key = "8f3g1sFttW8NAgfSNv+BvaJWy4Pp8flcm7ncNDkdvCCO4JwUFbGLyZdujReMaiplbYJwwxam3lr7uHtQaEf0xTSu8j2ZBdrZ8FS4OQkEUjOI9UEGb3Ic0GqmlP9T9OnSItOYqoZZA/OnYg5EaVP+c/ha32nUquOk+5riEdhYgINAZDdgJkPc+YSWsrfixOIROf6t34j3eRcyFnOY0MS7tSXi1AEPE0VZdyu+5bfmBSGvLI+WR5lQ+oOQR5hRGwqf990WEdBelNO7dxhZELVhEZ+/L60PpDf5y9A8qmrY6PiEU8nhqIyLpks0BxeIsYyZ3Cr82jjfbItPGyEARsIVzluBSgVMD4oGjojz8T6wGDEXUbmZH/pra94XAs8wZ28mzbmIEppWnhBqX0c6Ov8iXCfFfUZr4KNuPxMEgk4VOYTMOd70GEjGnylivw18hbn7ZpkWh2Zql+uU2HejvOgn+WHvT0HF9NhK0Xb5vH8aFkgBP92PJx8obIbxBVeeExczxvsqWufuPdXS2sPNIgMYZ2TtvqVVsiUToeGB2FQo09fzZOSH5Vi18u/siyvC3FmjeMf4+OYWPuDPNCcrb21NgcHam7XI8AAoGLTGtLLWR+fxynbBBcg2d2ZPcZ5CMFIfOBHRWCkcA0sDT3cl9nsBppHNJze/jVxHy+lREeQEA/etSIgohTGAWW3ZlpibRXqMxlmVWEPifCubbWTzQ6U54mRMpW2UghH3gvCNFNgdday3Av7EtlIJOdUuiMq3zmmd5J4Jt4C82CKnVewA0DtZ4EEtwRG9IYuLrfpuZlnjBAtoeXRV1lqUZ6BcCe0E3m9jO28sGkALuIeJQ74XG7X8lMC7lMWWQYiYD7D6G9QT6X3qV4vXJwNKRKpYc/rI+amEawTSnDYAMEaYPwtZ0rb/7BL+atsZZaI+ncebdfVfjDJZbCZAc+JnkuNlUn2xrNRuObw8h/G0lm2pNOEJ10S8R4+yplo5B1QmC2dCDhaTaW67QJPqnJPKbVmjw7i6KGBi+CDP3JnAKlOX/YUu8uk56JfeQUuGcQg/KaBMGctnchH2n1i3+oGbibhurQj22+OO66Q6mijKoCRP/QJm5WTGcO4c0iVX0B8dIlai/uv/pGU8Wps9MxysH5ViVIj56LWKuNfy1FNO9+wx4iHYnUxfW0Iccq3YJYAlOBkMv8VZIJl9aTEEFJ626LJEw/UbEBdR9CdlwnylPf4RuNW/lcGYMgq3xNVpp/bzYKwZivvQOFgMdX1tv8D33SHvAm3zrRCU+v94BJXnBi9k25fnKsc705IMwv+I6bueXA+mDnagj1oTqsWXZ0WnPAYI3WUO7sBf7XUH230wfYXnTSVhujJxiEP/2oWqi2813gtQkKwz9N2p6yT8Vsh3+BaAwwDvtOZMJKUFcabTBSL6NoouzmzwItJ4mIboT6KXaef66rs8jCU=";
            // Initialize library
            ErrorCode error_code = Library.Initialize(sn, key);
            if (error_code != ErrorCode.e_ErrSuccess)
                Console.WriteLine("Library Initialize Error: {0}\n", error_code);

            try
            {
                String input_file = input_path + "pdfobjects.pdf";
                using (PDFDoc doc = new PDFDoc(input_file))
                {
                    doc.Load(null);

                    // Do some operation about PDF object.
                    ObjectOperation(doc);
                    String save_pdf_patth = output_path + "pdfobjects_addnewobjects.pdf";
                    doc.StartSaveAs(save_pdf_patth, (int)PDFDoc.SaveFlags.e_SaveFlagNoOriginal, null);

                    // To remove some properties from catalog dictionary.
                    RemoveCatalogKey(doc);
                    save_pdf_patth = output_path + "pdfobjects_removekeyfromcatalog.pdf";
                    doc.StartSaveAs(save_pdf_patth, (int)PDFDoc.SaveFlags.e_SaveFlagNoOriginal, null);
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Library.Release();
        }
    }
}
