예제 #1
0
        /// <summary>
        /// Sets the stdio and display device callback handlers.
        /// </summary>
        /// <param name="stdIO">Stdio callback handler.</param>
        /// <param name="displayDevice">DisplayDevice callback handler.</param>
        public void Setup(GhostscriptStdIO stdIO, GhostscriptDisplayDeviceHandler displayDevice)
        {
            // check if we need to set stdio handler
            if (stdIO != null)
            {
                // check if stdio handler is not already set
                if (_stdIO == null)
                {
                    // GSAPI: set the stdio callback handlers
                    int rc_stdio = _gs.gsapi_set_stdio(_gs_instance,
                                                       stdIO != null ? stdIO._std_in : null,
                                                       stdIO != null ? stdIO._std_out : null,
                                                       stdIO != null ? stdIO._std_err : null);

                    // check if the stdio callback handlers are set correctly
                    if (ierrors.IsError(rc_stdio))
                    {
                        throw new GhostscriptAPICallException("gsapi_set_stdio", rc_stdio);
                    }

                    // remember it
                    _stdIO = stdIO;
                }
                else
                {
                    throw new GhostscriptException("StdIO callback handler is already set.");
                }
            }

            // check if a custom display device needs to be used
            if (displayDevice != null)
            {
                // check if display device is already set
                if (_displayDevice == null)
                {
                    // allocate a memory for the display device callback handler
                    _displayDevice_callback_handle = Marshal.AllocCoTaskMem(displayDevice._callback.size);

                    // copy display device callback structure content to the pre-allocated block of memory
                    Marshal.StructureToPtr(displayDevice._callback, _displayDevice_callback_handle, true);

                    // GSAPI: set the display device callback handler
                    int rc_dev = _gs.gsapi_set_display_callback(_gs_instance, _displayDevice_callback_handle);

                    // check if the display callback handler is set correctly
                    if (ierrors.IsError(rc_dev))
                    {
                        throw new GhostscriptAPICallException("gsapi_set_display_callback", rc_dev);
                    }

                    // remember it
                    _displayDevice = displayDevice;
                }
                else
                {
                    throw new GhostscriptException("DisplayDevice callback is already set!");
                }
            }
        }
예제 #2
0
        public void StartProcessing(GhostscriptDevice device, GhostscriptStdIO stdIO_callback)
        {
            if (device == null)
            {
                throw new ArgumentNullException("device");
            }

            this.StartProcessing(device.GetSwitches(), stdIO_callback);
        }
예제 #3
0
        public GhostscriptRasterizer(GhostscriptStdIO stdIo)
        {
            _viewer = new GhostscriptViewer();
            _viewer.ShowPageAfterOpen = false;
            _viewer.ProgressiveUpdate = false;
            _viewer.DisplayPage      += new GhostscriptViewerViewEventHandler(_viewer_DisplayPage);

            if (stdIo != null)
            {
                _viewer.AttachStdIO(stdIo);
            }
        }
        public GhostscriptRasterizer(GhostscriptStdIO stdIo)
        {
            _viewer = new GhostscriptViewer();
            _viewer.ShowPageAfterOpen = false;
            _viewer.ProgressiveUpdate = false;
            _viewer.DisplayPage += new GhostscriptViewerViewEventHandler(_viewer_DisplayPage);

            if (stdIo != null)
            {
                _viewer.AttachStdIO(stdIo);
            }
        }
