// 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 convert PDF files to Office(Word, Excel or PowerPoint) format files.

using System;
using System.IO;
using System.Runtime.InteropServices;
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.addon.conversion.pdf2office;

namespace pdf2officeCS
{
    public class CustomConvertCallback : ConvertCallback
    {
        public CustomConvertCallback() { }
        public override bool NeedToPause()
        {
            return true;
        }

        public override void ProgressNotify(int converted_count, int total_count)
        {
        }
    }

    class FileReader : FileReaderCallback
    {
        private FileStream file_ = null;

        public FileReader()
        {
        }

        public Boolean LoadFile(String file_path)
        {
            file_ = new FileStream(file_path, FileMode.OpenOrCreate);
            return true;
        }

        public override long GetSize()
        {
            return file_.Length;
        }

        public override bool ReadBlock(IntPtr buffer, long offset, uint size)
        {
            int read_size = 0;
            file_.Seek(offset, SeekOrigin.Begin);
            byte[] array = new byte[size + 1];
            read_size = file_.Read(array, 0, (int)size);
            Marshal.Copy(array, 0, buffer, (int)size);
            return read_size == size ? true : false;
        }

        public override void Release()
        {
            this.file_.Close();
        }
    }

    class FileStreamCallback : StreamCallback
    {
        private FileStream file_ = null;
        private int ref_ = 0;
        private long cur_pos_ = 0;
        public Boolean LoadFile(String file_path)
        {
            file_ = new FileStream(file_path, FileMode.Create);
            return true;
        }

        public override bool Flush() {
            this.file_.Flush();
            return true;
        }

        public override long GetPosition() {
            return cur_pos_;
        }
        public override long GetSize() {
            return file_.Length;
        }
        public override bool IsEOF() {
            return cur_pos_ < file_.Length ? false : true;
        }

        public override bool ReadBlock(IntPtr buffer, long offset, uint size) {
            if (file_ == null)
                return false;
            file_.Seek(offset, SeekOrigin.Begin);
            byte[] ys = new byte[size];
            file_.Read(ys, (int)offset, (int)size);
            Marshal.Copy(buffer, ys, 0, (int)size);

            cur_pos_ = offset + size;
            return true;
        }

        public override uint ReadBlock(IntPtr buffer, uint size) {
            if (false == ReadBlock(buffer, 0, size)) return 0;
            return size;
        }

        public override StreamCallback Retain() {
            ref_++;
            return this;
        }

        public override bool WriteBlock(IntPtr buffer, long offset, uint size) {
            if (file_ == null)
                return false;
            file_.Seek(offset, SeekOrigin.Begin);

            byte[] ys = new byte[size];
            Marshal.Copy(buffer, ys, 0, (int)size);
            file_.Write(ys, (int)0, (int)size);

            cur_pos_ = offset + size;
            return true;
        }

        public override void Release()
        {
            if (file_ == null) return;
            ref_--;
            if (ref_ > 0) return;
            this.file_.Close();
        }
    }

    class pdf2office
    {
        private const string input_path = "../input_files/";
        private const string output_path = "../output_files/pdf2office/";

        static void Main(string[] args)
        {
            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)
            {
                if (ErrorCode.e_ErrInvalidLicense == error_code)
                    Console.WriteLine("[Failed] Current used Foxit PDF Conversion SDK key information is invalid.");
                else
                    Console.WriteLine("Library Initialize Error: {0}", error_code);
                return;
            }

