Introduction
The Python API is provided by the file gsapi.py - this is the binding to the Ghostscript C library.
In the GhostPDL repository sample Python examples can be found in /demos/python/examples.py.
Platform & setup
Ghostscript should be built as a shared library for your platform.
See Building Ghostscript.
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 repository checkout do the following:
Windows
Run
gsapi.pyas a test script in acmd.exewindow:set GSAPI_LIBDIR=debugbin&& python ./demos/python/gsapi.pyRun
gsapi.pyas a test script in aPowerShellwindow:cmd /C "set GSAPI_LIBDIR=debugbin&& python ./demos/python/gsapi.py"
Linux/OpenBSD/MacOS
Run
gsapi.pyas a test script:GSAPI_LIBDIR=sodebugbin ./demos/python/gsapi.py
Note
If there are no errors then this will have validated that the Ghostscript library is present & operational.
The gsapi Python module
Assuming that the above platform & setup has been completed, then gsapi should be imported into your own Python scripts for API usage.
Implemented using Python’s
ctypesmodule.All functions have the same name as the C function that they wrap.
Functions raise a
GSErrorexception if the underlying function returned a negative error code.Functions that don’t have out-params return
None. Out-params are returned directly (using tuples if there are more than one).
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.
Sample code:
version_info = gsapi.gsapi_revision()
print(version_info)
C code reference: gsapi_revision
gsapi_new_instance(caller_handle)
Returns a new instance of Ghostscript to be used with other gsapi_*() functions.
Parameters:
caller_handleTypically unused, but is passed to callbacks e.g. via gsapi_set_stdio(). Must be convertible to a
C void*, soNoneor anintegeris ok but other types such as strings will fail.
Sample code:
instance = gsapi.gsapi_new_instance(1)
C code reference: gsapi_new_instance
gsapi_delete_instance(instance)
Destroy an instance of Ghostscript. Before you call this, Ghostscript should ensure to have finished any processes.
Parameters:
instanceYour instance of Ghostscript.
Sample code:
gsapi.gsapi_delete_instance(instance)
C code reference: gsapi_delete_instance
gsapi_set_stdio(instance, stdin_fn, stdout_fn, stderr_fn)
Set the callback functions for stdio, together with the handle to use in the callback functions.
Parameters:
instanceYour instance of Ghostscript.
stdin_fnIf not
None, will be called with:(caller_handle, text, len_):caller_handle: As passed originally togsapi_new_instance().text: Actypes.LP_c_charof lengthlen_.
stdout_fn,stderr_fnIf not
None, called with:(caller_handle, text):caller_handle: As passed originally togsapi_new_instance().text: A Python bytes object.
Should return the number of bytes of text that they handled; for convenience None is converted to len(text).
Sample code:
def stdout_fn(caller_handle, bytes_):
sys.stdout.write(bytes_.decode('latin-1'))
gsapi.gsapi_set_stdio(instance, None, stdout_fn, None)
print('gsapi_set_stdio() ok.')
C code reference: gsapi_set_stdio
gsapi_set_poll(instance, poll_fn)
Set the callback function for polling.
Parameters:
instanceYour instance of Ghostscript.
poll_fnWill be called with
caller_handleas passed to gsapi_new_instance.
Sample code:
def poll_fn(caller_handle, bytes_):
sys.stdout.write(bytes_.decode('latin-1'))
gsapi.gsapi_set_poll(instance, poll_fn)
print('gsapi_set_poll() ok.')
C code reference: gsapi_set_poll
gsapi_set_display_callback(instance, callback)
Sets the display callback.
Parameters:
instanceYour instance of Ghostscript.
callbackMust be a
display_callbackinstance.
Sample code:
d = display_callback()
gsapi.gsapi_set_display_callback(instance, d)
print('gsapi_set_display_callback() ok.')
C code reference: gsapi_set_display_callback
gsapi_set_arg_encoding(instance, 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.
This must be called after gsapi_new_instance and before gsapi_init_with_args.
Parameters:
instanceYour instance of Ghostscript.
encodingEncoding must be one of:
Encoding enum
Value
GS_ARG_ENCODING_LOCAL0
GS_ARG_ENCODING_UTF81
GS_ARG_ENCODING_UTF16LE2
Sample code:
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.
C code reference: gsapi_set_arg_encoding
gsapi_set_default_device_list(instance, 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:
instanceYour instance of Ghostscript.
list_A string of device names.
Sample code:
gsapi.gsapi_set_default_device_list(instance, 'bmp256 bmp32b bmpgray cdeskjet cdj1600 cdj500')
C code reference: gsapi_set_default_device_list
gsapi_get_default_device_list(instance)
Returns a string containing the list of default device names. This must be called after gsapi_new_instance and before gsapi_init_with_args.
Parameters:
instanceYour instance of Ghostscript.
Sample code:
device_list = gsapi.gsapi_get_default_device_list(instance)
print(device_list)
C code reference: gsapi_get_default_device_list
gsapi_init_with_args(instance, args)
To initialise the interpreter, pass your instance of Ghostscript and your argument variables with args.
Parameters:
instanceYour instance of Ghostscript.
argsA list/tuple of strings.
Sample code:
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)
C code reference: gsapi_init_with_args
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.
On success (underlying C function’s return value is >=0), these functions return the underlying C function’s exit_code out-parameter (and the return value is discarded). Otherwise they raise a GSError in the usual way (and the underlying exit_code out-parameter is discarded).
For full details on these return codes please see The C API return codes.
Note
User errors parameter explained
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.
C code reference: gsapi_run_*
gsapi_run_string_begin(instance, user_errors)
Starts a run_string_ operation.
Parameters:
instanceYour instance of Ghostscript.
user_errorsAn
int, for more see: User errors parameter explained.
Sample code:
exitcode = gsapi.gsapi_run_string_begin(instance, 0)
C code reference: gsapi_run_*
gsapi_run_string_continue(instance, str_, user_errors)
Processes file byte data (str_) to feed as chunks into Ghostscript. This method should typically be called within a buffer context.
Note
An exception is not raised for the gs_error_NeedInput return code.
Parameters:
instanceYour instance of Ghostscript.
str_Should be either a Python string or a bytes object. If the former, it is converted into a bytes object using utf-8 encoding.
user_errorsAn
int, for more see: User errors parameter explained.
Sample code:
exitcode = gsapi.gsapi_run_string_continue(instance, data, 0)
Note
For the return code, we don’t raise an exception for gs_error_NeedInput.
C code reference: gsapi_run_*
gsapi_run_string_with_length(instance, str_, length, user_errors)
Processes file byte data (str_) to feed into Ghostscript when the length is known and the file byte data is immediately available.
Parameters:
instanceYour instance of Ghostscript.
str_Should be either a Python string or a bytes object. If the former, it is converted into a bytes object using utf-8 encoding.
lengthAn
intrepresenting the length ofstr_.user_errorsAn
int, for more see: User errors parameter explained.
Sample code:
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.
C code reference: gsapi_run_*
gsapi_run_string(instance, str_, user_errors)
Processes file byte data (str_) to feed into Ghostscript.
Parameters:
instanceYour instance of Ghostscript.
str_Should be either a Python string or a bytes object. If the former, it is converted into a bytes object using utf-8 encoding.
user_errorsAn
int, for more see: User errors parameter explained.
Sample code:
gsapi.gsapi_run_string(instance,"hello",0)
Note
This method can only work on a standard, null terminated C string.
C code reference: gsapi_run_*
gsapi_run_string_end(instance, user_errors)
Ends a run_string_ operation.
Parameters:
instanceYour instance of Ghostscript.
user_errorsAn
int, for more see: User errors parameter explained.
Sample code:
exitcode = gsapi.gsapi_run_string_end(instance, 0)
C code reference: gsapi_run_*
gsapi_run_file(instance, filename, user_errors)
Runs a file through Ghostscript.
Parameters:
instanceYour instance of Ghostscript.
filenameString representing file name.
user_errorsAn
int, for more see: User errors parameter explained.
Sample code:
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.
C code reference: gsapi_run_*
gsapi_exit(instance)
Returns a successful exit code 0, or raises a GSError exception on error.
Exit the interpreter. This must be called on shutdown if gsapi_init_with_args has been called, and just before gsapi_delete_instance.
Parameters:
instanceYour instance of Ghostscript.
Sample code:
gsapi.gsapi_exit(instance)
C code reference: gsapi_exit
gsapi_set_param(instance, param, value, type_=None)
Sets a parameter.
We behave much like the underlying gsapi_set_param() C function, except that we also support automatic inference of type type_ arg by looking at the type of value.
Parameters:
instanceYour instance of Ghostscript.
paramName of parameter, either a
bytesor astr; ifstrit is encoded usinglatin-1.valueA
bool,int,float,bytesorstr. Ifstr, it is encoded into abytesusingutf-8.type_If
type_is notNone,valuemust be convertible to the Python type implied bytype_:type_Python type(s)
gs_spt_null[Ignored]
gs_spt_boolbool
gs_spt_intint
gs_spt_floatfloat
gs_spt_name[Error]
gs_spt_string(bytes, str)
gs_spt_longint
gs_spt_i64int
gs_spt_size_tint
gs_spt_parsed(bytes, str)
gs_spt_more_to_come(bytes, str)
An exception is raised if
type_is an integer type andvalueis outside its range.If
type_isNone, we choose something suitable for type ofvalue:Python type of
valuetype_bool
gs_spt_boolint
gs_spt_i64float
gs_spt_floatbytes
gs_spt_parsedstr
gs_spt_parsed(encoded with utf-8)If value is
None, we usegs_spt_null.Otherwise
type_must be ags_spt_*except forgs_spt_invalidandgs_spt_name(we don’t allowpsapi_spt_namebecause the underlying C does not copy the string, so cannot be safely used from Python).
Sample code:
set_margins = gsapi.gsapi_set_param(instance, "Margins", "[10 10]")
C code reference: gsapi_set_param
gsapi_get_param(instance, param, type_=None, encoding=None)
Returns value of specified parameter, or None if parameter type is gs_spt_null.
Parameters:
instanceYour instance of Ghostscript.
paramName of parameter, either a
bytesorstr; if astrit is encoded usinglatin-1.type_A
gs_spt_*constant orNone. IfNonewe try eachgs_spt_*until one succeeds; if none succeeds we raise the last error.encodingOnly affects string values. If
Nonewe return abytesobject, otherwise it should be the encoding to use to decode into a string, e.g. ‘utf-8’.
Sample code:
get_margins = gsapi.gsapi_get_param(instance, "Margins")
C code reference: gsapi_get_param
gsapi_enumerate_params(instance)
Enumerate the current parameters on the instance of Ghostscript.
Yields (key, value) for each param. key is decoded as latin-1.
Parameters:
instanceYour instance of Ghostscript.
Sample code:
for param, type_ in gsapi.gsapi_enumerate_params(instance):
val = gsapi.gsapi_get_param(instance,param, encoding='utf-8')
print('%-24s : %s' % (param, val))
C code reference: gsapi_enumerate_params
gsapi_add_control_path(instance, type_, path)
Add a (case sensitive) path to one of the lists of permitted paths for file access.
Parameters:
instanceYour instance of Ghostscript.
type_An
intwhich must be one of:Enum
Value
GS_PERMIT_FILE_READING0
GS_PERMIT_FILE_WRITING1
GS_PERMIT_FILE_CONTROL2
pathA string representing the file path.
Sample code:
gsapi.gsapi_add_control_path(instance, gsapi.GS_PERMIT_FILE_READING, "/docs/secure/")
C code reference: gsapi_add_control_path
gsapi_remove_control_path(instance, type_, path)
Remove a (case sensitive) path from one of the lists of permitted paths for file access.
Parameters:
instanceYour instance of Ghostscript.
type_An int representing the permission type.
pathA string representing the file path.
Sample code:
gsapi.gsapi_remove_control_path(instance, gsapi.GS_PERMIT_FILE_READING, "/docs/secure/")
C code reference: gsapi_remove_control_path
gsapi_purge_control_paths(instance, type_)
Clear all the paths from one of the lists of permitted paths for file access.
Parameters:
instanceYour instance of Ghostscript.
type_An
intrepresenting the permission type.
Sample code:
gsapi.gsapi_purge_control_paths(instance, gsapi.GS_PERMIT_FILE_READING)
C code reference: gsapi_purge_control_paths
gsapi_activate_path_control(instance, enable)
Enable/Disable path control (i.e. whether paths are checked against permitted paths before access is granted).
Parameters:
instanceYour instance of Ghostscript.
enableboolto enable/disable path control.
Sample code:
gsapi.gsapi_activate_path_control(instance, true)
C code reference: gsapi_activate_path_control
gsapi_is_path_control_active(instance)
Query whether path control is activated or not.
Parameters:
instanceYour instance of Ghostscript.
Sample code:
isActive = gsapi.gsapi_is_path_control_active(instance)
C code reference: gsapi_is_path_control_active