예제 #5
0
        /// <summary>
        /// Run Ghostscript.
        /// </summary>
        /// <param name="args">Command arguments</param>
        /// <param name="stdIO_callback">StdIO callback, can be set to null if you dont want to handle it.</param>
        public void Process(string[] args, GhostscriptStdIO stdIO_callback)
        {
            IntPtr instance = IntPtr.Zero;

            int rc_ins = _gs.gsapi_new_instance(out instance, IntPtr.Zero);

            if (ierrors.IsError(rc_ins))
            {
                throw new GhostscriptAPICallException("gsapi_new_instance", rc_ins);
            }

            try
            {
                _stdIO_Callback = stdIO_callback;

                _internalStdIO_Callback = new GhostscriptProcessorInternalStdIOHandler(
                    new StdInputEventHandler(OnStdIoInput),
                    new StdOutputEventHandler(OnStdIoOutput),
                    new StdErrorEventHandler(OnStdIoError));

                int rc_stdio = _gs.gsapi_set_stdio(instance,
                                                   _internalStdIO_Callback._std_in,
                                                   _internalStdIO_Callback._std_out,
                                                   _internalStdIO_Callback._std_err);

                if (ierrors.IsError(rc_stdio))
                {
                    throw new GhostscriptAPICallException("gsapi_set_stdio", rc_stdio);
                }

                int rc_init = _gs.gsapi_init_with_args(instance, args.Length, args);

                if (ierrors.IsErrorIgnoreQuit(rc_init))
                {
                    throw new GhostscriptAPICallException("gsapi_init_with_args", rc_init);
                }

                int rc_exit = _gs.gsapi_exit(instance);

                if (ierrors.IsErrorIgnoreQuit(rc_exit))
                {
                    throw new GhostscriptAPICallException("gsapi_exit", rc_exit);
                }
            }
            finally
            {
                _gs.gsapi_delete_instance(instance);
            }
        }
예제 #6
0
        public void Setup(GhostscriptStdIO stdIO, GhostscriptDisplayDevice displayDevice)
        {
            if (stdIO != null)
            {
                if (_stdIO == null)
                {
                    int rc_stdio = _gs.gsapi_set_stdio(_gs_instance,
                                                       stdIO != null ? stdIO._std_in : null,
                                                       stdIO != null ? stdIO._std_out : null,
                                                       stdIO != null ? stdIO._std_err : null);

                    if (ierrors.IsError(rc_stdio))
                    {
                        throw new GhostscriptAPICallException("gsapi_set_stdio", rc_stdio);
                    }

                    _stdIO = stdIO;
                }
                else
                {
                    throw new GhostscriptException("StdIO callback is already set!");
                }
            }

            if (displayDevice != null)
            {
                if (_displayDevice == null)
                {
                    _displayDevice_callback_handle = Marshal.AllocCoTaskMem(displayDevice._callback.size);

                    Marshal.StructureToPtr(displayDevice._callback, _displayDevice_callback_handle, true);

                    int rc_dev = _gs.gsapi_set_display_callback(_gs_instance, _displayDevice_callback_handle);

                    if (ierrors.IsError(rc_dev))
                    {
                        throw new GhostscriptAPICallException("gsapi_set_display_callback", rc_dev);
                    }

                    _displayDevice = displayDevice;
                }
                else
                {
                    throw new GhostscriptException("DisplayDevice callback is already set!");
                }
            }
        }
예제 #7
0
 public void AttachStdIO(GhostscriptStdIO stdIoCallback)
 {
     _stdIoCallback = stdIoCallback;
 }
