Home / Alt manpages / pbmtolj(1)

  • pbmtolj(1)
  • User command
  • linux

Convert PBM Images to HP LaserJet Data with pbmtolj

You will turn a PBM bitmap into HP LaserJet or DeskJet printer data, write it to a spool file, and check that the result is a printer stream rather than an accidentally displayed text file. The examples use Netpbm package version 11.05.02 on this machine, with the installed pbmtolj at /usr/bin/pbmtolj.

Allow about fifteen minutes. You need a shell, a readable PBM image and enough free space for the output. This guide only creates a new output file. It does not submit a job to a printer, alter printer settings or require sudo.

1. Check the installed command

Confirm which executable will run and check the package version:

$ command -v pbmtolj
/usr/bin/pbmtolj
$ dpkg-query -W -f='${Package} ${Version}\n' netpbm
netpbm 2:11.05.02-1.1build1

The local manual page describes pbmtolj as a converter from PBM to HP LaserJet data. It accepts one optional PBM file, or reads standard input when the file argument is omitted. You can abbreviate an option to its shortest unique prefix, but full option names are easier to review in scripts.

Checkpoint: make sure the input is really PBM before converting it:

$ file /path/to/input.pbm
/path/to/input.pbm: Netpbm image data, bitmap, ASCII text

The wording from file varies with the PBM encoding. The important part is that the file is a PBM bitmap, not a PPM colour image or an unrelated file.

2. Match pixels to the intended print size

pbmtolj does not rescale the image. Each input pixel becomes one printed dot. The -resolution option declares the output device resolution in dots per inch, and defaults to 75 dpi. For example, an image intended to print at 8 by 10 inches at 300 dpi needs to be 2400 by 3000 pixels before conversion.

Calculate the required dimensions before choosing a command:

$ printf 'width: %s pixels\nheight: %s pixels\n' $((8 * 300)) $((10 * 300))
width: 2400 pixels
height: 3000 pixels

If the source has different dimensions, resize it with a suitable Netpbm tool such as pamscale, pamstretch, pbmreduce or pamenlarge before running pbmtolj. Do not assume that selecting 300 dpi will make a small bitmap physically larger. It changes the dot spacing, not the number of pixels.

3. Convert to a new printer file

Use an explicit resolution and redirect standard output to a destination that does not contain anything valuable:

$ pbmtolj -resolution 300 /path/to/input.pbm > /path/to/output.prn
$ printf 'exit status: %s\n' "$?"
exit status: 0

A successful command normally prints no progress message because the printer data is its standard output. The exit status belongs to the converter, so record it immediately if a script needs to react to failure.

Redirection with > truncates an existing destination before pbmtolj starts. That is destructive if the file already contains a useful print stream. Prefer a new name, or convert to a temporary file and replace the old file only after checking it:

$ pbmtolj -resolution 300 /path/to/input.pbm > /path/to/output.prn.new
$ test -s /path/to/output.prn.new
$ mv /path/to/output.prn.new /path/to/output.prn

If conversion fails, leave the old output alone and inspect the error. Remove the incomplete .new file only when you are sure it is not needed. The mv example replaces the old file, so recovery means restoring your backup or regenerating it from the original PBM.

4. Inspect the generated stream

Do not open a .prn file in a text editor. It contains control bytes as well as raster data. Check that it is non-empty and identify the format:

$ wc -c /path/to/output.prn
52 /path/to/output.prn
$ file /path/to/output.prn
/path/to/output.prn: HP PCL printer data

Exact byte counts depend on the image dimensions, resolution and options. On the installed command, a small test begins with the HP PCL reset sequence and a resolution command:

$ od -An -tx1 -N 16 /path/to/output.prn
 1b 45 1b 26 6c 30 45 1b 2a 74 33 30 30 52 1b 2a

The first bytes are a useful smoke test, not a complete printer protocol validation. Keep the PBM source until the printed page has been checked. If the output is empty or file does not recognise it as printer data, stop before sending it to hardware.

5. Choose reset, positioning and compression options

By default, the output contains printer reset sequences at the beginning and end, and a positioning command that forces the top margin to zero. Use -noreset only when another part of your print workflow deliberately owns printer initialisation. Use -float when you specifically need the positioning command omitted. Both choices change the assumptions made by whatever consumes the stream.

The converter can request three compression modes:

  • -packbits enables TIFF PackBits compression.
  • -delta enables compression based on differences between rows.
  • -compress enables both methods.

For example, produce a separately named compressed candidate:

$ pbmtolj -resolution 300 -compress /path/to/input.pbm > /path/to/output-compressed.prn
$ file /path/to/output-compressed.prn
/path/to/output-compressed.prn: HP PCL printer data

Compression is a request in the generated printer data, not a guarantee that every tiny image will become shorter. Compare file sizes for your real images, and check printer compatibility before changing an established production workflow.

6. Handle copies and multiple PBM images

-copies N sets the printer control for the number of copies and defaults to one. It does not duplicate the raster data in the output file. This is useful when the printer should perform the duplication, but it is not a substitute for generating separate files if your spooler needs independent jobs:

$ pbmtolj -resolution 300 -copies 2 /path/to/input.pbm > /path/to/two-copies.prn
$ file /path/to/two-copies.prn
/path/to/two-copies.prn: HP PCL printer data

The input may be a multi-image PBM stream. With the installed Netpbm 11.05.02, each image becomes a page of output. A stream can be supplied through standard input:

$ pbmtolj -resolution 75 < /path/to/multi-image.pbm > /path/to/pages.prn
$ test -s /path/to/pages.prn && echo 'multi-page stream created'
multi-page stream created

Do not mistake a concatenated PBM file for a printer file. The PBM parser consumes the image stream, while the output is HP LaserJet data. If you need separate spool jobs, split the images before conversion using a tool that understands your PBM stream.

7. Diagnose the usual failures

A missing input or permission error is an input-path problem, not a reason to run the converter as root:

$ test -r /path/to/input.pbm && echo readable
readable
$ ls -l /path/to/input.pbm

Use sudo only if your normal account genuinely cannot read the source or write the chosen destination and your local policy permits that access. The converter itself does not need elevated privileges. Fixing ownership or permissions should be a separate, reviewed system-administration action.

If the printed image is the wrong physical size, check both the PBM dimensions and -resolution. If it is clipped, the bitmap may exceed the printer's printable area. If a printer rejects the result, first retry a small uncompressed file with the default reset behaviour, then consult that printer's documentation. Do not send experimental output to a shared or production printer without checking the destination.

Done means

  • The installed Netpbm version and input format were checked.
  • The PBM dimensions match the desired dot-for-inch calculation.
  • A new, non-empty HP PCL output file was created without overwriting the source.
  • Resolution, reset behaviour, compression and copies were selected deliberately.
  • The output was inspected before any printer submission, and the original PBM remains available for recovery.