diff options
Diffstat (limited to '')
-rwxr-xr-x | share/extensions/ps_input.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/share/extensions/ps_input.py b/share/extensions/ps_input.py new file mode 100755 index 0000000..1724c70 --- /dev/null +++ b/share/extensions/ps_input.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# coding=utf-8 +# +# Copyright (C) 2008 Stephen Silver +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# +""" +Simple wrapper around ps2pdf +""" + +import sys +import os + +import inkex +from inkex.command import ProgramRunError, call, which +from inkex.localization import inkex_gettext as _ + + +class PostscriptInput(inkex.CallExtension): + """Load Postscript/EPS Files by calling ps2pdf program""" + + input_ext = "ps" + output_ext = "pdf" + multi_inx = True + + def add_arguments(self, pars): + pars.add_argument("--crop", type=inkex.Boolean, default=False) + pars.add_argument( + "--autorotate", choices=["None", "PageByPage", "All"], default="None" + ) + + def call(self, input_file, output_file): + crop = "-dEPSCrop" if self.options.crop else None + if sys.platform == "win32": + params = [ + "-q", + "-P-", + "-dSAFER", + "-dNOPAUSE", + "-dBATCH", + "-sDEVICE#pdfwrite", + "-dCompatibilityLevel#1.4", + crop, + "-sOutputFile#" + output_file, + "-dAutoRotatePages#/" + self.options.autorotate, + input_file, + ] + gs_execs = ["gswin64c", "gswin32c"] + gs_exec = None + for executable in gs_execs: + try: + which(executable) + gs_exec = executable + except: + pass + if gs_exec is None: + if "PYTEST_CURRENT_TEST" in os.environ: + gs_exec = "gswin64c" # In CI, we have neither available, + # but there are mock files for the 64 bit version + else: + raise inkex.AbortExtension(_("No GhostScript executable was found")) + try: + call(gs_exec, *params) + except ProgramRunError as err: + self.handle_gs_error(err) + else: + try: + call( + "ps2pdf", + crop, + "-dAutoRotatePages=/" + self.options.autorotate, + input_file, + output_file, + ) + except ProgramRunError as err: + self.handle_gs_error(err) + + def handle_gs_error(self, err: ProgramRunError): + inkex.errormsg( + _( + "Ghostscript was unable to read the file. \nThe following error message was returned:" + ) + + "\n" + ) + inkex.errormsg(err.stderr.decode("utf8")) + inkex.errormsg(err.stdout.decode("utf8")) + raise inkex.AbortExtension() + + +if __name__ == "__main__": + PostscriptInput().run() |