Gs Language Bindings
Gs Language Bindings
C#
Java
Python
All of the above languages have equivalent methods as defined in the C API. Java and C# provide additional helper methods
to make the use of the API easier for certain applications. These languages also provide example viewers that make use of
these methods.
This developer documentation is organized by programming language type and includes API reference and sample code.
The C API
Ghostscript has been in development for over thirty years and is written in C . The API has evolved over time and is continually
being developed. The language bindings into Ghostscript will attempt to mirror this evolution and match the current C API as
much as possible.
Licensing
Before using Ghostscript, please make sure that you have a valid license to do so. There are two available licenses; make sure
you pick the one whose terms you can comply with.
If your software is open source, you may use Ghostscript under the terms of the GNU Affero General Public License.
This means that all of the source code for your complete app must be released under a compatible open source license!
It also means that you may not use any proprietary closed source libraries or components in your app.
Please read the full text of the AGPL license agreement from the FSF web site
If you cannot or do not want to comply with these restrictions, you must acquire a commercial license instead.
If your project does not meet the requirements of the AGPL, please contact our sales team to discuss a commercial license.
Each Artifex commercial license is crafted based on your individual use case.
CONTACT US
Building Ghostscript
In order to use Ghostscript language bindings firstly Ghostscript must be built as a shared library for your platform.
The following built libraries are required for these respective platforms:
NOTE
The actual filenames on MacOS will be appended with the version of Ghostscript with associated symlinks.
Building on Windows
To build the required DLLs, load /windows/ghostpdl.sln into Visual Studio, and select the required architecture from the drop
down - then right click on 'ghostpdl' in the solution explorer and choose "Build".
Firstly run the autogen.sh script from the command line to create the required configuration files followed by make so to
build the shared libraries. The scripts also depend on having both autoconf and automake installed on your system. [1]
If this software is not already on your system (usually this can be found in the following location: usr/local/bin , but it could
be located elsewhere depending on your setup) then it can be installed from your OS's package system.
https://www.gnu.org/software/autoconf/
https://www.gnu.org/software/automake/
Once built, these libraries can be found in your ghostpdl/sobin/ or ghostpdl/sodebugbin location depending on your build
command.
NOTE
For full detailed instructions on how to build your Ghostscript library see here.
Demo code
About
Please locate the demos folder in your ghostpdl source code download from the GhostPDL repository to find sample code
demonstrating the language bindings in action.
C# overview
About
In the GhostPDL repository a sample C# project can be found in /demos/csharp .
Within this project the following namespaces and corresponding C# files are of relevance:
GhostAPI ghostapi.cs
GhostNET ghostnet.cs
GhostMono ghostmono.cs
Building Ghostscript
GhostAPI
GhostAPI is the main wrapper responsible for bridging over to the C library and ensuring that the correct DLLs are imported.
GhostAPI contains the ghostapi class which does not need to be instantiated as it provides public static methods.
These methods, which mirror their C counterparts, are as follows:
Method Description
gsapi_revision Returns the revision numbers and strings of the Ghostscript interpreter library
Set the callback functions for stdio , together with the handle to use in the callback
gsapi_set_stdio_with_handle
functions
Set the callback function for polling, together with the handle to pass to the callback
gsapi_set_poll_with_handle
function
gsapi_set_display_callback deprecated
Set the encoding used for the interpretation of all subsequent args supplied via the
gsapi_set_arg_encoding
gsapi interface on this instance
gsapi_set_default_device_list Set the string containing the list of default device names
Method Description
gsapi_add_control_path Add a (case sensitive) path to one of the lists of permitted paths for file access
gsapi_remove_control_path Remove a (case sensitive) path from one of the lists of permitted paths for file access
gsapi_purge_control_paths Clear all the paths from one of the lists of permitted paths for file access
GhostNET
GhostNET is the .NET interface into GhostAPI . It exemplifies how to do more complex operations involving multiple API calls
and sequences.
This project can be opened in Visual Studio and used to test the Ghostscript API alongside a UI which handles opening
PostScript and PDF files. The sample application here allows for file browsing and Ghostscript file viewing.
About
GhostAPI is the C# bridge into the Ghostscript C library.
GhostAPI contains some essential structs and enums as well as a static class for some constants, finally it contains the main
GSAPI class which holds the key methods which interface with the C library.
gsapi_revision_t
gs_set_param_type
gsEncoding
Constants
Constants are stored in the static class gsConstants for direct referencing.
gsConstants
GSAPI
gsapi_run_* and gsapi_exit methods return an int code which can be interpreted as follows:
code status
0 no error
gsConstants.E_QUIT "quit" has been executed. This is not an error. gsapi_exit must be called next
<0 error
NOTE
NOTE
All GSAPI methods aside from gsapi_revision and gsapi_new_instance should pass an instance of Ghostscript as their
first parameter with IntPtr instance
gsapi_revision
This method returns the revision numbers and strings of the Ghostscript interpreter library; you should call it before any other
interpreter library functions to make sure that the correct version of the Ghostscript interpreter has been loaded.
NOTE
The method should write to a reference variable which conforms to the struct gsapi_revision_t.
gsapi_new_instance
Creates a new instance of Ghostscript. This instance is passed to most other GSAPI methods. Unless Ghostscript has been
compiled with the GS_THREADSAFE define, only one instance at a time is supported.
public static extern int gsapi_new_instance(out IntPtr pinstance,
IntPtr caller_handle);
NOTE
gsapi_delete_instance
Destroy an instance of Ghostscript. Before you call this, Ghostscript must have finished. If Ghostscript has been initialised, you
must call gsapi_exit beforehand.
GSAPI.gsapi_delete_instance(gsInstance);
gsInstance = IntPtr.Zero;
gsapi_set_stdio_with_handle
Set the callback functions for stdio , together with the handle to use in the callback functions. The stdin callback function
should return the number of characters read, 0 for EOF, or -1 for error. The stdout and stderr callback functions should
return the number of characters written.
NOTE
These callbacks do not affect output device I/O when using "%stdout" as the output file. In that case, device output will
still be directed to the process "stdout" file descriptor, not to the stdio callback.
gsapi_set_stdio
Set the callback functions for stdio . The handle used in the callbacks will be taken from the value passed to
gsapi_new_instance. Otherwise the behaviour of this function matches gsapi_set_stdio_with_handle.
gsapi_set_poll_with_handle
Set the callback function for polling, together with the handle to pass to the callback function. This function will only be called if
the Ghostscript interpreter was compiled with CHECK_INTERRUPTS as described in gpcheck.h .
The polling function should return zero if all is well, and return negative if it wants ghostscript to abort. This is often used for
checking for a user cancel. This can also be used for handling window events or cooperative multitasking.
The polling function is called very frequently during interpretation and rendering so it must be fast. If the function is slow, then
using a counter to return 0 immediately some number of times can be used to reduce the performance impact.
gsapi_set_poll
Set the callback function for polling. The handle passed to the callback function will be taken from the handle passed to
gsapi_new_instance. Otherwise the behaviour of this function matches gsapi_set_poll_with_handle.
gsapi_set_display_callback
This call is deprecated; please use gsapi_register_callout to register a callout handler for the display device in preference.
gsapi_register_callout
gsapi_deregister_callout
This call deregisters a callout handler previously registered with gsapi_register_callout. All three arguments must match exactly
for the callout handler to be deregistered.
gsapi_set_arg_encoding
Set the encoding used for the interpretation of all subsequent arguments supplied via the GhostAPI interface on this instance.
By default we expect args to be in encoding 0 (the 'local' encoding for this OS). On Windows this means "the currently
selected codepage". On Linux this typically means utf8 . This means that omitting to call this function will leave Ghostscript
running exactly as it always has. Please note that use of the 'local' encoding is now deprecated and should be avoided in new
code. This must be called after gsapi_new_instance and before gsapi_init_with_args.
gsapi_set_default_device_list
Set the string containing the list of default device names, for example "display x11alpha x11 bbox". Allows the calling
application to influence which device(s) Ghostscript will try, in order, in its selection of the default device. This must be called
after gsapi_new_instance and before gsapi_init_with_args.
gsapi_get_default_device_list
Returns a pointer to the current default device string. This must be called after gsapi_new_instance and before
gsapi_init_with_args.
gsapi_init_with_args
To initialise the interpreter, pass your instance of Ghostscript, your argument count, argc , and your argument variables,
argv .
gsapi_run_*
If these functions return <= -100 , either quit or a fatal error has occured. You must call gsapi_exit next. The only exception is
gsapi_run_string_continue which will return gs_error_NeedInput if all is well.
There is a 64 KB length limit on any buffer submitted to a gsapi_run_* function for processing. If you have more than 65535
bytes of input then you must split it into smaller pieces and submit each in a separate gsapi_run_string_continue call.
gsapi_run_string_begin
gsapi_run_string_with_length
gsapi_run_string
gsapi_run_string_end
gsapi_run_file
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.
gsapi_set_param
Sets a parameter.
Broadly, this is equivalent to setting a parameter using -d, -s or -p on the command line. This call cannot be made during a
gsapi_run_string operation.
Parameters in this context are not the same as 'arguments' as processed by gsapi_init_with_args, but often the same thing can
be achieved. For example, with gsapi_init_with_args, we can pass "-r200" to change the resolution. Broadly the same thing can
be achieved by using gsapi_set_param to set a parsed value of "<>".
Internally, when we set a parameter, we perform an initgraphics operation. This means that using gsapi_set_param other
than at the start of a page is likely to give unexpected results.
Attempting to set a parameter that the device does not recognise will be silently ignored, and that parameter will not be found in
subsequent gsapi_get_param calls.
NOTE
The type argument, as a gs_set_param_type, dictates the kind of object that the value argument points to.
NOTE
gsapi_get_param
If an error occurs, the return value is negative. Otherwise the return value is the number of bytes required for storage of the
value. Call once with value NULL to get the number of bytes required, then call again with value pointing to at least the required
number of bytes where the value will be copied out. Note that the caller is required to know the type of value in order to get it.
For all types other than gs_spt_string, gs_spt_name, and gs_spt_parsed knowing the type means you already know the size
required.
This call retrieves parameters/values that have made it to the device. Thus, any values set using gs_spt_more_to_come without
a following call omitting that flag will not be retrieved. Similarly, attempting to get a parameter before gsapi_init_with_args has
been called will not list any, even if gsapi_set_param has been used.
Attempting to read a parameter that is not set will return gs_error_undefined (-21). Note that calling gsapi_set_param
followed by gsapi_get_param may not find the value, if the device did not recognise the key as being one of its configuration
keys.
gsapi_enumerate_params
Enumerate the current parameters. Call repeatedly to list out the current parameters.
The first call should have iter = NULL. Subsequent calls should pass the same pointer in so the iterator can be updated.
Negative return codes indicate error, 0 success, and 1 indicates that there are no more keys to read. On success, key will be
updated to point to a null terminated string with the key name that is guaranteed to be valid until the next call to
gsapi_enumerate_params. If type is non NULL then the pointer type will be updated to have the type of the parameter.
NOTE
Only one enumeration can happen at a time. Starting a second enumeration will reset the first.
The enumeration only returns parameters/values that have made it to the device. Thus, any values set using the
gs_spt_more_to_come without a following call omitting that flag will not be retrieved. Similarly, attempting to enumerate
parameters before gsapi_init_with_args has been called will not list any, even if gsapi_set_param has been used.
gsapi_add_control_path
Add a (case sensitive) path to one of the lists of permitted paths for file access.
gsapi_remove_control_path
Remove a (case sensitive) path from one of the lists of permitted paths for file access.
gsapi_purge_control_paths
Clear all the paths from one of the lists of permitted paths for file access.
gsapi_activate_path_control
Enable/Disable path control (i.e. whether paths are checked against permitted paths before access is granted).
gsapi_is_path_control_active
GSAPI also defines some prototype pointers which are defined as follows.
gs_stdio_handler
gsPollHandler
gsCallOut
/* Callout proto */
public delegate int gsCallOut(IntPtr callout_handle,
IntPtr device_name,
int id,
int size,
IntPtr data);
GhostNET
About
GhostNET is the C# interface into the GhostAPI library developed for Windows systems.
Enums
Tasks
The Ghostscript task type enum is used to inform GhostAPI of the type of operation which is being requested.
Task Description
DISPLAY_DEV_PDF Display Device task associated with PDF & XPS rendering 1
Results
Status
The parameter struct gsParamState_t allows for bundles of information to be processed by Ghostscript to complete overall
requests.
Parameters explained
Setting up your parameters (with any dedicated bespoke method(s) which your application requires) is needed when
communicating directly with GhostAPI .
When requesting Ghostscript to process an operation an application developer should send a parameter payload which defines
the details for the operation.
gsparams.inputfile = fileName;
gsparams.args.Add("gs");
gsparams.args.Add("-sDEVICE=pdfwrite");
gsparams.outputfile = Path.GetTempFileName();
gsparams.args.Add("-o" + gsparams.outputfile);
gsparams.task = GS_Task_t.PS_DISTILL;
return RunGhostscriptAsync(gsparams);
}
Here we can see a parameter payload being setup before being passed on to the asynchronous method
RunGhostscriptAsync which sets up a worker thread to run according to the task type in the payload.
GhostNET handles many common operations on an application developer's behalf, however if you require to write your own
methods to interface with GhostAPI then referring to the public methods in GhostNET is a good starting point.
GhostNET contains a public class gsEventArgs which is an extension of the C# class EventArgs. This class is used to set and
get events as they occur. GhostNET will create these payloads and deliver them back to the application layer's
ProgressCallBack method asynchronously.
GSNET
This class should be instantiated as a member variable in your application with callback definitions setup as required.
Handlers for asynchronous operations can injected by providing your own bespoke callback methods to your instance's
ProgressCallBack function.
case GS_Task_t.PS_DISTILL:
Console.WriteLine($"PS_DISTILL.outputfile:");
Console.WriteLine($"{asyncInformation.Params.result.outputfile}");
break;
case GS_Task_t.SAVE_RESULT:
break;
case GS_Task_t.DISPLAY_DEV_THUMBS:
break;
case GS_Task_t.DISPLAY_DEV_RUN_FILE:
break;
case GS_Task_t.DISPLAY_DEV_PDF:
break;
case GS_Task_t.DISPLAY_DEV_NON_PDF:
break;
default:
break;
}
// task failed
if (asyncInformation.Params.result == GS_Result_t.gsFAILED)
{
switch (asyncInformation.Params.task)
{
case GS_Task_t.CREATE_XPS:
break;
case GS_Task_t.PS_DISTILL:
break;
case GS_Task_t.SAVE_RESULT:
break;
default:
break;
}
return;
}
// task cancelled
if (asyncInformation.Params.result == GS_Result_t.gsCANCELLED)
{
}
}
else // task is still running
{
switch (asyncInformation.Params.task)
{
case GS_Task_t.CREATE_XPS:
break;
case GS_Task_t.PS_DISTILL:
break;
case GS_Task_t.SAVE_RESULT:
break;
}
}
}
};
NOTE
Once a Ghostscript operation is in progress any defined callback functions will be called as the operation runs up unto
completion. These callback methods are essential for your application to interpret activity events and react accordingly.
An explanation of callbacks and the available public methods within GSNET are explained below.
Delegates
To handle asynchronous events GhostNET has four delegates which define callback methods that an application can assign to.
Callback Description
PageRenderedCallBack Occurs when a page has been rendered and the data from the display device is ready
DLLProblemCallBack
StdIOCallBack
internal delegate void StdIO(String mess,
int len);
internal event StdIO StdIOCallBack;
ProgressCallBack
PageRenderedCallBack
GetVersion
NOTE
An exception will be thrown if there is any issue with the Ghostscript DLL.
DisplayDeviceOpen
m_ghostscript.DisplayDeviceOpen();
NOTE
Calling this method instantiates ghostscript and configures the encoding and the callbacks for the display device.
DisplayDeviceClose
m_ghostscript.DisplayDeviceClose();
NOTE
GetPageCount
NOTE
If Ghostscript is unable to determine the page count then this method will return -1 .
CreateXPS
Launches a thread to create an XPS document for Windows printing. This method is asynchronous and logic should be hooked
into your application upon GSNET instantiation to interpret progress.
m_ghostscript.CreateXPS("my_document.pdf",
300,
10,
1000,
1000,
true,
0,
9);
asynchronous
DistillPS
Launches a thread rendering all the pages of a supplied PostScript file to a PDF.
public gsStatus DistillPS(String fileName, int resolution)
m_ghostscript.DistillPS("my_postscript_document.ps", 300);
asynchronous
DisplayDeviceRunFile
m_ghostscript.DisplayDeviceRunFile("my_document.pdf",
1.0,
true,
0,
9);
asynchronous
DisplayDeviceRenderThumbs
Launches a thread rendering all the pages with the display device to collect thumbnail images.
Recommended zoom level for thumbnails is between 0.05 and 0.2, additionally anti-aliasing is probably not required.
m_ghostscript.DisplayDeviceRenderThumbs("my_document.pdf",
0.1,
false);
asynchronous
DisplayDeviceRenderPages
Launches a thread rendering a set of pages with the display device. For use with languages that can be indexed via pages
which include PDF and XPS. 1
asynchronous
GetStatus
Cancel
m_ghostscript.Cancel();
GhostscriptException
An application developer can log any exceptions in this public class as required by editing the constructor.
Notes
PCL and PS do not allow random access, meaning that, to print page 2 in a 100 page document, Ghostscript has to read the
entire document stream of 100 pages.
On the other hand, PDF and XPS allow for going directly to page 2 and then only dealing with that content. The tasks
DISPLAY_DEV_NON_PDF and DISPLAY_DEV_PDF keep track of what sort of input Ghostscript is dealing with and enables the
application to direct progress or completion callbacks accordingly.
GhostMono
About
GhostMono is the C# interface into the GhostAPI library developed for Linux systems.
Enums
Tasks
The Ghostscript task type enum is used to inform GhostAPI of the type of operation which is being requested.
Task Description
DISPLAY_DEV_PDF Display Device task associated with PDF & XPS rendering 1
Results
Status
The parameter struct gsParamState_t allows for bundles of information to be processed by Ghostscript to complete overall
requests.
Parameters explained
Setting up your parameters (with any dedicated bespoke method(s) which your application requires) is needed when
communicating directly with GhostAPI .
When requesting Ghostscript to process an operation an application developer should send a parameter payload which defines
the details for the operation.
gsparams.inputfile = fileName;
gsparams.args.Add("gs");
gsparams.args.Add("-dNOPAUSE");
gsparams.args.Add("-dBATCH");
gsparams.args.Add("-I%rom%Resource/Init/");
gsparams.args.Add("-dSAFER");
gsparams.args.Add("-sDEVICE=pdfwrite");
gsparams.outputfile = Path.GetTempFileName();
gsparams.args.Add("-o" + gsparams.outputfile);
gsparams.task = GS_Task_t.PS_DISTILL;
return RunGhostscriptAsync(gsparams);
}
Here we can see a parameter payload being setup before being passed on to the asynchronous method
RunGhostscriptAsync which sets up a worker thread to run according to the task type in the payload.
GhostMono handles many common operations on an application developer's behalf, however if you require to write your own
methods to interface with GhostAPI then referring to the public methods in GhostMono is a good starting point.
GhostMono contains a public class gsThreadCallBack . This class is used to set and get callback information as they occur.
GhostMono will create these payloads and deliver them back to the application layer's ProgressCallBack method
asynchronously.
GSMONO
This class should be instantiated as a member variable in your application with callback definitions setup as required.
Handlers for asynchronous operations can injected by providing your own bespoke callback methods to your instance's
ProgressCallBack function.
case GS_Task_t.PS_DISTILL:
Console.WriteLine($"PS_DISTILL.outputfile:");
Console.WriteLine($"{asyncInformation.Params.result.outputfile}");
break;
case GS_Task_t.SAVE_RESULT:
break;
case GS_Task_t.DISPLAY_DEV_THUMBS:
break;
case GS_Task_t.DISPLAY_DEV_RUN_FILE:
break;
case GS_Task_t.DISPLAY_DEV_PDF:
break;
case GS_Task_t.DISPLAY_DEV_NON_PDF:
break;
default:
break;
}
// task failed
if (asyncInformation.Params.result == GS_Result_t.gsFAILED)
{
switch (asyncInformation.Params.task)
{
case GS_Task_t.CREATE_XPS:
break;
case GS_Task_t.PS_DISTILL:
break;
case GS_Task_t.SAVE_RESULT:
break;
default:
break;
}
return;
}
// task cancelled
if (asyncInformation.Params.result == GS_Result_t.gsCANCELLED)
{
}
}
else // task is still running
{
switch (asyncInformation.Params.task)
{
case GS_Task_t.CREATE_XPS:
break;
case GS_Task_t.PS_DISTILL:
break;
case GS_Task_t.SAVE_RESULT:
break;
}
}
}
};
NOTE
Once a Ghostscript operation is in progress any defined callback functions will be called as the operation runs up unto
completion. These callback methods are essential for your application to interpret activity events and react accordingly.
An explanation of callbacks and the available public methods within GSMONO are explained below.
Delegates
To handle asynchronous events GhostMONO has four delegates which define callback methods that an application can assign
to.
Callback Description
DLLProblemCallBack Occurs if there is some issue with the Ghostscript Shared Object ( libgpdl.so )
PageRenderedCallBack Occurs when a page has been rendered and the data from the display device is ready
DLLProblemCallBack
ProgressCallBack
PageRenderedCallBack
GetVersion
NOTE
An exception will be thrown if there is any issue with the Ghostscript DLL.
DisplayDeviceOpen
m_ghostscript.DisplayDeviceOpen();
NOTE
Calling this method instantiates ghostscript and configures the encoding and the callbacks for the display device.
DisplayDeviceClose
Closes the display device and deletes the instance.
m_ghostscript.DisplayDeviceClose();
NOTE
GetPageCount
NOTE
If Ghostscript is unable to determine the page count then this method will return -1 .
DistillPS
Launches a thread rendering all the pages of a supplied PostScript file to a PDF.
m_ghostscript.DistillPS("my_postscript_document.ps", 300);
asynchronous
DisplayDeviceRenderAll
Launches a thread rendering all the document pages with the display device. For use with languages that can be indexed via
pages which include PDF and XPS. 1
public gsStatus DisplayDeviceRenderAll(String fileName, double zoom, bool aa, GS_Task_t task)
m_ghostscript.DisplayDeviceRenderAll("my_document.pdf",
0.1,
false,
GS_Task_t.DISPLAY_DEV_THUMBS_NON_PDF);
asynchronous
DisplayDeviceRenderThumbs
Launches a thread rendering all the pages with the display device to collect thumbnail images.
Recommended zoom level for thumbnails is between 0.05 and 0.2, additionally anti-aliasing is probably not required.
m_ghostscript.DisplayDeviceRenderThumbs("my_document.pdf",
0.1,
false);
asynchronous
DisplayDeviceRenderPages
Launches a thread rendering a set of pages with the display device. For use with languages that can be indexed via pages
which include PDF and XPS. 1
m_ghostscript.DisplayDeviceRenderPages("my_document.pdf",
0,
9,
1.0);
asynchronous
GetStatus
GhostscriptException
An application developer can log any exceptions in this public class as required by editing the constructor.
public class GhostscriptException : Exception
{
public GhostscriptException(string message) : base(message)
{
// Report exceptions as required
}
}
Notes
PCL and PS do not allow random access, meaning that, to print page 2 in a 100 page document, Ghostscript has to read the
entire document stream of 100 pages.
On the other hand, PDF and XPS allow for going directly to page 2 and then only dealing with that content. The tasks
DISPLAY_DEV_NON_PDF and DISPLAY_DEV_PDF keep track of what sort of input Ghostscript is dealing with and enables the
application to direct progress or completion callbacks accordingly.
Java overview
About
In the GhostPDL repository sample Java projects can be found in /demos/java .
jni jni
gsjava gsjava
gstest gstest
gsviewer gsviewer
Building Ghostscript
Before building the JNI ensure that Ghostscript has already been built for your platform and that you have JDK installed.
Windows gs_jni.dll
MacOS gs_jni.dylib
/Library/Java/JavaVirtualMachines/<JDK /Library/Java/JavaVirtualMachines/<JDK
MacOS
Install>/Contents/Home/include/jni.h Install>/Contents/Home/include/darwin/jni_md.h
Platform jni.h jni_md.h
Once your include folder has been located folder you can copy it and place it in your ghostpdl/demos/java/jni/gs_jni
folder.
Your build scripts should now be ready to run as they will be able to find the required JNI header files in their own relative
include folder.
Building on Windows
The jni folder contains a Visual Studio Solution file /jni/gs_jni/gs_jni.sln which you should use to build the required JNI
gs_jni.dll library file.
With the project open in Visual Studio, select the required architecture from the drop down - then right click on 'gs_jni' in the
solution explorer and choose "Build".
Building on MacOS
On your command line, navigate to ghostpdl/demos/java/jni/gs_jni and ensure that the build script is executable and then
run it, with:
chmod +x build_darwin.sh
./build_darwin.sh
Building on Linux
On your command line, navigate to ghostpdl/demos/java/jni/gs_jni and ensure that the build script is executable and then
run it, with:
chmod +x build_linux.sh
./build_linux.sh
Windows build_win32.bat
MacOS build_darwin.sh
Linux build_linux.sh
NOTE
gsjava has a dependancy on jni, please ensure that gs_jni is able to be built beforehand.
Using Eclipse import the source folder gsjava as a project and select Export > Java > JAR File as shown in the
screenshot example below:
The built JAR should be properly linked within your project Java Build Path as follows:
Demo projects
gstest
This project can be opened in Eclipse and used to test the Ghostscript API. The sample here simply sets up an instance of
Ghostscript and then sets and gets some parameters accordingly.
gsviewer
This project can be used to test the Ghostscript API alongside a UI which handles opening PostScript and PDF files. The
sample application here allows for file browsing and Ghostscript file viewing.
Linux / libgpdl.so (this may have been built as libgs.so , so it should be copied into
gs_jni.so
OpenBSD this directory and renamed to libgpdl.so )
Building on Windows
Running on Windows
To run, open gsviewer.jar either through File Explorer or in the command line through the following command:
On your command line, navigate to ghostpdl/demos/java/gsviewer and ensure that the build script is executable and then
run it, with:
chmod +x build_darwin.sh
./build_darwin.sh
This will automatically build gs_jni.dylib (in the ghostpdl/demos/java/jni/gs_jni/ location) and gsjava.jar
gsviewer.jar in the gsviewer directory.
Running on MacOS
Ensure that the Ghostscript library exists in the gsviewer directory. (Copy and move the built library from ghostpdl/sobin as
required).
Ensure that the run script is executable and then run it, with:
chmod +x start_darwin.sh
./start_darwin.sh
Building on Linux
On your command line, navigate to ghostpdl/demos/java/gsviewer and ensure that the build script is executable and then
run it, with:
chmod +x build_linux.sh
./build_linux.sh
This will automatically build gs_jni.so (in the ghostpdl/demos/java/jni/gs_jni/ location) and gsjava.jar gsviewer.jar
in the gsviewer directory.
NOTE
/etc/java-8-openjdk/accessibility.properties
Running on Linux
Ensure that the Ghostscript library exists in the gsviewer directory. (Copy and move the built library from ghostpdl/sobin as
required).
Ensure that the run script is executable and then run it, with:
chmod +x start_linux.sh
./start_linux.sh
gsjava.jar
About
gsjava.jar is the Java library which contains classes and interfaces which enable API calls required to use Ghostscript.
Assuming that the JAR for your project has been built and properly linked with your own project then the Ghostscript API
should be available by importing the required classes within your project's .java files.
GSAPI is the main Ghostscript API class which bridges into the Ghostscript C library.
GSInstance is a wrapper class for GSAPI which encapsulates an instance of Ghostscript and allows for simpler API calls.
// to use GSAPI
import static com.artifex.gsjava.GSAPI.*;
// to use GSInstance
import com.artifex.gsjava.GSInstance;
GSAPI
gsapi_revision
This method returns the revision numbers and strings of the Ghostscript interpreter library; you should call it before any other
interpreter library functions to make sure that the correct version of the Ghostscript interpreter has been loaded.
NOTE
The method should write to a reference variable which conforms to the class GSAPI.Revision.
GSAPI.Revision
This class is used to store information about Ghostscript and provides handy getters for the product and the copyright
information.
public Revision() {
this.product = null;
this.copyright = null;
this.revision = 0L;
this.revisionDate = 0L;
}
/**
* Returns the product information as a String.
*
* @return The product information.
*/
public String getProduct() {
return new String(product);
}
/**
* Returns the copyright information as a String.
*
* @return The copyright information.
*/
public String getCopyright() {
return new String(copyright);
}
}
gsapi_new_instance
Creates a new instance of Ghostscript. This instance is passed to most other GSAPI methods. Unless Ghostscript has been
compiled with the GS_THREADSAFE define, only one instance at a time is supported.
NOTE
gsapi_delete_instance
Destroy an instance of Ghostscript. Before you call this, Ghostscript must have finished. If Ghostscript has been initialised, you
should call gsapi_exit beforehand.
gsapi_set_stdio_with_handle
Set the callback functions for stdio , together with the handle to use in the callback functions. The stdin callback function
should return the number of characters read, 0 for EOF, or -1 for error. The stdout and stderr callback functions should
return the number of characters written.
gsapi_set_stdio
Set the callback functions for stdio . The handle used in the callbacks will be taken from the value passed to
gsapi_new_instance. Otherwise the behaviour of this function matches gsapi_set_stdio_with_handle.
gsapi_set_poll_with_handle
Set the callback function for polling, together with the handle to pass to the callback function. This function will only be called if
the Ghostscript interpreter was compiled with CHECK_INTERRUPTS as described in gpcheck.h .
The polling function should return zero if all is well, and return negative if it wants ghostscript to abort. This is often used for
checking for a user cancel. This can also be used for handling window events or cooperative multitasking.
The polling function is called very frequently during interpretation and rendering so it must be fast. If the function is slow, then
using a counter to return 0 immediately some number of times can be used to reduce the performance impact.
gsapi_set_poll
Set the callback function for polling. The handle passed to the callback function will be taken from the handle passed to
gsapi_new_instance. Otherwise the behaviour of this function matches gsapi_set_poll_with_handle.
gsapi_set_display_callback
This call is deprecated; please use gsapi_register_callout to register a callout handler for the display device in preference.
gsapi_register_callout
gsapi_deregister_callout
This call deregisters a callout handler previously registered with gsapi_register_callout. All three arguments must match exactly
for the callout handler to be deregistered.
public static native void gsapi_deregister_callout(long instance,
ICalloutFunction callout,
long calloutHandle);
gsapi_set_arg_encoding
Set the encoding used for the interpretation of all subsequent arguments supplied via the GSAPI interface on this instance. By
default we expect args to be in encoding 0 (the 'local' encoding for this OS). On Windows this means "the currently selected
codepage". This means that omitting to call this function will leave Ghostscript running exactly as it always has. Please note
that use of the 'local' encoding is now deprecated and should be avoided in new code. This must be called after
gsapi_new_instance and before gsapi_init_with_args.
gsapi_set_default_device_list
Set the string containing the list of default device names, for example "display x11alpha x11 bbox". Allows the calling
application to influence which device(s) Ghostscript will try, in order, in its selection of the default device. This must be called
after gsapi_new_instance and before gsapi_init_with_args.
gsapi_get_default_device_list
Returns a pointer to the current default device string. This must be called after gsapi_new_instance and before
gsapi_init_with_args.
gsapi_init_with_args
To initialise the interpreter, pass your instance of Ghostscript, your argument count: argc , and your argument variables:
argv .
NOTE
There are also simpler utility methods which eliminates the need to send through your argument count and allows for
simpler String passing for your argument array.
Utility methods:
public static int gsapi_init_with_args(long instance,
String[] argv);
gsapi_run_*
If these functions return <= -100 , either quit or a fatal error has occured. You must call gsapi_exit next. The only exception is
gsapi_run_string_continue which will return gs_error_NeedInput if all is well.
There is a 64 KB length limit on any buffer submitted to a gsapi_run_* function for processing. If you have more than 65535
bytes of input then you must split it into smaller pieces and submit each in a separate gsapi_run_string_continue call.
gsapi_run_string_begin
gsapi_run_string_continue
NOTE
There is a simpler utility method which allows for simpler String passing for the str argument.
Utility method:
gsapi_run_string_with_length
NOTE
There is a simpler utility method which allows for simpler String passing for the str argument.
Utility method:
gsapi_run_string
NOTE
There is a simpler utility method which allows for simpler String passing for the str argument.
Utility method:
gsapi_run_string_end
gsapi_run_file
NOTE
There is a simpler utility method which allows for simpler String passing for the fileName argument.
Utility method:
Exit the interpreter. This must be called on shutdown if gsapi_init_with_args has been called, and just before
gsapi_delete_instance.
gsapi_set_param
Sets a parameter. Broadly, this is equivalent to setting a parameter using -d, -s or -p on the command line. This call cannot be
made during a gsapi_run_string operation.
Parameters in this context are not the same as 'arguments' as processed by gsapi_init_with_args, but often the same thing can
be achieved. For example, with gsapi_init_with_args, we can pass "-r200" to change the resolution. Broadly the same thing can
be achieved by using gsapi_set_param to set a parsed value of "<>".
Internally, when we set a parameter, we perform an initgraphics operation. This means that using gsapi_set_param other
than at the start of a page is likely to give unexpected results.
Attempting to set a parameter that the device does not recognise will be silently ignored, and that parameter will not be found in
subsequent gsapi_get_param calls.
NOTE
The type argument, as a gs_set_param_type, dictates the kind of object that the value argument points to.
NOTE
NOTE
There are also simpler utility methods which allows for simpler String passing for your arguments.
Utility methods:
gsapi_get_param
Retrieve the current value of a parameter.
If an error occurs, the return value is negative. Otherwise the return value is the number of bytes required for storage of the
value. Call once with value NULL to get the number of bytes required, then call again with value pointing to at least the required
number of bytes where the value will be copied out. Note that the caller is required to know the type of value in order to get it.
For all types other than gs_spt_string, gs_spt_name, and gs_spt_parsed knowing the type means you already know the size
required.
This call retrieves parameters/values that have made it to the device. Thus, any values set using gs_spt_more_to_come without
a following call omitting that flag will not be retrieved. Similarly, attempting to get a parameter before gsapi_init_with_args has
been called will not list any, even if gsapi_set_param has been used.
Attempting to read a parameter that is not set will return gs_error_undefined (-21). Note that calling gsapi_set_param
followed by gsapi_get_param may not find the value, if the device did not recognise the key as being one of its configuration
keys.
NOTE
There is a simpler utility method which allows for simpler String passing for the param argument.
Utility method:
gsapi_enumerate_params
Enumerate the current parameters. Call repeatedly to list out the current parameters.
The first call should have iter = NULL. Subsequent calls should pass the same pointer in so the iterator can be updated.
Negative return codes indicate error, 0 success, and 1 indicates that there are no more keys to read. On success, key will be
updated to point to a null terminated string with the key name that is guaranteed to be valid until the next call to
gsapi_enumerate_params. If type is non NULL then the pointer type will be updated to have the type of the parameter.
NOTE
Only one enumeration can happen at a time. Starting a second enumeration will reset the first.
The enumeration only returns parameters/values that have made it to the device. Thus, any values set using the
gs_spt_more_to_come without a following call omitting that flag will not be retrieved. Similarly, attempting to enumerate
parameters before gsapi_init_with_args has been called will not list any, even if gsapi_set_param has been used.
Add a (case sensitive) path to one of the lists of permitted paths for file access.
NOTE
There is a simpler utility method which allows for simpler String passing for the path argument.
Utility method:
gsapi_remove_control_path
Remove a (case sensitive) path from one of the lists of permitted paths for file access.
NOTE
There is a simpler utility method which allows for simpler String passing for the path argument.
Utility method:
gsapi_purge_control_paths
Clear all the paths from one of the lists of permitted paths for file access.
gsapi_activate_path_control
Enable/Disable path control (i.e. whether paths are checked against permitted paths before access is granted).
public static native void gsapi_activate_path_control(long instance,
boolean enable);
gsapi_is_path_control_active
gsjava.jar also defines some functional interfaces for callbacks & callouts with package com.artifex.gsjava.callback
which are defined as follows.
IStdInFunction
IStdOutFunction
IStdErrFunction
IPollFunction
ICalloutFunction
GSInstance
This is a utility class which makes Ghostscript calls easier by storing a Ghostscript instance and, optionally, a caller handle.
Essentially the class acts as a handy wrapper for the standard GSAPI methods.
Constructors
delete_instance
Wraps gsapi_delete_instance.
set_stdio
Wraps gsapi_set_stdio.
Wraps gsapi_set_poll.
set_display_callback
Wraps gsapi_set_display_callback.
register_callout
Wraps gsapi_register_callout.
deregister_callout
Wraps gsapi_deregister_callout.
set_arg_encoding
Wraps gsapi_set_arg_encoding.
set_default_device_list
Wraps gsapi_set_default_device_list.
get_default_device_list
Wraps gsapi_get_default_device_list.
Wraps gsapi_init_with_args.
run_string_begin
Wraps gsapi_run_string_begin.
run_string_continue
Wraps gsapi_run_string_continue.
run_string
Wraps gsapi_run_string.
run_file
Wraps gsapi_run_file.
exit
Wraps gsapi_exit.
set_param
Wraps gsapi_set_param.
get_param
Wraps gsapi_get_param.
enumerate_params
Wraps gsapi_enumerate_params.
add_control_path
Wraps gsapi_add_control_path.
remove_control_path
Wraps gsapi_remove_control_path.
purge_control_paths
Wraps gsapi_purge_control_paths.
activate_path_control
Wraps gsapi_activate_path_control.
is_path_control_active
Wraps gsapi_is_path_control_active.
The com.artifex.gsjava.util package contains a set of classes and interfaces which are used throughout the API.
com.artifex.gsjava.util.Reference
Reference<T> is used in many of the Ghostscript calls, it stores a reference to a generic value of type T . This class exists to
emulate pointers being passed to a native function. Its value can be fetched with getValue() and set with setValue(T
value) .
public Reference() {
this(null);
}
public T getValue() {
return value;
}
...
}
Python overview
About
The Python API is provided by the file gsapi.py - this is the binding to the Ghostscript C library.
Building Ghostscript
Two environmental variables can be used to specify where to find the Ghostscript shared library.
GSAPI_LIB sets the exact path of the Ghostscript shared library, otherwise, GSAPI_LIBDIR sets the directory containing the
Ghostscript shared library.
If neither is defined we will use the OS's default location(s) for shared libraries.
API test
The gsapi.py file that provides the Python bindings can also be used to test the bindings, by running it directly.
Assuming that your Ghostscript library has successfully been created, then from the root of your ghostpdl checkout run:
Windows
from ghostpdl
Linux/OpenBSD/MacOS
from ghostpdl
If there are no errors then this will have validated that the Ghostscript library is present & operational.
gsapi.py
About
gsapi.py is the Python binding into the Ghostscript C library.
Assuming that the Ghostscript library has been built for your project then gsapi should be imported into your own Python
scripts for API usage.
import gsapi
gsapi
Overview
All functions have the same name as the C function that they wrap.
Functions that don't have out-params return None . Out-params are returned
directly (using tuples if there are more than one).
Return codes
gsapi_run_* and gsapi_exit methods return an int code which can be interpreted as follows:
code status
0 no error
gsConstants.E_QUIT "quit" has been executed. This is not an error. gsapi_exit must be called next
<0 error
NOTE
gsapi_revision
Returns a gsapi_revision_t .
This method returns the revision numbers and strings of the Ghostscript interpreter library; you should call it before any other
interpreter library functions to make sure that the correct version of the Ghostscript interpreter has been loaded.
def gsapi_revision()
version_info = gsapi.gsapi_revision()
print (version_info)
gsapi_new_instance
def gsapi_new_instance(caller_handle)
Parameters
caller_handle : Typically unused, but is passed to callbacks e.g. via gsapi_set_stdio() . Must be convertible to a C void* ,
so None or an
integer is ok but other types such as strings will fail.
instance = gsapi.gsapi_new_instance(1)
gsapi_delete_instance
Destroy an instance of Ghostscript. Before you call this, Ghostscript should ensure to have finished any processes.
def gsapi_delete_instance(instance)
Parameters
gsapi.gsapi_delete_instance(instance)
gsapi_set_stdio
Set the callback functions for stdio , together with the handle to use in the callback functions.
Parameters
Should return the number of bytes of text that they handled; for convenience None is converted to len(text) .
gsapi_set_poll
Parameters
gsapi.gsapi_set_poll(instance, poll_fn)
print('gsapi_set_poll() ok.')
gsapi_set_display_callback
Parameters
d = display_callback()
gsapi.gsapi_set_display_callback(instance, d)
print('gsapi_set_display_callback() ok.')
gsapi_set_arg_encoding
Set the encoding used for the interpretation of all subsequent arguments supplied via the GhostAPI interface on this instance.
By default we expect args to be in encoding 0 (the 'local' encoding for this OS). On Windows this means "the currently
selected codepage". On Linux this typically means utf8 . This means that omitting to call this function will leave Ghostscript
running exactly as it always has.
Parameters
GS_ARG_ENCODING_LOCAL 0
GS_ARG_ENCODING_UTF8 1
GS_ARG_ENCODING_UTF16LE 2
gsapi.gsapi_set_arg_encoding(instance, gsapi.GS_ARG_ENCODING_UTF8)
NOTE
Please note that use of the 'local' encoding ( GS_ARG_ENCODING_LOCAL ) is now deprecated and should be avoided in new
code.
gsapi_set_default_device_list
Set the string containing the list of default device names, for example "display x11alpha x11 bbox". Allows the calling
application to influence which device(s) Ghostscript will try, in order, in its selection of the default device. This must be called
after gsapi_new_instance and before gsapi_init_with_args.
Parameters
gsapi_get_default_device_list
Returns a string containing the list of default device names. This must be called after gsapi_new_instance and before
gsapi_init_with_args.
def gsapi_get_default_device_list(instance)
Parameters
device_list = gsapi.gsapi_get_default_device_list(instance)
print(device_list)
gsapi_init_with_args
To initialise the interpreter, pass your instance of Ghostscript and your argument variables with args .
Parameters
in_filename = 'tiger.eps'
out_filename = 'tiger.pdf'
params = ['gs', '-dNOPAUSE', '-dBATCH', '-sDEVICE=pdfwrite',
'-o', out_filename, '-f', in_filename]
gsapi.gsapi_init_with_args(instance, params)
gsapi_run_*
There is a 64 KB length limit on any buffer submitted to a gsapi_run_* function for processing. If you have more than 65535
bytes of input then you must split it into smaller pieces and submit each in a separate gsapi_run_string_continue call.
NOTE
gsapi_run_string_begin
Parameters
gsapi_run_string_continue
Processes file byte data ( str_ ) to feed as chunks into Ghostscript. This method should typically be called within a buffer
context.
NOTE
Parameters
NOTE
gsapi_run_string_with_length
Processes file byte data ( str_ ) to feed into Ghostscript when the length is known and the file byte data is immediately
available.
Parameters
gsapi.gsapi_run_string_with_length(instance,"hello",5,0)
NOTE
If using this method then ensure that the file byte data will fit into a single (<64k) buffer.
gsapi_run_string
Parameters
gsapi.gsapi_run_string(instance,"hello",0)
NOTE
gsapi_run_string_end
Parameters
exitcode = gsapi.gsapi_run_string_end(instance, 0)
gsapi_run_file
Parameters
in_filename = 'tiger.eps'
gsapi.gsapi_run_file(instance, in_filename, 0)
NOTE
This will process the supplied input file with any previously supplied argument parameters.
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.
def gsapi_exit(instance)
gsapi.gsapi_exit(instance)
gsapi_set_param
Sets a parameter. Broadly, this is equivalent to setting a parameter using -d, -s or -p on the command line. This call cannot be
made during a gsapi_run_string operation.
Parameters in this context are not the same as 'arguments' as processed by gsapi_init_with_args, but often the same thing can
be achieved. For example, with gsapi_init_with_args, we can pass "-r200" to change the resolution. Broadly the same thing can
be achieved by using gsapi_set_param to set a parsed value of "<>".
Internally, when we set a parameter, we perform an initgraphics operation. This means that using gsapi_set_param other
than at the start of a page is likely to give unexpected results.
Attempting to set a parameter that the device does not recognise will be silently ignored, and that parameter will not be found in
subsequent gsapi_get_param calls.
Parameters
param : Name of parameter, either a bytes or a str; if str it is encoded using latin-1.
value : A bool, int, float, bytes or str. If str, it is encoded into a bytes using utf-8.
type_ : If type_ is not None , value must be convertible to the Python type implied by type_ :
Parameter list
gs_spt_null [Ignored]
gs_spt_bool bool
gs_spt_int int
gs_spt_float float
gs_spt_name [Error]
gs_spt_long int
gs_spt_i64 int
gs_spt_size_t int
An exception is raised if type_ is an integer type and value is outside its range.
bool gs_spt_bool
int gs_spt_i64
float gs_spt_float
bytes gs_spt_parsed
NOTE
This implementation supports automatic inference of type by looking at the type of value .
NOTE
gsapi_get_param
This call retrieves parameters/values that have made it to the device. Thus, any values set using gs_spt_more_to_come without
a following call omitting that flag will not be retrieved. Similarly, attempting to get a parameter before gsapi_init_with_args has
been called will not list any, even if gsapi_set_param has been used.
Attempting to read a parameter that is not set will return gs_error_undefined (-21). Note that calling gsapi_set_param
followed by gsapi_get_param may not find the value, if the device did not recognise the key as being one of its configuration
keys.
Parameters
param : Name of parameter, either a bytes or str ; if a str it is encoded using latin-1 .
type_ : A gs_spt_* constant or None . If None we try each gs_spt_* until one succeeds; if none succeeds we raise the last
error.
encoding : Only affects string values. If None we return a bytes object, otherwise it should be the encoding to use to decode
into a string, e.g. 'utf-8'.
gsapi_enumerate_params
Returns an array of (key, value) for each parameter. key is decoded as latin-1 .
def gsapi_enumerate_params(instance)
Parameters
gsapi_add_control_path
Add a (case sensitive) path to one of the lists of permitted paths for file access.
def gsapi_add_control_path(instance, type_, path)
Parameters
Enum Value
GS_PERMIT_FILE_READING 0
GS_PERMIT_FILE_WRITING 1
GS_PERMIT_FILE_CONTROL 2
gsapi_remove_control_path
Remove a (case sensitive) path from one of the lists of permitted paths for file access.
Parameters
gsapi_purge_control_paths
Clear all the paths from one of the lists of permitted paths for file access.
Parameters
gsapi_activate_path_control
Enable/Disable path control (i.e. whether paths are checked against permitted paths before access is granted).
Parameters
gsapi.gsapi_activate_path_control(instance, true)
gsapi_is_path_control_active
def gsapi_is_path_control_active(instance)
Parameters
isActive = gsapi.gsapi_is_path_control_active(instance)
Notes
The user_errors argument is normally set to zero to indicate that errors should be handled through the normal mechanisms
within the interpreted code. If set to a negative value, the functions will return an error code directly to the caller, bypassing the
interpreted language. The interpreted language's error handler is bypassed, regardless of user_errors parameter, for the
gs_error_interrupt generated when the polling callback returns a negative value. A positive user_errors is treated the
same as zero.