// 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 Conversion 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 Conversion 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.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_ = 1;
        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 = "P3UzPXKJGf7OHTSbhZ6tlBV431IfR0JhCBZo/XUOrENG7KfnzSYbZQ==";
            string key = "LTceEOhprTpgi0mLVrxVJm5hqR99zNi1ZCtecxHwMXEuEdHxIQbDJonAF2d37PmvGSN6/PbNarMuKcHQThgXJNojhT75ZAjj166X09vSA51spwLdwH0ykA+v+q+AsQSod/Ib4LZ0i9BkazwVDe0Odn8crtBo7/+0yc5a/mWzNrFdoDMs17PpYQ0LBc6SKD+CAjTzv5oPSaJPU/IGgA2mJTHqNrgacs6IDVJs8rXuDSKVyRZKni//QpBOMCvxkYg9QhIluwBHkbJYtzCJO7ClQrwXq7CJTK46jB6ZNyGX1UFLX+Jt9U6MbBeNPrNvqMaCxkySz92mp+hIxWaVKfWUMT0o7teeScZif9fA58wixmblBm8FuZ1L1+OP9dfwp73vgd3srp28KBt6xZK+MhltDT6QQZlFcLJulFIPaU3+ZvyvOWrEI8ffd3TGHg7/VA8F2uJpz1inLxBF2+NwK+4uD0zVyvBrLS3Z1VgCh22l1XleaUbpBzjcKt0YMxa4tKJpBKUx9FZwwLCKvEb8DJuZ4PMLRSbLv6MVGzR4EZce0opAPxSHdiaxYMONX1K5HOR4uMH6RuncTAXGjEnNB2El3pk5Gw7+a1SlR2rIEKyTLzV4EXnC3eDSPAIufLlrNA8zUOAPvBaMCjCyMlDospzAf0FJwWVhn12zC3PRzq+kiFijLX+XvenWaAlR26NKMXjqySFXQQMxFtN7+Q9ppdxh05h3C7vXcLnD+eXU/vNOWwV0ymMsomQobDnkR8qrcNJkM3/IysaxaszU+4w2EAtYadZ542+LaSpW8YlvM0HqXdtBG7tx/a0qSBFZxSsr+MQZZzpJFZj3VrEakiwuVRztFGLqudrPYWC0HecrcQLO+SGF0kEcpaNZ+ydmveXlpsaIgwro/mzeZHqxFQ8n3W8xHO2bL5CE6KGLwCMZECgnXbLI7SWfuuWOxlkkbxRW1nFA4/VbLWgR7mC2Ax7R5qZd/q3Pzp8s4L0S2Hym2g/3OdjC4RF7SrXhDRWyAwICE/vKaa1nHDLv8XOiKnzz7jDeFBH2ScbfqovUiArVQyzTXxvQ7qhIxg4LatrBNv4k17p2DIRSP/hZBoFmpUEFGnqm6zC6fbkfkJ/ljbjuoTGziFwNHZ2iX//w1TJOGqDQE3Hd3rHJXWqmzpshXCrn1nn1FhbhePiIirnO12XFR2852ltgN/pQXzrZkjhzcoTTZAd6lSsj10q/8wDvOKG0ITbO34f9iO9XAm/WopOpSP2S2HoyxRJJQqbD/94ZR0Uw";
            // 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
            {
                // 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.");
                            }
                        }
                    }
                }
            }
            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();
        }
    }
}