예제 #8
0
        /// <summary>
        /// Run Ghostscript.
        /// </summary>
        /// <param name="args">Command arguments</param>
        /// <param name="stdIO_callback">StdIO callback, can be set to null if you dont want to handle it.</param>
        public void StartProcessing(string[] args, GhostscriptStdIO stdIO_callback)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            if (args.Length < 3)
            {
                throw new ArgumentOutOfRangeException("args");
            }

            for (int i = 0; i < args.Length; i++)
            {
                args[i] = System.Text.Encoding.Default.GetString(System.Text.Encoding.UTF8.GetBytes(args[i]));
            }

            _isRunning = true;

            IntPtr instance = IntPtr.Zero;

            int rc_ins = _gs.gsapi_new_instance(out instance, IntPtr.Zero);

            if (ierrors.IsError(rc_ins))
            {
                throw new GhostscriptAPICallException("gsapi_new_instance", rc_ins);
            }

            try
            {
                _stdIO_Callback = stdIO_callback;

                _internalStdIO_Callback = new GhostscriptProcessorInternalStdIOHandler(
                                                new StdInputEventHandler(OnStdIoInput), 
                                                new StdOutputEventHandler(OnStdIoOutput), 
                                                new StdErrorEventHandler(OnStdIoError));

                int rc_stdio = _gs.gsapi_set_stdio(instance,
                                        _internalStdIO_Callback._std_in,
                                        _internalStdIO_Callback._std_out,
                                        _internalStdIO_Callback._std_err);

                _poolCallBack = new gsapi_pool_callback(Pool);

                int rc_pool = _gs.gsapi_set_poll(instance, _poolCallBack);

                if (ierrors.IsError(rc_pool))
                {
                    throw new GhostscriptAPICallException("gsapi_set_poll", rc_pool);

                }

                if (ierrors.IsError(rc_stdio))
                {
                    throw new GhostscriptAPICallException("gsapi_set_stdio", rc_stdio);
                }

                this.OnStarted(new GhostscriptProcessorEventArgs());

                _stopProcessing = false;

                if (_gs.is_gsapi_set_arg_encoding_supported)
                {
                    int rc_enc = _gs.gsapi_set_arg_encoding(instance, GS_ARG_ENCODING.UTF8);
                }

                int rc_init = _gs.gsapi_init_with_args(instance, args.Length, args);

                if (ierrors.IsErrorIgnoreQuit(rc_init))
                {
                    if (!ierrors.IsInterrupt(rc_init))
                    {
                        throw new GhostscriptAPICallException("gsapi_init_with_args", rc_init);
                    }
                }

                int rc_exit = _gs.gsapi_exit(instance);

                if (ierrors.IsErrorIgnoreQuit(rc_exit))
                {
                    throw new GhostscriptAPICallException("gsapi_exit", rc_exit);
                }
            }
            finally
            {
                _gs.gsapi_delete_instance(instance);

                GC.Collect();

                _isRunning = false;

                this.OnCompleted(new GhostscriptProcessorEventArgs());
            }
        }
예제 #9
0
        public void StartProcessing(GhostscriptDevice device, GhostscriptStdIO stdIO_callback)
        {
            if (device == null)
            {
                throw new ArgumentNullException("device");
            }

            this.StartProcessing(device.GetSwitches(), stdIO_callback);
        }
예제 #10
0
 public void Process(string[] args, GhostscriptStdIO stdIO_callback)
 {
     this.StartProcessing(args, stdIO_callback);
 }
예제 #11
0
 public void Process(GhostscriptDevice device, GhostscriptStdIO stdIO_callback)
 {
     this.StartProcessing(device, stdIO_callback);
 }
