Home / Alt manpages / ppmtolj(1)

  • ppmtolj(1)
  • User command
  • linux

Convert a PPM to HP PCL 5 Colour with ppmtolj

Send a PPM straight to a colour LaserJet by turning it into HP PCL 5 Colour data with ppmtolj. The examples use Netpbm 11.5.2, package version 2:11.05.02-1.1build1. Allow about ten minutes if the PPM is already prepared; the conversion itself takes only a moment.

You need a readable PPM file and the netpbm package. The command writes PCL to standard output, so redirect it to a new file. It does not need sudo when you can read the input and write the destination directory.

1. Check the installed command and input

Confirm which executable your shell will run, then check the input without changing it:

$ command -v ppmtolj
/usr/bin/ppmtolj
$ file /path/to/input.ppm
/path/to/input.ppm: Netpbm image data, size 1200 x 800, ...

The exact file description varies with the image, but it should name a PPM image with plausible dimensions. The installed manual page is dated 4 September 2000, while the package itself is newer, so this guide sticks to what is actually on this machine and does not assume a newer release has extra options.

Checkpoint

If command -v prints nothing, stop and install Netpbm through your normal package-management process. Do not create a replacement script called ppmtolj in the working directory: that hides which program is actually being tested.

2. Make a PCL file with the default settings

Choose a new destination and redirect the command's standard output:

$ ppmtolj /path/to/input.ppm > /path/to/output.pcl
$ printf '%s\n' "$?"
0

A status of 0 means ppmtolj finished cleanly. There is no progress display because the converted data is going straight to the redirected stream. Check that the result is recognised as HP PCL:

$ file /path/to/output.pcl
/path/to/output.pcl: HP PCL printer data
$ wc -c /path/to/output.pcl
84217 /path/to/output.pcl

Your byte count will differ. Just confirm it is non-zero and not a text log that got captured by mistake.

3. Protect an existing output file

Shell redirection with > truncates its destination before ppmtolj even starts. If the target name already holds a useful print file, write to a temporary name first and swap it in only after checking the result:

$ ppmtolj /path/to/input.ppm > /path/to/output.pcl.new
$ test -s /path/to/output.pcl.new
$ file /path/to/output.pcl.new
/path/to/output.pcl.new: HP PCL printer data
$ mv /path/to/output.pcl.new /path/to/output.pcl

Warning

The mv is the only state-changing step here. If conversion or verification fails, leave the existing output alone and remove the incomplete .new file only after inspecting it: rm is irreversible, so double-check the exact path first. There is no undo for a successful replacement unless you kept a backup.

4. Pick the printer resolution

Use -resolution when the target printer or workflow needs a particular output resolution. The manual only accepts 75, 100, 150, 300 or 600:

$ ppmtolj -resolution 300 /path/to/input.ppm > /path/to/output-300.pcl
$ test -s /path/to/output-300.pcl && file /path/to/output-300.pcl
/path/to/output-300.pcl: HP PCL printer data

Do not pass an arbitrary DPI and hope it gets rounded to the nearest allowed value; it will not. If your printer documentation calls for a different figure, sort out that compatibility question before you send anything. The option sets the required output resolution, it is not an image-resizing command.

The manual does not state a default resolution, so do not build a script around an assumed one. Pass -resolution explicitly whenever reproducibility matters, especially if files get exchanged between hosts or queued for a different printer.

5. Shrink the output or strip printer setup information

  • Compress with -delta. Delta row compression can shrink the PCL file without touching the source PPM:
    $ ppmtolj -resolution 300 -delta /path/to/input.ppm > /path/to/output-compressed.pcl
    $ wc -c /path/to/output-compressed.pcl
    File size depends on the image, so do not promise a particular reduction; verify the file and test-print it before it goes anywhere near a production queue.
  • Drop positioning with -float. By default the program writes positioning information, including the sequence ESC&l0E. Use -float to suppress it, and only when the receiving PCL workflow supplies or deliberately omits its own positioning context:
    $ ppmtolj -float /path/to/input.ppm > /path/to/output-float.pcl
  • Drop reset sequences with -noreset. This suppresses the reset sequence at the start and end of the output, which matters when another carefully controlled PCL stream wraps around this image. It removes the command's normal reset boundaries, so treat it as a printer-integration option, not a general optimisation. Test it against the exact queue or spooler before you rely on it.

6. Apply gamma correction only with a known requirement

-gamma takes an integer and defaults to 0. It changes the image correction applied during conversion:

$ ppmtolj -gamma 1 /path/to/input.ppm > /path/to/output-gamma.pcl
$ test -s /path/to/output-gamma.pcl && echo 'PCL file written'

The manual gives no table of gamma values and no description of the visual result for each integer. Do not guess at a value because a print looks too light or too dark. Make a small test file, compare the physical print against the uncorrected version, and record whatever value you settle on alongside the print workflow.

7. Combine options for a controlled conversion

Options stack. This example asks for an explicit resolution, delta compression, gamma correction, no positioning information and no reset sequence, all at once:

$ ppmtolj -resolution 300 -delta -gamma 1 -float -noreset \
    /path/to/input.ppm > /path/to/controlled.pcl
$ test -s /path/to/controlled.pcl
$ file /path/to/controlled.pcl
/path/to/controlled.pcl: data

Some file-identification tools will just call a customised stream data, especially once reset information is suppressed. That label alone is not a failure: check the exit status, confirm a non-zero size, and check with the target printer or PCL consumer. If you do not need a surrounding PCL stream, skip -float and -noreset so the output keeps its normal setup and reset sequences.

Common traps

  • Cannot open the input. Check the path and read permission:
    $ ls -l /path/to/input.ppm
    $ test -r /path/to/input.ppm && echo readable
  • Cannot create the output. Check the destination directory before reaching for sudo:
    $ test -d /path/to
    $ test -w /path/to && echo writable
  • Reaching for elevated privileges. Only use them when your system administrator deliberately granted them for the input or destination. Running the converter as root does not repair an invalid PPM, select a compatible printer mode, or make a damaged PCL stream safe. Keep the original PPM until a test print or downstream check succeeds.

Warning

Do not send an unverified file to a live printer queue. A bad PCL file can make a printer chew through paper, and -float or -noreset can be wrong for a shared queue even when conversion itself succeeds. Test with a small image first, and follow the queue's normal cancellation procedure if the printer starts producing anything unexpected.

Done means

  • Checked the installed ppmtolj and Netpbm version.
  • Left the source PPM untouched and wrote the output to a deliberate path.
  • Confirmed the output has a successful exit status, non-zero size and a plausible PCL or printer-data identification.
  • Supplied -resolution whenever a reproducible printer setting was required.
  • Used -delta, -gamma, -float and -noreset only for a tested workflow.
  • Passed a small test print or downstream PCL check before the file went anywhere near a live queue.