From disk to paper

Scripted Printing

Constantly recurring tasks, such as a database query, can be easily automated using a shell script. However, the command-line tools usually output the results without printable formatting.

With a little help from the enscript command, the output can be processed quite easily. enscript writes the result directly to a PostScript (PS) file and also supports printing the output content. This is used in the sample script from Listing 5.

Listing 5

Process Output

01 #!/bin/bash
02 # Database query (PostgreSQL) with print preparation
03
04 # Select PDF file or print
05 approach=$(echo "Print PDF" | smenu )
06 if [ "$approach" = "Print" ]; then
07   # Select printer
08   target=$(/usr/sbin/lpc status all | grep \: | tr -d \: | smenu -n3 -c -m "Choose a printer:")
09   # Database query, character set conversion, print preparation and printing
10   psql -P border=3 -c "select * from parts;" | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -P$target
11 elif [ "$approach" = "PDF" ]; then
12   # Database query, character set conversion, generate PS
13   psql -P border=3 -c "select * from parts;" | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o partlist.ps
14   # Convert to PDF file
15   ps2pdf14 partlist.ps
16   # Delete PS file
17   rm -v partlist.ps
18   echo "Query saved in partlist.pdf"
19 fi

However, it is important to note that Enscript cannot handle UTF-8 encoded files and pipes. You need to convert the data to the desired character set in advance using recode. Both programs work both in a pipe and with files. If necessary, the PS files can also be converted to PDF format using Ps2pdf14.

The sample script in Listing 5 still offers plenty of scope for improvements and your own ideas. The process flow is shown in Figure 9, and the database query's output is shown in Figure 10. The script is primarily intended to demonstrate how little effort it takes to solve even very complex tasks. Compared to the clicks required with a database client from an office package, the terminal script saves a huge amount of work.

Figure 9: Listing 5 automates querying a PostgreSQL database. The script first prints the results directly and then writes a PDF file.
Figure 10: This is how the database query leaves the printer. The enscript command-line tool prepares the results.

Preparing the Output

The call to enscript (lines 10 and 13 of Listing 5) can be adapted to suit your own needs, if required. For example, you can opt to print in landscape format, specify the type and size of the font, and even output source code with syntax highlighting (see the "Source Code in Color" box). Some of the corresponding options are listed in Table 3.

Table 3

enscript Options

Action

Option

Note

Column specification

-<Number>

Specification of the pages to be printed

-a<FirstPage>-<LastPage>

Print odd pages

-a odd

Print even pages

-a even

Suppress page header

-B

Suppress job header

-h

Curtail over-length lines

-c

Specify printer

-d <printer>

Also possible, -P <printer>

Duplex printing

-DDuplex

Syntax highlighting

-E<language>

Output overview with enscript --help-highlight (in newer versions also enscript --help-pretty-print)

Text font

-f<font size>

Header font

-F<font size>

Reading lines

-H<number>

<number> outputs the frequency of reading lines; -H1 results in a "zebra crossing" with alternating light and dark lines

Specify grayscale for reading lines

--highlight-bar-gray=<value>

Title

-t

Multiple copy

-n <number>

Output file

-o <file>

-p <file> also possible

Landscape format

-r

Footer

-u<Text>

Multiple logical pages per page

-U <number>

<number> must be 2 or a multiple of it

For example, it is often necessary to avoid line breaks. If the lines are too long, it helps to use a smaller font or print in landscape format. This problem can also be solved by scripting. The wc -L command lets you determine the length of the longest occurring line. You can then use the value obtained in this way as a criterion for determining the font size and page orientation:

  • Up to 80 characters: 10/12pt font size
  • 80-132 characters: 8pt font size or 10/12pt and landscape format.
  • 132 characters or more: 8/10pt font size and landscape orientation.

Listing 6 shows a sub-script that uses wc to determine the longest line (Line 7) and then tells enscript to print in landscape mode or leave it in portrait mode with the conventional orientation (if loop starting at line 10).

Listing 6

Choose Page Orientation

01 #!/bin/bash
02
03 # File selection
04 file=$(ls -1 | smenu -n 10 -t 4)
05
06 # maximum line length
07 mz=$(cat $file | wc -L)
08
09 # Portrait up to 80 characters, landscape above this
10 if [ $mz -lt 80 ]; then
11         cat $file | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o $file.ps
12 elif [ $mz -gt 80 ]; then
13         cat $file | recode UTF8..ISO-8859-15 | enscript -r -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o $file.ps
14 fi
15
16 [... Print commands, PDF conversion ...]

Conclusions

Even in the shell and in scripts, you do not have to do without the convenience that graphical interfaces offer when printing. Printer selection, queue management, and the creation of attractive print output can be easily integrated into your shell scripts. And you don't have to reinvent the wheel or learn programming. Simple shell scripts and practical command line tools take much of the work off your hands.

Source Code in Color

Text editors intended for programming usually color highlight commands, variables, or instructions; this makes it far easier to keep track of the source code. enscript also offers this kind of function with the -E<Language> option. A list of all supported schemas can be obtained with the enscript --help-highlight or enscript --help-pretty-print commands, depending on the version. For example, the command

enscript -H1 --highlight-bar-gray=08 -fCourierBold10 --color -Ebash -o Source.sh.ps Source.sh

creates a colored image of the Source.sh shell script (Figure 11). Before doing this, the correct character set again had to be set with recode.

Figure 11: Optionally, the Enscript output can also use syntax highlighting, to improve the source code printout.

Infos

  1. lp manpage: http://manpages.org/lp
  2. lpr manpage: http://manpages.org/lpr
  3. "Create a select menu with smenu" by Harald Zisler, Linux Magazine, Issue 205, December 2017, p. 32, http://www.linux-magazine.com/Issues/2017/205/smenu

The Author

Harald Zisler has been working with FreeBSD and Linux since the early 1990s. He writes magazine articles and books on technical and IT topics.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

SINGLE ISSUES
 
SUBSCRIPTIONS
 
TABLET & SMARTPHONE APPS
Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • smenu

    The smenu tool reduces the effort of creating shell menus to one line, with numerous options for a wide range of design alternatives.

  • Command Line – CUPS

    Using the Common Unix Printing System, you can configure and manage your printer from the command line.

  • Perl – Print Test

    Cautious administrators will want to make sure a Linux installation is still working as intended after an update. A simple test suite offers that assurance.

  • Make Your Printer Smarter

    Niche hardware from the olden days does not always embrace the network. Attaching a Raspberry Pi or other single board computer can add lots of new functionality.

  • Bluetooth Printing

    Even if your printer vendor doesn’t advertise Linux Bluetooth support, there are a few tools that may help you set up your Linux system for Bluetooth printing.

comments powered by Disqus
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters

Support Our Work

Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.

Learn More

News