#!/usr/bin/env texlua --*-Lua-*- -- $Id$ -- Copyright (C) 2008-2015 Reinhard Kotucha. -- You may freely use, modify and/or distribute this file. -- Generic wrapper for ps2pdf{,12,13,14} and pdfopt. local function usage (progname) local message= 'Usage: '..progname..' [options] \n\n'.. ' can be either a PS, EPS, or PDF file.\n'.. ' A single hyphen (-) denotes stdin.\n\n'.. ' is required if is a PDF file\n'.. ' or input is read from stdin.\n' return message end local function fixwin (args_unix) if os.type == 'windows' then local args_win={} -- new table args_win[0]=args_unix[1] for i=1, #args_unix do args_win[i]='"'..args_unix[i]..'"' end return args_win else return args_unix end end local function push (t, ...) local args={...} for _,v in ipairs(args) do if type(v) == 'table' then for _,x in ipairs(v) do t[#t+1]=x end else t[#t+1]=v end end end local function filename (file) -- strip path if string.find(file, '[/\\]') then return string.match(file, '.*[/\\](.*)$') else return file end end local function basename (file) -- strip extension return string.match(filename(file), '(.*)%..*') end local function extension (file) -- return extension if available, false otherwise. local fn=filename(file) if fn:find('%.') then return string.match(fn, '.*%.(.*)') end end local function parse_cmdline () local files={} local options={} local progname local basename=filename(arg[0]) if basename:find('%.') then progname=basename:match('(.*)%..*') else progname=basename end for i=1, #arg do if string.find(arg[i], '^%-.+') then push(options, arg[i]) else push(files, arg[i]) end end files.input =files[1] files.output=files[2] return progname, options, files end local function check_files (progname, files, default_output_ext) if #files < 1 then io.stderr:write(usage(progname)) os.exit(1) end if #files < 2 then if extension(files.input) then local ext=string.lower(extension(files.input)) if ext:match(default_output_ext..'$') then io.stderr:write('!Error: no output file specified.\n\n') io.stderr:write(usage(progname)) os.exit(1) else files.output=basename(files.input)..'.'..default_output_ext end else -- the input file has no extension files.output=files.input..'.'..default_output_ext end end end -- main -- -- parse command line local progname, options, file=parse_cmdline() check_files(progname, file, 'pdf') -- determine PDF level local PDF_level='1.5' -- default, may be changed in the future if progname == 'ps2pdf12' then PDF_level='1.2' elseif progname == 'ps2pdf13' then PDF_level='1.3' elseif progname == 'ps2pdf14' then PDF_level='1.4' end -- setup command local command={} if os.type == 'unix' then command={'gs'} else command={'gswin32c'} end push(command, '-P-', '-dALLOWPSTRANSPARENCY', options, '-dCompatibilityLevel='..PDF_level) if progname == 'pdfopt' then push(command, '-dFastWebView=true') end push(command, '-q', '-P-', '-dNOPAUSE', '-dBATCH', '-sDEVICE=pdfwrite') if os.type == 'unix' then push(command, '-sstdout=%stderr') end push(command, '-sOutputFile='..file.output, '-P-', '-dSAFER') -- We have to include the options twice because -I only takes effect -- if it appears before other options [see ps2pdfwr]. push(command, options, '-f', file.input) command=fixwin(command) --[[ prepend an additional hyphen to activate this code for i=0, #command do print (command[i]) end os.exit(0) --]] ret=os.spawn(command) os.exit(ret)