1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
#!/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] <inputfile> <outputfile>\n\n'..
' <inputfile> can be either a PS, EPS, or PDF file.\n'..
' A single hyphen (-) denotes stdin.\n\n'..
' <outputfile> is required if <inputfile> 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.4' -- 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-', '-dSAFER', 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)
|