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