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.py
as a test script in acmd.exe
window:set GSAPI_LIBDIR=debugbin&& python ./demos/python/gsapi.pyRun
gsapi.py
as a test script in aPowerShell
window:cmd /C "set GSAPI_LIBDIR=debugbin&& python ./demos/python/gsapi.py"
Linux/OpenBSD/MacOS
Run
gsapi.py
as 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
ctypes
module.All functions have the same name as the C function that they wrap.
Functions raise a
GSError
exception 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_handle
Typically unused, but is passed to callbacks e.g. via gsapi_set_stdio(). Must be convertible to a
C void*
, soNone
or aninteger
is 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:
instance
Your 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:
instance
Your instance of Ghostscript.
stdin_fn
If not
None
, will be called with:(caller_handle, text, len_)
:caller_handle
: As passed originally togsapi_new_instance()
.text
: Actypes.LP_c_char
of lengthlen_
.
stdout_fn
,stderr_fn
If 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:
instance
Your instance of Ghostscript.
poll_fn
Will be called with
caller_handle
as passed to gsapi_new_instance(python 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:
instance
Your instance of Ghostscript.
callback
Must be a
display_callback
instance.
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:
instance
Your instance of Ghostscript.
encoding
Encoding must be one of:
Encoding enum
Value
GS_ARG_ENCODING_LOCAL
0
GS_ARG_ENCODING_UTF8
1
GS_ARG_ENCODING_UTF16LE
2
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:
instance
Your 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:
instance
Your 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:
instance
Your instance of Ghostscript.
args
A 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:
instance
Your instance of Ghostscript.
user_errors
An
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:
instance
Your 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_errors
An
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:
instance
Your 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.
length
An
int
representing the length ofstr_
.user_errors
An
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:
instance
Your 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_errors
An
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:
instance
Your instance of Ghostscript.
user_errors
An
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:
instance
Your instance of Ghostscript.
filename
String representing file name.
user_errors
An
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:
instance
Your 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:
instance
Your instance of Ghostscript.
param
Name of parameter, either a
bytes
or astr
; ifstr
it is encoded usinglatin-1
.value
A
bool
,int
,float
,bytes
orstr
. Ifstr
, it is encoded into abytes
usingutf-8
.type_
If
type_
is notNone
,value
must be convertible to the Python type implied bytype_
:type_
Python type(s)
gs_spt_null
[Ignored]
gs_spt_bool
bool
gs_spt_int
int
gs_spt_float
float
gs_spt_name
[Error]
gs_spt_string
(bytes, str)
gs_spt_long
int
gs_spt_i64
int
gs_spt_size_t
int
gs_spt_parsed
(bytes, str)
gs_spt_more_to_come
(bytes, str)
An exception is raised if
type_
is an integer type andvalue
is outside its range.If
type_
isNone
, we choose something suitable for type ofvalue
:Python type of
value
type_
bool
gs_spt_bool
int
gs_spt_i64
float
gs_spt_float
bytes
gs_spt_parsed
str
gs_spt_parsed
(encoded with utf-8)If value is
None
, we usegs_spt_null
.Otherwise
type_
must be ags_spt_*
except forgs_spt_invalid
andgs_spt_name
(we don’t allowpsapi_spt_name
because 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:
instance
Your instance of Ghostscript.
param
Name of parameter, either a
bytes
orstr
; if astr
it is encoded usinglatin-1
.type_
A
gs_spt_*
constant orNone
. IfNone
we try eachgs_spt_*
until one succeeds; if none succeeds we raise the last error.encoding
Only affects string values. If
None
we return abytes
object, 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:
instance
Your 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:
instance
Your instance of Ghostscript.
type_
An
int
which must be one of:Enum
Value
GS_PERMIT_FILE_READING
0
GS_PERMIT_FILE_WRITING
1
GS_PERMIT_FILE_CONTROL
2
path
A 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:
instance
Your instance of Ghostscript.
type_
An int representing the permission type.
path
A 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:
instance
Your instance of Ghostscript.
type_
An
int
representing 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:
instance
Your instance of Ghostscript.
enable
bool
to 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:
instance
Your instance of Ghostscript.
Sample code:
isActive = gsapi.gsapi_is_path_control_active(instance)
C code reference: gsapi_is_path_control_active