Skip to content

attah/ppm2pwg

Repository files navigation

ppm2pwg - misc printing utilities

(should really be renamed)

C/C++ CI CodeQL IRC-ppm2pwg@OFTC

Available as rudimentary standalone applications, but mainly made for use in SeaPrint.

ppm2pwg

Takes a pbm, pgm or ppm (P4, P5 or P6 "raw") Netpbm bitmap image and converts to PWG or URF printer raster format.

...or a raw bitmap in the c++ api.

pwg2ppm

For debugging. Similar to rasterview, but without a GUI. Takes a PWG or URF printer raster and outputs a series of P4, P5 or P6 pbm/pgm/ppm images.

pdf2printable

Takes a PDF document and makes it suitable for printing, by:

  • rotate and scale to fit as needed to a desired page size
  • convert to PDF 1.7¹, Postscript level 2 or PWG/URF raster
  1. PDF 1.5 if using Cairo < 1.17.6.

baselinify

Takes a JPEG and losslessly repacks it to the baseline ecoding profile, keeping only JFIF and Exif headers. Sort of like jpegtran without any arguments, but reusable in C++.

IPP-printers are only required to support baseline-encoded jpeg according to PWG5100.14.

Despite working with in-memory data, it only requires the libjpeg 62.2.0 and not 62.3.0/7.3+ API, so it works on conservative distros.

ippclient

An IPP client that harnesses the above tools for converting files to be printed. This is a port/rewrite/clean-up of the core parts of SeaPrint in regular (non-Qt) C++. The plan is to swap over to using this once fature parity is achieved.

ippdiscover

A DNS-SD/mDNS "simple resolver" which looks for ipp and ipps printers on the local network.

Building

Install dependencies:

sudo apt install libpoppler-dev libpoppler-glib-dev libcairo2-dev libglib2.0-dev libjpeg-dev libcurl4-openssl-dev zlib1g-dev

These are the aggregate dependencies; ippclient needs all of them and e.g. ppm2pwg needs none of them.

Build:

make -j$(nproc)

pdf2printable vs the competition

(As of 2024-03-02)

A bit of friendly comparison helps make sure the featureset is well-rounded and performance is on par.

Basics

PDF renderer Language License
pdf2printable Poppler¹ C++ GPL3
ipptransform XPDF or Poppler¹ C Apache 2.0
mutool MuPDF C AGPL or commercial
jrender Apache PDFBox Java/Kotlin MIT

Not in the running: cups-filters (can't get them to run outside CUPS), Android/Apple built-ins and Google Cloud Print (not available standalone).

  1. pdf2printable uses the Cairo backend in Poppler and ipptransform uses the Splash backend inhertited from XPDF. Cairo generally produces higher quality rasterization, but is slightly more prone to misrendering with unusual PDFs.

Format support

PDF Postscript PWG URF PCLm¹ PCL²
pdf2printable
ipptransform ✔³
mutool
jrender

Good printers should support PDF or PWG. After that, URF is the biggest enabler.

  1. I have not yet seen a printer support PCLm and none of the other formats that pdf2printable supports.
  2. PCL comes in many different dialects (even beyond the versions) so it might not work across all printers.
  3. Pre-rasterized compatibility version.

Features

back-xform¹ color modes ² rotate-to-fit page selection stdout
pdf2printable ✔(6) ✔(+stdin)
ipptransform ✔(5)
mutool ✔(3?)
jrender ✘(1)³
  1. PWG, URF and PCLm printers may require the client to help transform backside pages for duplex printing, or they will come out incorrectly.
  2. Two color modes (sRGB24 and sGray8) is enough for basically anything.
  3. Jrender can be patched to do gray or bi-level, but the output is broken.

Performance

Measured with a representative 90-page document for PWG-raster at 600 DPI on a AMD 3950X.

Speed (RGB) Speed (Gray) Size (RGB) Size (Gray)
pdf2printable 9s 9s 152MB 76MB
ipptransform 26s 27s 159MB 76MB
mutool (AA off) 19s 26s 152MB 76MB
jrender (600dpi patch) 25s N/A 334MB¹ N/A
  1. Antialiasing seems to be enabled and would account for the size difference. However, at these resolutions that doesn't really provide much benefit. For pdf2printable and mutool it can be optionally enabled/disabled.