home *** CD-ROM | disk | FTP | other *** search
- #!/bin/sh
-
- # $Id: pstopdf,v 1.3 2003/02/15 15:21:00 gurubert Exp $
- #
- # This is a Postscript to PDF filter for CUPS
- #
- # (C) 2003 Robert Sander <robert.sander@epigenomics.com>
- #
- # Released under GPL
- #
- # NO WARRANTY AT ALL
- #
-
- set -e
-
- PS2PS=/usr/bin/ps2ps
- PS2PDF=/usr/bin/ps2pdf13
- PS2PS_OPTIONS="-dAutoRotatePages=/None -dAutoFilterColorImages=false \
- -dNOPLATFONTS -dPARANOIDSAFER -sstdout=%stderr"
- PS2PDF_OPTIONS="$PS2PS_OPTIONS -dColorImageFilter=/FlateEncode \
- -dDoNumCopies -dPDFSETTINGS=/printer"
-
- echo "DEBUG: pstopdf $# args: $@" >&2
- echo "DEBUG: PPD: $PPD" >&2
-
- if [ $# -lt 5 -o $# -gt 6 ]; then
-
- echo "ERROR: $0 job-id user title copies options [file]" >&2
- exit 1
-
- fi
-
- # Read from given file.
- if [ -n "$6" ]; then
- exec <"$6"
- fi
-
- tempfiles=
- trap 'rm -f $tempfiles' 0 1 2 13 15
-
- infile=$(mktemp -t pstopdf.XXXXXX)
- tempfiles="$tempfiles $infile"
-
- cat >"$infile"
-
- # Apply PPD settings.
-
- resolution=
- eval "$(printf "%s" "$5" | sed -nre 's/.*(^|\s)Resolution=([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\2}"/p')"
- if test -e "$PPD"; then
- eval "$(sed -nre 's/^\*DefaultResolution:\s*([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\1}"/p' "$PPD")"
- fi
- echo "DEBUG: Resolution: $resolution" >&2
-
- width=
- height=
- bl_x=
- bl_y=
- tr_x=
- tr_y=
- margin_l=
- margin_b=
- margin_r=
- margin_t=
- pagesize=
- eval "$(printf "%s" "$5" | sed -nre 's/.*(^|\s)(media|PageSize)=(\S+).*/pagesize="${pagesize:-\3}"/p')"
- if test -e "$PPD"; then
- eval "$(sed -nre 's/^\*DefaultPageSize:\s*(\S+).*/pagesize="${pagesize:-\1}"/p' "$PPD")"
- fi
- echo "DEBUG: Page size: $pagesize" >&2
-
- if test -n "$pagesize" && test -e "$PPD"; then
- eval "$(sed -nre 's|^\*PaperDimension\s+'"$pagesize"'/[^:]+:\s*"(\S+)\s+(\S+)".*|width="\1"; height="\2"|p' "$PPD")"
-
- eval "$(sed -nre 's|^\*ImageableArea\s+'"$pagesize"'/[^:]+:\s*"(\S+)\s+(\S+)\s+(\S+)\s+(\S+)".*|bl_x="\1"; bl_y="\2"; tr_x="\3"; tr_y="\4"|p' "$PPD")"
- fi
- echo "DEBUG: Width: $width, height: $height, absolute margins: $bl_x, $bl_y, $tr_x, $tr_y" >&2
-
- if test -n "$width" && test -n "$height" && \
- test -n "$bl_x" && test -n "$bl_y" && \
- test -n "$tr_x" && test -n "$tr_y"; then
- margin_l="$bl_x"
- margin_b="$bl_y"
- margin_r="$(printf "scale=8; (%s)-(%s)\n" "$width" "$tr_x" | bc)"
- margin_t="$(printf "scale=8; (%s)-(%s)\n" "$height" "$tr_y" | bc)"
- fi
- echo "DEBUG: Relative margins: $margin_l, $margin_b, $margin_r, $margin_t" >&2
-
- if test -n "$margin_l" && test -n "$margin_b" && \
- test -n "$margin_r" && test -n "$margin_t"; then
- inject_ps="<</.HWMargins[$margin_l $margin_b $margin_r $margin_t] /Margins[0 0]>>setpagedevice"
- fi
-
- ppd_opts=
- if test -n "$resolution"; then
- ppd_opts="${ppd_opts:+$ppd_opts }-r$resolution"
- fi
- if test -n "$width"; then
- ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEWIDTHPOINTS=$width"
- fi
- if test -n "$height"; then
- ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEHEIGHTPOINTS=$height"
- fi
- echo "DEBUG: PPD options: $ppd_opts" >&2
-
- # We do not supply the margins to the ps2pdf process, as this breaks
- # full-bleed printing and also disturbs the printing if PPDs have too
- # conservative margin definitions.
- inject_ps=
-
- # Injection
- echo "DEBUG: PostScript to be injected: $inject_ps" >&2
- if test -n "$inject_ps"; then
- echo "DEBUG: Injecting PostScript: $inject_ps" >&2
-
- orig_infile="$infile"
-
- infile=$(mktemp -t pstopdf.XXXXXX)
- tempfiles="$tempfiles $infile"
-
- perl -p -e 'if (! $did) { s:(^%!.*)$:\1\n'"$inject_ps"': && $did++; }' "$orig_infile" > "$infile"
- fi
-
- # DRM
-
- DRM_MATCH='^%.*Removing the following.*lines is illegal.*Digital Copyright Act'
- if egrep -q "$DRM_MATCH" "$infile"; then
- # This PS is DRM-infested. Normalize it with ps2ps first.
- echo "DEBUG: Normalizing Adobe Reader PostScript with ps2ps" >&2
-
- DRMFILTER="$PS2PS $PS2PS_OPTIONS $ppd_opts - -"
- else
- DRMFILTER=cat
- fi
-
- echo "DEBUG: Running $DRMFILTER | $PS2PDF $PS2PDF_OPTIONS $ppd_opts - -" >&2
- cat "$infile" | $DRMFILTER | $PS2PDF $PS2PDF_OPTIONS $ppd_opts - -
-