Getting and setting printer options from the command line for use with lpadmin
Mar 16, '12 07:30:00AM • Contributed by: joelbruner

Mar 16, '12 07:30:00AM • Contributed by: joelbruner
lpadmin and lpoptions don't interact with OS X as you might think, or at least as they are documented. Here are some helpful notes and a script.
There are some good hints for adding printers via the command line with lpadmin: Managing multiple printers via the command line.
However, there is still confusion surrounding the setting of printer options from the command line, as a poster to Debian bugs pointed out back in 2006: lpoptions documentation doesn't. After doing some testing, here are the two main points to note:
If you use lpadmin and specify options with "-o", the PPD is altered and OS X will recognize the options for the printer.
However, if you setup the printer using lpadmin without any options, and later use lptoptions to set the options, they are not written to the PPD and the GUI is unaware of the printer's options.
More helpful hints about lpadmin and lpoptions:
The following script compares the original and the newly installed PPD to generate the options syntax to be used with lpadmin
The main magic in this script is a little diff and sed:
Script Workflow Copy and paste the script into TextWrangler, save with a .command extension and it will automatically take care of the executable bit.
Setup your printer via the Printers Preference Pane in the GUI.
Look in /etc/cups/ppd and find the newest .ppd (it will have the same name as the printer).
Locate the original .ppd.gz (or .ppd) in /Library/Printers/PPDs/Contents/Resources/. The printer's ppd is usually easy to find by name, but some printers, such as those from Canon, have some cryptic filenames. Look inside the /etc/cup/ppd file; the "PCFileName" variable sometimes helps to determine the file name.
Run the script given below; it will ask you to drag in the original and the modified ppds. Out will come the "-o" options for use with lpadmin.
You can also run the script with the original and modified file paths as arguments and the string will be output.
The script "ppdOptionsDiff.command":
Use the string generated in lpadmin to set the printer options.
[kirkmc adds: A very extensive presentation; thanks. I haven't tested or investigated any of this.]
There are some good hints for adding printers via the command line with lpadmin: Managing multiple printers via the command line.
However, there is still confusion surrounding the setting of printer options from the command line, as a poster to Debian bugs pointed out back in 2006: lpoptions documentation doesn't. After doing some testing, here are the two main points to note:
More helpful hints about lpadmin and lpoptions:
lpoptions -p printername -l
Prints PPD options, "Default" is filtered from option name (similar to looking at the raw PPD)
It uses a colon when reporting key value pairs; replace that with an equals sign when specifying an option
The option name stops at the first slash
Example: The duplex option for HP printers will output like this "HPOption_Duplexer/Duplex Unit: *True False"
When specified as a "-o" option it would be "HPOption_Duplexer=True"
lpadmin ... -o this=that
Alters the ppd that is placed in /etc/cups/ppd/ when the printer is installed
Unhelpful things:
lpoptions -p printername
These are NOT the PPD options you want to set
lpoptions -o
This only writes options to: /private/etc/cups/lpoptions (run with sudo) or ~/.cups/lpoptions (run as current user), GUI apps are unaware of these options
The following script compares the original and the newly installed PPD to generate the options syntax to be used with lpadmin
The main magic in this script is a little diff and sed:
diff "$originalfile" "$newfile" | grep "> [*]Default" | sed 's/> [*]Default/-o /g' | sed 's/: /=/g'
Script Workflow
The script "ppdOptionsDiff.command":
#!/bin/bash #set -x #ppd option maker if [ "$1" == "-h" ]; then echo "$(basename $0) compares two ppds and outputs the differences as a string for use in lpadmin" echo "Usage: $(basename $0) [original_ppd] [new_ppd]" exit fi if [ -z "$1" -o -z "$2" ]; then clear; echo "Drag in the unmodified PPD from /Library/Printers/PPDs/Contents/Resources:" while [ -z "$originalfile" ]; do read originalfile done echo "Drag in the PPD from /etc/cups/ppd:" while [ -z "$newfile" ]; do read newfile done elif [ -n "$1" -o -n "$2" ]; then newfile="$2" originalfile="$1" fi #if file is compressed if [ "${originalfile##*.}" == "gz" ]; then #uncompress IFS=$'\n\t' gunzipFile="/tmp/$(basename $originalfile .gz)" gunzip < "$originalfile" > "$gunzipFile" originalfile="$gunzipFile" fi #test for file existence if [ ! -f "$originalfile" ]; then echo "$originalfile is not a valid path"; exit; fi if [ ! -f "$newfile" ]; then echo "$newfile is not a valid path"; exit; fi #create options list by diffing and filtering optionList=$(diff "$originalfile" "$newfile" | grep "> [*]Default" | sed 's/> [*]Default/-o /g' | sed 's/: /=/g') #print out the options with no line breaks IFS=$'\n\t' if [ ! -z "$optionList" ]; then for option in $optionList; do echo -n "$option " done echo else echo No differences fi #delete the temp file from gunzipping [ -f "$gunzipFile" ] && rm "$gunzipFile" exitExample with pathnames provided as arguments (otherwise runs in interactive mode):
$ ./ppdOptionsDiff.command /Library/Printers/PPDs/Contents/Resources/HP\ LaserJet\ 5200.gz /private/etc/cups/ppd/PRINTERNAME.ppd
-o HPOption_Tray3=Tray3_500 -o HPCollateSupported=True -o HPOption_Duplexer=True -o HPOption_Disk=RAMDisk
[kirkmc adds: A very extensive presentation; thanks. I haven't tested or investigated any of this.]
•
[12,226 views]