// 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 print PDF pages.

using System;
using System.Drawing.Printing;

using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using System.Runtime.InteropServices;

namespace pdfprintCS
{
    class pdfprint
    {
        private const int HORZRES = 8;
        private const int VERTRES = 10;
        private const int SP_ERROR = -1;

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern IntPtr CreateDC(
            string lp_sz_driver,
            string lp_sz_device,
            string lp_sz_output,
            IntPtr lp_init_data
         );

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.I4)]
            public int cbSize;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpszDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpszOutput;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpszDatatype;
            [MarshalAs(UnmanagedType.I4)]
            public int fwType;
        }

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        public static extern int StartDocA(IntPtr hdc, [In, MarshalAs(UnmanagedType.LPStruct)]DOCINFOA docinfo);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        public static extern int StartPage(IntPtr hdc);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        public static extern int GetDeviceCaps(IntPtr hdc, int index);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        public static extern int EndDoc(IntPtr hdc);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        public static extern int EndPage(IntPtr hdc);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        public static extern bool DeleteDC(IntPtr hdc);

        static void Main(string[] args)
        {
            string input_path = "../input_files/";
            string output_path = "../output_files/pdf2image/";
            System.IO.Directory.CreateDirectory(output_path);

            // Initialize library
            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=";
 
            ErrorCode error_code = Library.Initialize(sn, key);
            if (error_code != ErrorCode.e_ErrSuccess)
            {
                Console.WriteLine("Library Initialize Error: {0}\n", error_code);
                return;
            }
            try
            {
                PrintDocument fPrintDoc = new PrintDocument();
                IntPtr dc = CreateDC("", fPrintDoc.PrinterSettings.PrinterName, "", (IntPtr)null);

                string input_file = input_path + "annotations.pdf";
                // Load PDF document
                using (PDFDoc doc = new PDFDoc(input_file))
                {
                    error_code = doc.Load(null);
                    if (error_code != ErrorCode.e_ErrSuccess)
                    {
                        Console.WriteLine("The PDFDoc [{0}] Error: {1}\n", input_file, error_code);
                        Library.Release();
                        return;
                    }

                    DOCINFOA doc_info = new DOCINFOA();
                    doc_info.lpszDocName = "document.pdf";
                    doc_info.lpszOutput = null;
                    doc_info.fwType = 0;

                    int nError = StartDocA(dc, doc_info);
                    if (nError == SP_ERROR) return;

                    int nPageCount = doc.GetPageCount();
                    for (int i = 0; i < nPageCount; i++)
                    {
                        using (PDFPage page = doc.GetPage(i))
                        {
                            // Parse page.
                            page.StartParse((int)foxit.pdf.PDFPage.ParseFlags.e_ParsePageNormal, null, false);

                            int width = (int)(page.GetWidth());
                            int height = (int)(page.GetHeight());

                            nError = StartPage(dc);
                            if (nError == SP_ERROR) continue;

                            float device_width = (float)GetDeviceCaps(dc, HORZRES);
                            float device_height = (float)GetDeviceCaps(dc, VERTRES);

                            float x_scale = device_width / width;
                            float y_scale = device_height / height;

                            float scale = x_scale < y_scale ? x_scale : y_scale;
                            float x_offset = 0.0f;
                            float y_offset = 0.0f;
                            if (x_scale < y_scale)
                            {
                                y_offset = (device_height - scale * height) / 2;
                                device_height = scale * height;
                            }
                            else
                            {
                                x_offset = (device_width - scale * width) / 2;
                                device_width = scale * width;
                            }

                            Matrix2D matrix = page.GetDisplayMatrix((int)x_offset, (int)y_offset, (int)device_width, (int)device_height, page.GetRotation());

                            // Render page
                            using (Renderer render = new Renderer(dc, fPrintDoc.PrinterSettings.PrinterName))
                            {
                                using (RectI clip_rect = new RectI((int)x_offset, (int)y_offset, (int)(device_width + x_offset), (int)(device_height + y_offset)))
                                {
									render.EnableForPrint(true);
                                    render.SetClipRect(clip_rect);
                                    Progressive render_prossive = render.StartRender(page, matrix, null);
                                    foxit.common.Progressive.State state = render_prossive.Continue();
                                }
                            }
                            EndPage(dc);
                        }
                    }
                    EndDoc(dc);
                }
                DeleteDC(dc);
            }
            catch (foxit.PDFException e)
            {
                Console.WriteLine(e.Message);
            }

            Library.Release();
        }
    }
}