예제 #12
0
        /// <summary>
        /// Run Ghostscript.
        /// </summary>
        /// <param name="args">Command arguments</param>
        /// <param name="stdIO_callback">StdIO callback, can be set to null if you dont want to handle it.</param>
        public void StartProcessing(string[] args, GhostscriptStdIO stdIO_callback)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            if (args.Length < 3)
            {
                throw new ArgumentOutOfRangeException("args");
            }

            for (int i = 0; i < args.Length; i++)
            {
                args[i] = System.Text.Encoding.Default.GetString(System.Text.Encoding.UTF8.GetBytes(args[i]));
            }

            _isRunning = true;

            IntPtr instance = IntPtr.Zero;

            int rc_ins = _gs.gsapi_new_instance(out instance, IntPtr.Zero);

            if (ierrors.IsError(rc_ins))
            {
                throw new GhostscriptAPICallException("gsapi_new_instance", rc_ins);
            }

            try
            {
                _stdIO_Callback = stdIO_callback;

                _internalStdIO_Callback = new GhostscriptProcessorInternalStdIOHandler(
                    new StdInputEventHandler(OnStdIoInput),
                    new StdOutputEventHandler(OnStdIoOutput),
                    new StdErrorEventHandler(OnStdIoError));

                int rc_stdio = _gs.gsapi_set_stdio(instance,
                                                   _internalStdIO_Callback._std_in,
                                                   _internalStdIO_Callback._std_out,
                                                   _internalStdIO_Callback._std_err);

                _poolCallBack = new gsapi_pool_callback(Pool);

                int rc_pool = _gs.gsapi_set_poll(instance, _poolCallBack);

                if (ierrors.IsError(rc_pool))
                {
                    throw new GhostscriptAPICallException("gsapi_set_poll", rc_pool);
                }

                if (ierrors.IsError(rc_stdio))
                {
                    throw new GhostscriptAPICallException("gsapi_set_stdio", rc_stdio);
                }

                this.OnStarted(new GhostscriptProcessorEventArgs());

                _stopProcessing = false;

                if (_gs.is_gsapi_set_arg_encoding_supported)
                {
                    int rc_enc = _gs.gsapi_set_arg_encoding(instance, GS_ARG_ENCODING.UTF8);
                }

                int rc_init = _gs.gsapi_init_with_args(instance, args.Length, args);

                if (ierrors.IsErrorIgnoreQuit(rc_init))
                {
                    if (!ierrors.IsInterrupt(rc_init))
                    {
                        throw new GhostscriptAPICallException("gsapi_init_with_args", rc_init);
                    }
                }

                int rc_exit = _gs.gsapi_exit(instance);

                if (ierrors.IsErrorIgnoreQuit(rc_exit))
                {
                    throw new GhostscriptAPICallException("gsapi_exit", rc_exit);
                }
            }
            finally
            {
                _gs.gsapi_delete_instance(instance);

                GC.Collect();

                _isRunning = false;

                this.OnCompleted(new GhostscriptProcessorEventArgs());
            }
        }
예제 #13
0
 public void Process(string[] args, GhostscriptStdIO stdIO_callback)
 {
     this.StartProcessing(args, stdIO_callback);
 }
예제 #14
0
 public void Process(GhostscriptDevice device, GhostscriptStdIO stdIO_callback)
 {
     this.StartProcessing(device, stdIO_callback);
 }
