⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cups-pcl3

📁 openmeetings组件之GS openmeetings组件之GS openmeetings组件之GS
💻
字号:
#!/bin/sh#******************************************************************************# File:     @(#)$Id: cups-pcl3,v 2.5 2001/05/18 14:58:24 Martin Rel $# Contents: CUPS filter converting application/vnd.cups-postscript to PCL-3#           using ghostscript with the pcl3 driver# Call:     cups-pcl3 <CUPS filter arguments># Author:   Martin Lottermoser, Greifswaldstrasse 28, 38124 Braunschweig,#           Germany; Martin.Lottermoser@t-online.de##******************************************************************************#									      *#	Copyright (C) 2001 by Martin Lottermoser			      *#	All rights reserved						      *#									      *#******************************************************************************## Required entries in PPD files# -----------------------------# The PPD files distributed with pcl3 are by default already configured for# this filter. If you are using one of these files, continue reading with the# next section.## If you want to use another PPD file or ghostscript driver, add or modify the# following two statements in the PPD file:##   *cupsFilter: "application/vnd.cups-postscript 0 cups-pcl3"#   *GhostscriptOptions: "<gs options>"## Replace <gs options> with a sequence of command line options for ghostscript# which select the device, in the case of pcl3 also the subdevice if the device# is "pcl3". From the point of view of the PPD specification, the# *GhostscriptOptions statement may contain only a single-line QuotedValue# without hexadecimal substrings. From the point of view of this filter, the# value should not contain any characters with special meaning for the shell,# except internal field separators.### Installation of this filter# ---------------------------# Copy this file to the .../cups/filter directory.## If you've not yet installed the necessary PPD files, do it now. After that# you should be able to create a queue and start to print. The remaining# comments refer to steps you may perform later if you wish.##   Exception: If the ghostscript binary you wish to use is not the one found#   by calling "gs" from the filter, you'll have to set "GhostscriptCommand" in#   a configuration file. Read the instructions in the next section.## Should you encounter problems when trying to print, check CUPS' error log# file. If necessary, increase the CUPS LogLevel to "debug", restart CUPS and# try again.### Configuration# -------------# This filter uses a queue-specific PostScript configuration file if it exists.# This file must have the name $PRINTER.ps ($PRINTER is the name of the queue)# and must reside in the "config" subdirectory (create it if it doesn't exist)# of the $CUPS_SERVERROOT directory, usually /etc/cups. This file will be# handed to ghostscript before the PostScript file to be printed.## Use this configuration file for correcting misalignments, modifying# "InputAttributes" or "OutputAttributes", setting default transfer functions# or any other queue-specific configuration independent of the document to be# printed. Primarily this file should contain PostScript commands to simulate# persistent state for the printer (what you would store in a real PostScript# printer's memory in such a manner that it survives power-off or at least# end-of-job). Note that because the file to be printed will be processed after# the configuration file, the former can still override the latter.## In addition, you can insert configuration statements for this filter into the# file. These statements must be given as PostScript comments starting in# column 1. The possiblities are:##   % DivertToFile: <path>#	CUPS' document manager does not always operate correctly. If you#	suspect that the settings you have demanded do not take effect or#	ghostscript gives an error when printing through this filter while the#	original file is valid PostScript, set <path> to the name of a file#	which is writable for the user running this filter (usually lp).#	Instead of printing, the filter will then copy its input to that file,#	prepending a comment containing the command line it would use for#	calling ghostscript.##   % DoAccounting: <True or False>#	This parameter determines whether pcl3 will issue CUPS page accounting#	messages or not. The default is "True". You should set this to "False"#	only if the page accounting messages are generated by the backend#	(later in the print pipeline).##   % GhostscriptCommand: <path to gs>#	Use this to set the command to invoke ghostscript. The default#	corresponds to "% GhostscriptCommand: gs".##   % UseIntermediateFile: <True or False>#	This statement determines whether the ghostscript output file is first#	written to disk or is copied directly to the printer. The former is#	safer because it is legitimate for a PostScript program to invoke#	operators like "print" which generate output which ghostscript maps to#	standard output even for "-sOutputFile=-" (in my opinion this is a bug#	in ghostscript). If you print such a document, the result is unlikely#	to be usable. The same applies if you print an illegal PostScript file#	because ghostscript issues some error messages on standard output.#	The default is therefore "% UseIntermediateFile: True". This might#	however require substantial disk space.## Of course the file need not contain any PostScript commands if you just need# it for filter configuration.##******************************************************************************#name=`basename "$0"`name=cups-pcl3	# Invalid CUPS documentationprintf 'DEBUG: %s: called for queue %s\n' "$name" "${PRINTER:-}" >&2printf 'DEBUG: %s: command line: %s %s\n' "$name" "$0" "$*" >&2# Argumentsif [ $# -ne 5 -a $# -ne 6 ]; then  printf 'ERROR: Usage: %s job user title copies options [filename]\n' "$0" >&2  exit 1fijob="$1"user="$2"title="$3"copies="$4"	# can be ignored in this filter (pstops generates "NumCopies")options="$5"test $# -lt 6 || exec < "$6" || exit 1# We ignore all options completely because, as far as they are meaningful and# as far as I understand the matter, preceding filters (in particular pstops)# should have taken care of them, i.e., we assume that they have been converted# into PostScript code as far as possible.# Besides, I'm not aware of any statement in CUPS which tells a filter's# author which options can be expected (from the source code it's easiest to# find out which one needs not to expect, but that is not very interesting).#******************************************************************************# Find configuration file for the queuecfgfile="${CUPS_SERVERROOT:-/etc/cups}/config/${PRINTER:-}.ps"if [ -f "$cfgfile" ]; then  printf 'DEBUG: %s: Using configuration file %s.\n' "$name" "$cfgfile" >&2else  printf 'DEBUG: %s: No configuration file %s.\n' "$name" "$cfgfile" >&2  cfgfile=fi# Subroutine to extract filter options from the configuration fileextract(){  # Argument $1: name of the option  sed -e "/^% $1:/!d" -e 's/^[^:]*: *//' "$cfgfile" | head -1}# Extract filter optionsdacc=divert=gs_command=use_intermediate_file=if [ '' != "$cfgfile" ]; then  if [ ! -r "$cfgfile" ]; then    printf 'ERROR: %s: %s is not readable.\n' "$name" "$cfgfile" >&2    exit 1  fi  dacc=`extract DoAccounting`  divert=`extract DivertToFile`  gs_command=`extract GhostscriptCommand`  use_intermediate_file=`extract UseIntermediateFile`fitest '' != "$dacc" || dacc=Truetest '' != "$gs_command" || gs_command=gstest '' != "$use_intermediate_file" || use_intermediate_file=Trueprintf 'DEBUG: %s: GhostscriptCommand: %s, DoAccounting: %s, '\'UseIntermediateFile: %s.\n' \  "$name" "$gs_command" "$dacc" "$use_intermediate_file" >&2accounting=-dCUPSAccountingtest False != "$dacc" || accounting=# Find the command line options from the PPD file. We need not bother about# *Include statements because CUPS doesn't support them.if [ ! -f "${PPD:-}" ]; then  printf 'ERROR: %s: No PPD file %s.\n' "$name" "${PPD:-}" >&2  exit 1fiprintf 'DEBUG: %s: Using PPD file %s.\n' "$name" "$PPD" >&2gs_options=`grep '^\*GhostscriptOptions:' "$PPD" | \  sed -e '1!d' -e 's/^[^"]*"//' -e 's/".*$//'`if [ '' = "$gs_options" ]; then  printf 'ERROR: %s: No *GhostscriptOptions statement in %s.\n' \    "$name" "$PPD" >&2  exit 1fiprintf 'DEBUG: %s: *GhostscriptOptions: "%s"\n' "$name" "$gs_options" >&2# Treat RIP_MAX_CACHEif [ '' != "${RIP_MAX_CACHE:-}" ]; then  printf 'DEBUG: %s: RIP_MAX_CACHE is %s.\n' "$name" "$RIP_MAX_CACHE" >&2  # Convert to "MaxBitmap" value (cnf. pstoraster/gdevprn.c in CUPS)  amount=`printf '%s\n' "$RIP_MAX_CACHE" | sed -e 's/[^0-9].*$//'`  unit=`printf '%s\n' "$RIP_MAX_CACHE" | sed -e 's/^[0-9]*//'`  if [ '' = "$amount" ]; then    amount=33554432	# 32 binary mega bytes  else    case "$unit" in    g*)      amount=`expr $amount '*' 1073741824`;;	# binary giga bytes      # Note that this will fail on 32-bit systems if "amount" is larger than      # one.    m*)      amount=`expr $amount '*' 1048576`;;	# binary mega bytes    k*)      amount=`expr $amount '*' 1024`;;		# binary kilo bytes    *)      # This applies to "t" and to no unit specification.      amount=`expr $amount '*' 262144`;;	# 256 K    esac  fi  printf 'DEBUG: %s: MaxBitmap will become %s.\n' "$name" "$amount" >&2  gs_options="$gs_options -dMaxBitmap=$amount"fi#******************************************************************************if [ '' != "$divert" ]; then  cat << --- > "$divert" || { \    printf 'ERROR: %s: Failure to write to %s.\n' "$name" "$divert" >&2; \    exit 1; }%!% $name input for job $job% Call to ghostscript: $gs_command $gs_options -dCUPSMessages $accounting $cfgfile <this file>---  cat >> "$divert" || exit 1  printf 'WARNING: %s: No printing, output for job %s diverted to %s.\n' \    "$name" "$job" "$divert" >&2  exit 0fi#******************************************************************************if [ False = "$use_intermediate_file" ]; then  # Directly to stdout, hoping that other data will not appear. However,  # in order not to loose an error message text, the following command is  # used to ensure that this output will be printed properly and in  # particular without a "staircase effect" provided the error occurs on the  # first page.  printf '\033E\033&k2G\033&s0C'  # PCL: Printer Reset, Line Termination (LF -> CR+LF), End-of-Line-Wrap (ON).  # Now call ghostscript ("-dNOPAUSE -dBATCH" are currently superfluous, but  # ghostscript's documentation is not sufficiently clear on this point to make  # it appear safe to drop them).  $gs_command $gs_options -dCUPSMessages $accounting -q -dNOPAUSE -dBATCH \    -dSAFER -sOutputFile=- $cfgfile -  # Newer gs versions (>= 5.65) accept also "-_" which might be faster than "-".  rc=$?else  # Call ghostscript with an intermediate file. See also comments above.  tmp="${TMPDIR:-/tmp}/$$.tmp"  rm -f "$tmp"  $gs_command $gs_options -dCUPSMessages $accounting -q -dNOPAUSE -dBATCH \    -dSAFER -sOutputFile="$tmp" $cfgfile - >&2  rc=$?  # Copy the file to stdout on success  test 0 -ne $rc -o ! -f "$tmp" || cat "$tmp" || {    rm -f "$tmp"    printf 'ERROR: %s: cat to stdout failed for %s.\n' "$name" "$tmp" >&2    exit 1  }  rm -f "$tmp"fiif [ 0 -ne $rc ]; then  printf 'ERROR: %s: ghostscript returned %s for job %s (invalid PostScript input?).\n' \    "$name" "$rc" "$job" >&2  # Send a mail message if we have mailx and "$user" is something sensible  # (CUPS doesn't seem to guarantee that at present for remote users)  if type mailx > /dev/null 2>&1 && \	{ expr x"$user" : '.*@' > /dev/null || id "$user" > /dev/null 2>&1; }      then    mailx -s "$name"": Error printing job $job" "$user" << ---Ghostscript returned an error code ($rc) for your print job $job.The most likely cause is an invalid input file. If you submitted aPostScript file, run ghostscript or ghostview on it to check itscorrectness. If it is valid or you submitted a non-PostScript file,inspect CUPS' error log file for further information on the error.If that does not expose the cause, read the initial comments in$0, especially on DivertToFile.---  fi  # No exit with non-zero return code because that would disable the printer.  # As the error is most likely due to an illegal input file, such a drastic  # step is not justified (it would even prevent other users from printing).fiexit 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -