Haiku IPP Print Bridge - early preview for IPP/JPEG printing

Hi Begasus,

thank you, that output is very useful already!

This looks like a very good candidate printer for the bridge:

Printer model: HP ENVY Inspire 7200 series
IPP: OK
Reported formats:
- image/urf
- image/jpeg
- application/PCLm
- image/pwg-raster
- application/vnd.hp-PCL

The important part is that the checker gets a clean IPP response:

HTTP: 200 OK
IPP: 2.0, status 0x0000

and the printer reports all three formats that the current bridge can generate:

image/urf
image/jpeg
application/PCLm

So from the checker side this looks very promising.

When you have time to test actual printing, I would suggest trying the formats in this order:

1. image/urf
2. application/PCLm
3. image/jpeg

image/urf would be the recommended first test. image/jpeg is the fallback.

I would be especially interested in whether application/PCLm works on this HP printer, because my Brother printer does not report PCLm support, so I cannot test that format locally.

If you do test actual printing later, please report:

Selected document format
Whether the page printed
Whether the output looked correct
Relevant bridge log output, if something failed

Thanks again - even the checker output alone is helpful, because it shows that this HP ENVY Inspire 7200 series exposes the right IPP formats.

Greetz
Juergen

2 Likes

Here’s another data point for you: HP LaserJet M15w. The test page printed fine using image/urf.

Testing: ipp://192.168.1.126:631/ipp/print
Checker: Haiku IPP Print Bridge checker v0.5.1
Host:    192.168.1.126
Port:    631
Path:    /ipp/print

HTTP:    200 OK
IPP:     2.0, status 0x0000, request 1

printer-name:
  NPI413349

printer-make-and-model:
  HP LaserJet M14-M17

printer-uri-supported:
  ipp://192.168.1.126/ipp/print
  ipps://192.168.1.126/ipp/print

ipp-versions-supported:
  1.0
  1.1
  2.0

document-format-supported:
  application/PCLm
  application/octet-stream
  image/pwg-raster
  image/urf

Bridge format check:
  OK: image/urf - URF / AirPrint raster path, Ghostscript device: urfrgb
  OK: application/PCLm - HP PCLm path, Ghostscript device: pclm
  NOTE: image/pwg-raster is reported by the printer, but this bridge build
        cannot generate PWG Raster unless Ghostscript provides a pwgraster device.

RESULT: OK - this printer reports image/urf and application/PCLm support over IPP.
        Recommended first test: image/urf

Thank you for your work on this!
--Scott

2 Likes

Thank you very much, Scott!

That is a very useful data point. The HP LaserJet M15w is especially interesting because it does not report image/jpeg support, but it does report image/urf and application/PCLm.

So this confirms that the new URF path is not just an alternative to JPEG, but actually makes additional printers usable.

For this printer the recommended bridge setting should be:

document_format: image/urf

Internally the bridge will then use Ghostscript’s urfrgb device and send the job as image/urf over IPP.

If you notice anything about print speed or quality compared to other systems, that would also be very useful feedback.

Thanks again for testing!

2 Likes
  • HP OfficeJet Pro 9015e

Supported: HP JetDirect IPP compatible
Preferred formats: PDF, JPEG

2 Likes

Thank you very much for testing!

The HP OfficeJet Pro 9015e is an interesting data point, especially because it is listed as HP JetDirect / IPP compatible and seems to prefer PDF and JPEG.

Could you please tell me how the actual test went?

  • Did the test page print successfully?

  • Which bridge format did you use: image/jpeg, image/urf, application/PCLm, or something else?

  • Was the print speed acceptable?

  • Did the printer show any unusual behaviour while processing the job?

If possible, it would also be very helpful to see the checker output, especially the document-format-supported section.

You can run it like this:

cd /boot/home/PrintSpool/tools
python3 check_ipp_printer.py ipp://PRINTER-IP:631/ipp/print

If that URI does not work, please also try:

python3 check_ipp_printer.py ipps://PRINTER-IP:631/ipp/print

The most useful part for the bridge is the list of formats reported by IPP, for example image/jpeg, image/urf, application/PCLm, application/pdf, or image/pwg-raster.

Thanks again - every tested printer helps to make the compatibility list more useful.

THX & Greetz
Juergen

1 Like
~/Desktop> /boot/home/PrintSpool/tools/check_ipp_printer.py ipp://192.168.1.69:631/ipp/print
Testing: ipp://192.168.1.69:631/ipp/print
Checker: Haiku IPP Print Bridge checker v0.5.1
Host:    192.168.1.69
Port:    631
Path:    /ipp/print

HTTP:    200 OK
IPP:     2.0, status 0x0000, request 1

printer-name:
  HPE6AACE

printer-make-and-model:
  HP OfficeJet Pro 9010 series

printer-uri-supported:
  ipp://192.168.1.69/ipp/print
  ipps://192.168.1.69:631/ipp/print

ipp-versions-supported:
  1.0
  1.1
  2.0

document-format-supported:
  application/vnd.hp-PCL
  image/jpeg
  image/urf
  image/pwg-raster
  application/PCLm
  application/octet-stream

Bridge format check:
  OK: image/urf - URF / AirPrint raster path, Ghostscript device: urfrgb
  OK: image/jpeg - JPEG fallback path, Ghostscript device: jpeg
  OK: application/PCLm - HP PCLm path, Ghostscript device: pclm
  NOTE: image/pwg-raster is reported by the printer, but this bridge build
        cannot generate PWG Raster unless Ghostscript provides a pwgraster device.

RESULT: OK - this printer reports image/urf, image/jpeg and application/PCLm support over IPP.
        Recommended first test: image/
============================================================
[2026-06-12 17:16:35] Haiku IPP Print Bridge Spooler v0.5.1 started
[2026-06-12 17:16:35] Configuration: /boot/home/PrintSpool/config.json
[2026-06-12 17:16:35] Input folder:  /boot/home/PrintSpool/in
[2026-06-12 17:16:35] Queue:         /boot/home/PrintSpool/queue
[2026-06-12 17:16:35] Archive:       /boot/home/PrintSpool/archive
[2026-06-12 17:16:35] Printer profile: Example IPP Printer
[2026-06-12 17:16:35] Printer URI:   ipp://192.168.1.69:631/ipp/print
[2026-06-12 17:16:35] Document type: image/jpeg
[2026-06-12 17:16:35] Ghostscript output device: jpeg (.jpg)
[2026-06-12 17:16:35] Ghostscript:   300 dpi, JPEGQ=95
[2026-06-12 17:16:35] Printing is done ONLY from queue/
[2026-06-12 17:16:35] ============================================================
[2026-06-12 17:20:15] New job: 20260612-172015-test-page-1781310015.ps
[2026-06-12 17:20:15] Job-ID: 20260612-172015-20260612-172015-test-page-1781310015.ps
[2026-06-12 17:20:15] Working directory: /boot/home/PrintSpool/work/20260612-172015-20260612-172015-test-page-1781310015.ps
[2026-06-12 17:20:15] Starting Ghostscript:
[2026-06-12 17:20:15] gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -dJPEGQ=95 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=/boot/home/PrintSpool/work/20260612-172015-20260612-172015-test-page-1781310015.ps/pages/page-%03d.jpg /boot/home/PrintSpool/work/20260612-172015-20260612-172015-test-page-1781310015.ps/original/20260612-172015-test-page-1781310015.ps
[2026-06-12 17:20:16] Ghostscript output: document-format=image/jpeg, device=jpeg, extension=.jpg
[2026-06-12 17:20:16] Ghostscript created 1 image/jpeg page(s)
[2026-06-12 17:20:16] Printing page 1/1: page-001.jpg
[2026-06-12 17:20:18] IPP response: HTTP 200 OK, IPP 2.0, status 0x0000, request 1
[2026-06-12 17:20:18] Job archived: /boot/home/PrintSpool/archive/2026/06/12/20260612-172015-20260612-172015-test-page-1781310015.ps
[2026-06-12 17:20:18] 
------------------------------------------------------------

Test page prints! :man_mage: :tropical_drink:

3 Likes

Is the Check_ipp_printer an installation file or is it only to be unzipped and the files get installed at the right place?

Ein Deustche wort “Anwendungen” im die tracker…nur fur Haiku IPP print bridge

bitte entshuldig meiner grammatik

Ref:

I have Haiku’s IPP working on the last few printers I’ve used for Haiku so maybe I need to help kick this can…

Hi san2ban,

no need to apologize - I understand you perfectly. :slight_smile:

check_ipp_printer.zip is not an installer. It is a small standalone test tool.

Just unzip it into any folder and run the included check_ipp_printer.py file from there. It does not automatically copy or install any files on your system.

For example:

python3 check_ipp_printer.py ipp://PRINTER-IP:631/ipp/print

Replace PRINTER-IP with the IP address of your printer.

If you install the complete Haiku IPP Print Bridge using ./install.sh, the checker is included and will be installed here:

/boot/home/PrintSpool/tools/check_ipp_printer.py

The checker only examines the IPP capabilities and supported document formats of the printer. It does not install a printer or change the Haiku printing system.

Thank you also for pointing out the remaining German word “Anwendungen” in the support tracker. I will check and correct it.

Questions, problems, bug reports and feature requests can also be submitted here:

https://support.haiku.ihlau.net/index.php

.

2 Likes

Hi,

I have been printing with this tool, just jpeg and about to try ps.

My printer reports:

Testing: ipp://192.168.1.72:631/ipp/print
Host: 192.168.1.72
Port: 631
Path: /ipp/print

HTTP: 200 OK
IPP: 2.0, status 0x0000, request 1

printer-name:
PRO-200S series

printer-make-and-model:
Canon PRO-200S series

printer-uri-supported:
ipp://192.168.1.72:631/ipp/print
ipps://192.168.1.72:631/ipp/print

