// 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.office2pdf;

namespace office2pdfCS
{
    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 office2pdf
    {
        private const string input_path = "../input_files/";
        private const string output_path = "../output_files/office2pdf/";

        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
      {
		string resource_folder_path = "../../../res/office2pdf";
        Office2PDFSettingData setting_data = new Office2PDFSettingData();
        setting_data.resource_folder_path = resource_folder_path;  
        // Conver Word file to PDF file.
        string word_file_path = input_path + "word.docx";
        string saved_pdf_path = output_path + "word2pdf_result.pdf";
        foxit.conversion.office2pdf.Office2PDF.ConvertFromWord(word_file_path, "", saved_pdf_path, setting_data);
        Console.WriteLine("Convert Word file to PDF file.");
        using (FileReader filereadercallback = new FileReader())
        using (FileStreamCallback fileStreamcallback = new FileStreamCallback())
        {
          filereadercallback.LoadFile(word_file_path);
          fileStreamcallback.LoadFile(output_path + "word2pdf_stream_result.pdf");
          Office2PDF.ConvertFromWord(filereadercallback, null, fileStreamcallback, setting_data);
          Console.WriteLine("Convert Word file to  PDF format file with stream.");
        }

        // Conver Excel file to PDF file.
        string excel_file_path = input_path + "excel.xlsx";
        saved_pdf_path = output_path + "excel2pdf_result.pdf";
        foxit.conversion.office2pdf.Office2PDF.ConvertFromExcel(excel_file_path, "", saved_pdf_path, setting_data);
        Console.WriteLine("Convert Excel file to PDF file.");
        using (FileReader filereadercallback = new FileReader())
        using (FileStreamCallback fileStreamcallback = new FileStreamCallback())
        {
          filereadercallback.LoadFile(excel_file_path);
          fileStreamcallback.LoadFile(output_path + "excel2pdf_stream_result.pdf");
          Office2PDF.ConvertFromExcel(filereadercallback, null, fileStreamcallback, setting_data);
          Console.WriteLine("Convert Excel file to  PDF format file with stream.");
        }

        // Conver PowerPoint file to PDF file.
        string ppt_file_path = input_path + "powerpoint.pptx";
        saved_pdf_path = output_path + "ppt2pdf_result.pdf";
        foxit.conversion.office2pdf.Office2PDF.ConvertFromPowerPoint(ppt_file_path, "", saved_pdf_path, setting_data);
        Console.WriteLine("Convert PowerPoint file to PDF file.");
        using (FileReader filereadercallback = new FileReader())
        using (FileStreamCallback fileStreamcallback = new FileStreamCallback())
        {
          filereadercallback.LoadFile(ppt_file_path);
          fileStreamcallback.LoadFile(output_path + "ppt2pdf_stream_result.pdf");
          Office2PDF.ConvertFromPowerPoint(filereadercallback, null, fileStreamcallback, setting_data);
          Console.WriteLine("Convert PowerPoint  file to  PDF format file with stream.");
        }
      }
      catch (PDFException e)
      {
        switch (e.GetErrorCode())
        {
          case ErrorCode.e_ErrInvalidLicense:
            Console.WriteLine("[Failed] Conversion module is not contained in current Foxit PDF Conversion SDK keys.");
            break;
          default:
            Console.WriteLine(e.Message);
            break;
        }
      }
Library.Release();
        }
    }
}