            try
            {
                string library_path = "";   //Please ensure the path is valid.
                string engine_path = "";    //If you use engine to convert PDF to Office, please ensure the path is valid.
                PDF2Office.Initialize(library_path, engine_path); 
                // Convert PDF file to Word format file.
                using (PDF2OfficeSettingData setting_data = new PDF2OfficeSettingData())
                {
                    using (CustomConvertCallback callback = new CustomConvertCallback())
                    {
                        using (Progressive progressive = PDF2Office.StartConvertToWord(input_path + "word.pdf", null, output_path + "pdf2word_result.docx", setting_data, callback))
                        {
                            if (progressive.GetRateOfProgress() != 100)
                            {
                                Progressive.State state = Progressive.State.e_ToBeContinued;
                                while (Progressive.State.e_ToBeContinued == state)
                                {
                                    state = progressive.Continue();
                                }
                            }
                            Console.WriteLine("Convert PDF file to Word format file with path.");
                        }
                    }

                    using (CustomConvertCallback callback = new CustomConvertCallback())
                    {
                        using (FileReader filereadercallback = new FileReader())
                        using (FileStreamCallback fileStreamcallback = new FileStreamCallback())
                        {
                            filereadercallback.LoadFile(input_path + "word.pdf");
                            fileStreamcallback.LoadFile(output_path + "pdf2word_stream_result.docx");
                            using (Progressive progressive = PDF2Office.StartConvertToWord(filereadercallback, null, fileStreamcallback, setting_data, callback))
                            {
                                if (progressive.GetRateOfProgress() != 100)
                                {
                                    Progressive.State state = Progressive.State.e_ToBeContinued;
                                    while (Progressive.State.e_ToBeContinued == state)
                                    {
                                        state = progressive.Continue();
                                    }
                                }
                                Console.WriteLine("Convert PDF file to Word format file with stream.");
                            }
                        }
                    }
                }
                // Convert PDF file to Excel format file.

                using (PDF2OfficeSettingData setting_data = new PDF2OfficeSettingData())
                {
                    using (CustomConvertCallback callback = new CustomConvertCallback())
                    {
                        using (Progressive progressive = PDF2Office.StartConvertToExcel(input_path + "excel.pdf", null, output_path + "pdf2excel_result.xlsx", setting_data, callback))
                        {
                            if (progressive.GetRateOfProgress() != 100)
                            {
                                Progressive.State state = Progressive.State.e_ToBeContinued;
                                while (Progressive.State.e_ToBeContinued == state)
                                {
                                    state = progressive.Continue();
                                }
                            }
                            Console.WriteLine("Convert PDF file to Excel format file with path.");
                        }
                    }

                    using (CustomConvertCallback callback = new CustomConvertCallback())
                    {
                        using (FileReader filereadercallback = new FileReader())
                        using (FileStreamCallback fileStreamcallback = new FileStreamCallback())
                        {
                            filereadercallback.LoadFile(input_path + "excel.pdf");
                            fileStreamcallback.LoadFile(output_path + "pdf2excel_stream_result.xlsx");
                            using (Progressive progressive = PDF2Office.StartConvertToExcel(filereadercallback, null, fileStreamcallback, setting_data, callback))
                            {
                                if (progressive.GetRateOfProgress() != 100)
                                {
                                    Progressive.State state = Progressive.State.e_ToBeContinued;
                                    while (Progressive.State.e_ToBeContinued == state)
                                    {
                                        state = progressive.Continue();
                                    }
                                }
                                Console.WriteLine("Convert PDF file to Excel format file with stream.");
                            }
                        }
                    }
                }
                // Convert PDF file to PowerPoint format file.
                using (PDF2OfficeSettingData setting_data = new PDF2OfficeSettingData())
                {
                    using (CustomConvertCallback callback = new CustomConvertCallback())
                    {
                        using (Progressive progressive = PDF2Office.StartConvertToPowerPoint(input_path + "powerpoint.pdf", null, output_path + "pdf2powerpoint_result.pptx", setting_data, callback))
                        {
                            if (progressive.GetRateOfProgress() != 100)
                            {
                                Progressive.State state = Progressive.State.e_ToBeContinued;
                                while (Progressive.State.e_ToBeContinued == state)
                                {
                                    state = progressive.Continue();
                                }
                            }
                            Console.WriteLine("Convert PDF file to PowerPoint format file with path.");
                        }
                    }

                    using (CustomConvertCallback callback = new CustomConvertCallback())
                    {
                        using (FileReader filereadercallback = new FileReader())
                        using (FileStreamCallback fileStreamcallback = new FileStreamCallback())
                        {
                            filereadercallback.LoadFile(input_path + "powerpoint.pdf");
                            fileStreamcallback.LoadFile(output_path + "pdf2powerPoint_stream_result.pptx");
                            using (Progressive progressive = PDF2Office.StartConvertToPowerPoint(filereadercallback, null, fileStreamcallback, setting_data, callback))
                            {
                                if (progressive.GetRateOfProgress() != 100)
                                {
                                    Progressive.State state = Progressive.State.e_ToBeContinued;
                                    while (Progressive.State.e_ToBeContinued == state)
                                    {
                                        state = progressive.Continue();
                                    }
                                }
                                Console.WriteLine("Convert PDF file to PowerPoint format file with stream.");
                            }
                        }
                    }
                }
				PDF2Office.Release();
            }
            catch (PDFException e)
            {
                switch (e.GetErrorCode())
                {
                    case ErrorCode.e_ErrNoPDF2OfficeModuleRight:
                        Console.WriteLine("[Failed] Conversion module is not contained in current Foxit PDF Conversion SDK keys.");
                        break;
                    default:
                        Console.WriteLine(e.Message);
                        break;
                }
}
Library.Release();
        }
    }
}