예제 #15
0
 public void AttachStdIO(GhostscriptStdIO stdIoCallback)
 {
     _stdIoCallback = stdIoCallback;
 }
        /// <summary>
        /// Sets the stdio and display device callback handlers.
        /// </summary>
        /// <param name="stdIO">Stdio callback handler.</param>
        /// <param name="displayDevice">DisplayDevice callback handler.</param>
        public void Setup(GhostscriptStdIO stdIO, GhostscriptDisplayDeviceHandler displayDevice)
        {
            // check if we need to set stdio handler
            if (stdIO != null)
            {
                // check if stdio handler is not already set
                if (_stdIO == null)
                {
                    // GSAPI: set the stdio callback handlers
                    int rc_stdio = _gs.gsapi_set_stdio(_gs_instance,
                                            stdIO != null ? stdIO._std_in : null,
                                            stdIO != null ? stdIO._std_out : null,
                                            stdIO != null ? stdIO._std_err : null);

                    // check if the stdio callback handlers are set correctly
                    if (ierrors.IsError(rc_stdio))
                    {
                        throw new GhostscriptAPICallException("gsapi_set_stdio", rc_stdio);
                    }

                    // remember it
                    _stdIO = stdIO;
                }
                else
                {
                    throw new GhostscriptException("StdIO callback handler is already set.");
                }
            }

            // check if a custom display device needs to be used
            if (displayDevice != null)
            {
                // check if display device is already set
                if (_displayDevice == null)
                {
                    // allocate a memory for the display device callback handler
                    _displayDevice_callback_handle = Marshal.AllocCoTaskMem(displayDevice._callback.size);

                    // copy display device callback structure content to the pre-allocated block of memory
                    Marshal.StructureToPtr(displayDevice._callback, _displayDevice_callback_handle, true);

                    // GSAPI: set the display device callback handler
                    int rc_dev = _gs.gsapi_set_display_callback(_gs_instance, _displayDevice_callback_handle);

                    // check if the display callback handler is set correctly
                    if (ierrors.IsError(rc_dev))
                    {
                        throw new GhostscriptAPICallException("gsapi_set_display_callback", rc_dev);
                    }

                    // remember it
                    _displayDevice = displayDevice;

                }
                else
                {
                    throw new GhostscriptException("DisplayDevice callback is already set!");
                }
            }

        }
        /// <summary>
        /// Run Ghostscript.
        /// </summary>
        /// <param name="args">Command arguments</param>
        /// <param name="stdIO_callback">StdIO callback, can be set to null if you dont want to handle it.</param>
        public void StartProcessing(string[] args, GhostscriptStdIO stdIO_callback = null)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            if (args.Length < 3)
            {
                throw new ArgumentOutOfRangeException("args");
            }

            for (int i = 0; i < args.Length; i++)
            {
                args[i] = System.Text.Encoding.Default.GetString(System.Text.Encoding.UTF8.GetBytes(args[i]));
            }

            _isRunning = true;

            IntPtr instance = IntPtr.Zero;

            int rc_ins = _gs.gsapi_new_instance(out instance, IntPtr.Zero);

            if (ierrors.IsError(rc_ins))
            {
                throw new GhostscriptAPICallException("gsapi_new_instance", rc_ins, _internalStdIO_Callback);
            }

            try
            {
                _stdIO_Callback = stdIO_callback;

                _internalStdIO_Callback = new GhostscriptProcessorInternalStdIOHandler(
                    new StdInputEventHandler(OnStdIoInput),
                    new StdOutputEventHandler(OnStdIoOutput),
                    new StdErrorEventHandler(OnStdIoError));

                int rc_stdio = _gs.gsapi_set_stdio(instance,
                                                   _internalStdIO_Callback._std_in,
                                                   _internalStdIO_Callback._std_out,
                                                   _internalStdIO_Callback._std_err);

                _poolCallBack = new gsapi_pool_callback(Pool);

                int rc_pool = _gs.gsapi_set_poll(instance, _poolCallBack);

                if (ierrors.IsError(rc_pool))
                {
                    throw new GhostscriptAPICallException("gsapi_set_poll", rc_pool, _internalStdIO_Callback);
                }

                if (ierrors.IsError(rc_stdio))
                {
                    throw new GhostscriptAPICallException("gsapi_set_stdio", rc_stdio, _internalStdIO_Callback);
                }

                this.OnStarted(new GhostscriptProcessorEventArgs());

                _stopProcessing = false;

                if (_gs.is_gsapi_set_arg_encoding_supported)
                {
                    int rc_enc = _gs.gsapi_set_arg_encoding(instance, GS_ARG_ENCODING.UTF8);
                }

                int rc_init = _gs.gsapi_init_with_args(instance, args.Length, args);

                if (ierrors.IsErrorIgnoreQuit(rc_init))
                {
                    if (!ierrors.IsInterrupt(rc_init))
                    {
                        throw new GhostscriptAPICallException("gsapi_init_with_args", rc_init, _internalStdIO_Callback);
                    }
                }
            }
            finally
            {
                // gsapi_exit() :
                //
                // Exit the interpreter. This MUST be called on shutdown if gsapi_init_with_args() has been called, and just before gsapi_delete_instance().
                //
                // ^^^ that's from the docs at https://ghostscript.com/doc/9.52/API.htm#exit (emphasis mine): it's placed in the `finally` clause
                // section here to ensure it is called when rc_init == e_Fatal (or other error) occurs and throws an exception in the code chunk above.
                try
                {
                    int rc_exit = _gs.gsapi_exit(instance);

                    if (ierrors.IsErrorIgnoreQuit(rc_exit))
                    {
                        throw new GhostscriptAPICallException("gsapi_exit", rc_exit, _internalStdIO_Callback);
                    }
                }
                finally
                {
                    _gs.gsapi_delete_instance(instance);

                    GC.Collect();

                    _isRunning = false;

                    this.OnCompleted(new GhostscriptProcessorEventArgs());
                }
            }
        }