updates from MirBSD CVS
[shellsnippets/shellsnippets.git] / mksh / ps2pdfmir
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/ps2pdfmir,v 1.7 2010/07/31 23:11:15 tg Exp $
3 #-
4 # Copyright (c) 2009, 2010
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21 #-
22 # Convert PostScript or PDF to PDF 1.3 (Acrobat 4-and-later compatible),
23 # or, if the -a option is given, to something resembling PDF/A (PDF 1.4,
24 # Acrobat 5-and-later compatible, ISO standardised).
25
26 set -A args
27 function addargs {
28         typeset _i
29
30         for _i in "$@"; do
31                 args[${#args[*]}]=$_i
32         done
33 }
34
35 function usage {
36         print -u2 "Syntax:"
37         print -ru2 "    $0 [-a] [-p papersize] [-t title] infile [outfile]"
38         print -ru2 "    $0 [-a] [-p p.] [-t t.] -o outfile infile [...]"
39         print -ru2 "    $0 [-a] [-p p.] [-t t.] -c -o outfile pscommand [... -f infile ...]"
40         exit 1
41 }
42
43 pdfa=0
44 icmd=0
45 outfile=
46 papersize=
47 overtitle=
48 while getopts "aco:p:t:" c; do
49         case $c {
50         (a)     pdfa=1 ;;
51         (c)     icmd=1 ;;
52         (o)     outfile=$OPTARG ;;
53         (p)     papersize=$OPTARG ;;
54         (t)     overtitle=$OPTARG ;;
55         (*)     usage ;;
56         }
57 done
58 shift $((OPTIND - 1))
59
60 #XXX
61 if [[ $overtitle = *@(\(|\))* ]]; then
62         print -u2 Cannot deal with parentheses in title.
63         exit 1
64 fi
65
66 if [[ -n $outfile ]]; then
67         (( $# )) || usage
68         infile=
69 else
70         case $# {
71         (1)     infile=$1
72                 if [[ -z $infile ]]; then
73                         usage
74                 elif [[ $infile = - ]]; then
75                         outfile=-
76                 else
77                         outfile=${infile%.?(e)ps}.pdf
78                 fi
79                 ;;
80         (2)     infile=$1
81                 outfile=$2
82                 [[ -z $infile || -z $outfile ]] && usage
83                 ;;
84         (*)     usage
85                 ;;
86         }
87 fi
88
89 r=${0%/*}
90 [[ $r = $0 ]] && r=.
91 r=$(realpath "$r")
92 (( pdfa )) && addargs -I"$r"
93
94 addargs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$outfile" \
95     -dSAFER -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true
96 [[ -n $papersize ]] && addargs -sPAPERSIZE="$papersize"
97
98 if (( pdfa )); then
99         p=$r/sRGB_IEC61966-2-1_black_scaled.icc
100         d=$r/ps2pdfa.ps
101         if [[ ! -s $p || ! -s $d ]]; then
102                 print -u2 "Cannot find definition and profile files:"
103                 print -ru2 -- "- $d"
104                 print -ru2 -- "- $p"
105                 exit 1
106         fi
107         addargs -dNOOUTERSAVE -dPDFA -sProcessColorModel=DeviceCMYK \
108             -c /ICCProfile "($p)" def -f "$d"
109 fi
110
111 addargs -c .setpdfwrite
112 [[ -n $overtitle ]] && addargs '[' /Title "($overtitle)" /DOCINFO pdfmark
113
114 if [[ -n $infile ]]; then
115         addargs -f "$infile"
116 elif (( icmd )); then
117         addargs "$@"
118 else
119         addargs -f "$@"
120 fi
121 exec gs "${args[@]}"