ipp-versions-supported:
1.1
2.0

document-format-supported:
application/octet-stream
image/jpeg
image/urf
image/pwg-raster

RESULT: OK - this printer reports image/jpeg support over IPP.

Which is the best quality format to use, and how do I use that format say from gimp, thanks.

The best format is probably PDF, because it’s a vectorial format, but not all printers support it. Most cheap jet printers don’t.

Best raster formats (jpeg, urf, pwg raster)?
Well, prefer the two laters which are lossless, while jpeg rasterisation can produce some quality artefacts due to the lossy compression.

Urf is very similar to pwg raster. For documents, its quite performant, for full page “photo/image”, the compression is not as good as jpeg, so it could take a bit more time to send print data over network.

It’s relative, though, with fast wifi available now, it’s not really noticeable by user. The mechanical printer limits are still the main bottleneck.

1 Like

It seems the only format that actually prints is image/jpeg, both image/urf and image/pwg-raster appear to print, but the printer does nothing..

My bad, I had an older version of the print bridge. image/urf works great.

However, I only get part of the image printed (about 40%) I will post the log below. Also, printing via ShowImage, I set the DPI to 1200, but that is not passed onto the “gs” command string. It is still printing 300 DPI.


[2026-08-28 10:47:08] New job: bird.ps
[2026-08-28 10:47:08] Job-ID: 20260828-104708-bird.ps
[2026-08-28 10:47:08] Working directory: /boot/home/PrintSpool/work/20260828-104708-bird.ps
[2026-08-28 10:47:08] Starting Ghostscript:
[2026-08-28 10:47:08] gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=urfrgb -r300 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=/boot/home/PrintSpool/work/20260828-104708-bird.ps/pages/page-%03d.urf /boot/home/PrintSpool/work/20260828-104708-bird.ps/original/bird.ps
[2026-08-28 10:47:10] Ghostscript output: document-format=image/urf, device=urfrgb, extension=.urf
[2026-08-28 10:47:10] Ghostscript created 1 image/urf page(s)
[2026-08-28 10:47:10] Printing page 1/1: page-001.urf
[2026-08-28 10:48:10] ERROR Job failed: bird.ps: timed out
[2026-08-28 10:48:10] Job moved to failed: /boot/home/PrintSpool/failed/20260828-104708-bird.ps
[2026-08-28 10:48:10]

If your printer resolution is indeed 1200dpi, but the config ask Ghostscript to generate a URF raster for 300dpi, it can explain why the print job is partial. And around

Try to edit your /boot/home/PrintSpool/config.jsonconfiguration file and add/modify the resolution parameter:

{
  "ui": {
    "language": "auto"
  },
  "default_printer": "<your printer name here>",
  "spool_root": "/boot/home/PrintSpool",
  "ghostscript": {
    "dpi": 300,    <= here change it to 1200
    ...
  },
  "printers": [
    ...
   ]
}

This should make GhostScript to produce an URF pages files in the 1200dpi resolution to match your printer capabilities.

EDIT: after a quick search, it seems that the Canon PRO 200S have a maximum print resolution of 4800 horizontal, 2400 vertical.

I think the IPP print job request built by spooler.py python script forgot to att the attribute “printer-resolution” in that request, which means that your printer is probably using its default print quality while the received rasterized URF image received is not in that resolution.

Thanks. However when I set the resolution to 300DPI, and print in image/urf it still prints only a partial page … it times outlike it’s not getting the data fast enough, as shown above ..

image/jpeg prints fine when set to 300DPI.

Yes, because JPEG file has resolution information embedded in the JPEG data itself, so your printer automatically switch to that resolution.

It’s not the case of these URF files. What missing is the IPP print job request attribute “printer-resolution” which is according specifications required.

Sorry, what does that mean?

The IPP client is supposed to either query the default resolution of the printer (via Get-Printer -Attributes or via a Create Job in order to retrieve Job Template attributes) before rendering the document into a raster format like URF or PWG-Raster.

Or even for JPEG, in order to select an image size large enough to have a good quality, but as I said, as JPEG document has a resolution information embedded, it will works anyway, and most printers with use this field to adjust automatically its print resolution accordingly (well, for resolution matching its supported resolutions, that is).

But for URF and PWG raster, either the client has retrieve the current/default printer resolution and render for that resolution. Or, like here, render in a enforced, user-defined resolution, and in such case, if it’s not the default resolution, as the printer can’t automatically extract this major information, the client should send the job printer-resolution attribute to give this information in the job request.

To be fair, it’s not hard required for every print job, indeed, but in the current case I think it’s required.

TL;DR;

What is the default resolution of your printer?
It’s a printer with a display screen, right? Could check if there is any settings related to default printing resolution? If yes, enforce using this resolution in the config JSON file.
I should be same resolution for both horizontal and vertical direction, as the -r passed to GhostScript clearly is not able to support different resolutions for both direction.

The default is 300ppi, however it will accept 600ppi if that size image is sent.