|
Name |
|
Date |
Size |
#Lines |
LOC |
| .. | | - | - |
| backend/ | | 12-May-2024 | - | 3,994 | 2,471 |
| banners/ | | 12-May-2024 | - | 35 | 22 |
| charset/ | | 12-May-2024 | - | 75 | 69 |
| cupsfilters/ | | 12-May-2024 | - | 29,754 | 22,387 |
| data/ | | 12-May-2024 | - | 13 | 7 |
| drv/ | | 12-May-2024 | - | 6,748 | 6,530 |
| filter/ | | 12-May-2024 | - | 42,801 | 30,842 |
| fontembed/ | | 12-May-2024 | - | 4,416 | 3,519 |
| m4/ | | 12-May-2024 | - | 1,394 | 1,139 |
| mime/ | | 12-May-2024 | - | 464 | 410 |
| ppd/ | | 12-May-2024 | - | 1,942 | 1,814 |
| scripting/ | | 12-May-2024 | - | 1,240 | 827 |
| utils/ | | 12-May-2024 | - | 16,069 | 12,968 |
| .gitignore | D | 12-May-2024 | 1.4 KiB | 99 | 98 |
| AUTHORS | D | 12-May-2024 | 606 | 15 | 14 |
| BUILD.gn | D | 12-May-2024 | 5.7 KiB | 198 | 174 |
| COPYING | D | 12-May-2024 | 10.9 KiB | 363 | 313 |
| ChangeLog | D | 12-May-2024 | 0 | | |
| INSTALL | D | 12-May-2024 | 6.7 KiB | 184 | 133 |
| Makefile.am | D | 12-May-2024 | 24.2 KiB | 1,082 | 903 |
| NEWS | D | 12-May-2024 | 169.1 KiB | 3,694 | 3,319 |
| OAT.xml | D | 12-May-2024 | 12.3 KiB | 179 | 125 |
| README | D | 12-May-2024 | 62.8 KiB | 1,654 | 1,226 |
| README.OpenSource | D | 12-May-2024 | 473 | 11 | 11 |
| README.md | D | 12-May-2024 | 62.8 KiB | 1,654 | 1,226 |
| README_zh.md | D | 12-May-2024 | 2.3 KiB | 44 | 34 |
| autogen.sh | D | 12-May-2024 | 1.6 KiB | 78 | 63 |
| backport-CVE-2023-24805.patch | D | 12-May-2024 | 5.1 KiB | 173 | 161 |
| bundle.json | D | 12-May-2024 | 1.1 KiB | 42 | 42 |
| config.h | D | 12-May-2024 | 2.8 KiB | 96 | 75 |
| configure.ac | D | 12-May-2024 | 33.1 KiB | 986 | 892 |
| install-sh | D | 12-May-2024 | 5.3 KiB | 221 | 136 |
| install.py | D | 12-May-2024 | 1.9 KiB | 64 | 39 |
| libcupsfilters.pc.in | D | 12-May-2024 | 391 | 13 | 10 |
| libfontembed.pc.in | D | 12-May-2024 | 308 | 12 | 9 |
| ln-srf | D | 12-May-2024 | 855 | 50 | 33 |
| ohos_pdf_convs.patch | D | 12-May-2024 | 476 | 13 | 11 |
| ohos_pdftoraster.patch | D | 12-May-2024 | 11.6 KiB | 297 | 282 |
README
1README - OpenPrinting CUPS Filters v1.28.17 - 2023-01-24
2--------------------------------------------------------
3
4Looking for compile instructions? Read the file "INSTALL.txt"
5instead...
6
7
8INTRODUCTION
9
10 CUPS is a standards-based, open source printing system developed
11 by Apple Inc. for Mac OS® X and other UNIX®-like operating
12 systems. CUPS uses the Internet Printing Protocol ("IPP") and
13 provides System V and Berkeley command-line interfaces, a web
14 interface, and a C API to manage printers and print jobs.
15
16 This package contains backends, filters, and other software that
17 was once part of the core CUPS distribution but is no longer
18 maintained by Apple Inc. In addition it contains additional
19 filters and software developed independently of Apple, especially
20 filters for the PDF-centric printing workflow introduced by
21 OpenPrinting and a daemon to browse broadcasts of remote CUPS
22 printers and IPP printers to make them available locally.
23
24 From CUPS 1.6.0 on, this package is required for using printer
25 drivers (and also driverless printing) with CUPS under Linux. With
26 CUPS 1.5.x and 1.4.x this package can be used optionally to switch
27 over to PDF-based printing. In that case some filters are provided
28 by both CUPS and this package. Then the filters of this package
29 should be used.
30
31 For compiling and using this package CUPS, libqpdf (8.3.0 or
32 newer), libjpeg, libpng, libtiff, freetype, fontconfig, liblcms
33 (liblcms2 recommended), libavahi-common, libavahi-client, libdbus,
34 and glib are needed. It is highly recommended, especially if
35 non-PDF printers are used, to have at least one of Ghostscript,
36 Poppler, or MuPDF.
37
38 The Poppler-based pdftoraster filter needs a C++ compiler which
39 supports C++11 and Poppler being built with the "./configure"
40 option "-DENABLE_CPP=ON" for building the C++ support library
41 libpoppler-cpp. This is the case for most modern Linux
42 distributions.
43
44 If you use MuPDF as PDF renderer make sure to use at least version
45 1.15, as the older versions have bugs and so some files get not
46 printed correctly.
47
48 For Apple Raster output (used by AirPrint printers) at least CUPS
49 2.2.2 is required.
50
51 For Braille embosser support (see below) you will also need at
52 least liblouis, ImageMagick, and poppler-utils. Recommended is to
53 also have liblouisutdml, antiword, docx2txt for more sophisticated
54 Braille generation representing also the formatting of the input
55 text. None of these is needed for compiling cups-filters.
56
57 CUPS, this package, and Ghostscript contain some rudimentary
58 printer drivers and especially the filters needed for driverless
59 printing (currently PWG Raster, Apple Raster, PCLm, and PDF output
60 formats, for printers supporting IPP Everywhere, AirPrint, Wi-Fi
61 Direct, and other standards), see
62 http://www.openprinting.org/drivers/ for a more comprehensive set
63 of printer drivers for Linux.
64
65 See
66
67 https://wiki.linuxfoundation.org/openprinting/pdf_as_standard_print_job_format
68
69 for information about the PDF-based printing workflow.
70
71 Report bugs to
72
73 https://github.com/OpenPrinting/cups-filters/issues
74
75 or alternatively to
76
77 https://bugs.linuxfoundation.org/
78
79 Choose "OpenPrinting" as the product and "cups-filters" as the component.
80
81 See the "COPYING" files for legal information.
82
83IMAGE PRINTING DEFAULT CHANGED TO "SCALE TO FIT"
84
85 Compared to the PostScript-based original CUPS filters there is a
86 change of defaults: The imagetopdf and imagetoraster filters print
87 in "scale-to-fit" mode (image is scaled to fill one page but
88 nothing of the image being cut off) by default.
89
90 This is done to support photo printing via AirPrint. The photo
91 apps on Apple's iOS devices send print jobs as JPEG images and do
92 not allow to set any options like "scaling" or the page size. With
93 "scale-to-fit" mode set by default, the iOS photos come out on one
94 page, as expected.
95
96 To get back to the old behavior, supply one of the options
97 "nofitplot" "filplot=Off", "nofit-to-page", or "fit-to-page=Off".
98
99GHOSTSCRIPT RENDERING OF FILLED PATHS
100
101 When Ghostscript is rendering PostScript or PDF files into a
102 raster format the filled paths are ususally rendered with the
103 any-part-of-pixel method as it is PostScript standard. On
104 low-resolution printers, like label printers with 203 dpi,
105 graphics output can get inaccurate and so for example bar codes do
106 not work any more. This problem can be solved by letting
107 Ghostscript use the center-of-pixel method.
108
109 This can be done by either supplying the option "-o
110 center-of-pixel" or "-o CenterOfPixel" on the command line when
111 printing or by adding a "CenterOfPixel" option to the PPD file and
112 set it to "true", for example by adding the following lines to the
113 PPD file of the print queue (usually in /etc/cups/ppd/):
114
115 *OpenUI *CenterOfPixel/Center Of Pixel: PickOne
116 *OrderDependency: 20 AnySetup *CenterOfPixel
117 *DefaultCenterOfPixel: true
118 *CenterOfPixel true/true: ""
119 *CenterOfPixel false/false: ""
120 *CloseUI: *CenterOfPixel
121
122 This option can be used when the print queue uses the gstoraster
123 filter.
124
125POSTSCRIPT PRINTING RENDERER AND RESOLUTION SELECTION
126
127 If you use CUPS with this package and a PostScript printer then
128 the included pdftops filter converts the print job data which is
129 in PDF format into PostScript. By default, the PostScript is
130 generated with Ghostscript's "ps2write" output device, which
131 generates a DSC-conforming PostScript with compressed embedded
132 fonts and compressed page content. This is resource-saving and
133 leads to fast wire transfer of print jobs to the printer.
134
135 Unfortunately, Ghostscript's PostScript output is not compatible
136 with some printers due to interpreter bugs in the printer and in
137 addition, processing (by Ghostscript or by the printer's
138 interpreter) can get very slow with high printing resolutions when
139 parts of the incoming PDF file are converted to bitmaps if they
140 contain graphical structures which are not supported by
141 PostScript. The bitmap problem especially occurs on input files
142 with transparency, especially also the ones produced by Cairo
143 (evince and many other GNOME/GTK applications) which unnecessarily
144 introduces transparency even if the input PDF has no transparency.
145
146 Therefore there are two possibilities to configure pdftops at
147 runtime:
148
149 1. Selection of the renderer: Ghostscript, Poppler, pdftocairo,
150 Adobe Reader, or MuPDF
151
152 Ghostscript has better color management and is generally optimized
153 more for printing. Poppler produces a PostScript which is
154 compatible with more buggy built-in PostScript interpreters of
155 printers and it leads to a somewhat quicker workflow when
156 graphical structures of the input PDF has to be turned into
157 bitmaps. Adobe Reader is the PDF renderer from Adobe, the ones who
158 created PDF and PostScript. pdftocairo is a good choice for the
159 PDF output of Cairo (for example when printing from evince). It
160 is less resource-consuming when rasterizing graphical elements
161 which cannot be represented in PostScript (like
162 transparency). Note that pdftocairo only supports PDF input using
163 DeviceRGB, DeviceGray, RGB or sGray and is not capable of
164 generating PostScript level 1. So its support is only experimental
165 and distributions should not choose it as default.
166
167 The selection is done by the "pdftops-renderer" option, setting it
168 to "gs", "pdftops", "pdftocairo", "acroread", "mupdf", or "hybrid":
169
170 Per-job: lpr -o pdftops-renderer=pdftops ...
171 Per-queue default: lpadmin -p printer -o pdftops-renderer-default=gs
172 Remove default: lpadmin -p printer -R pdftops-renderer-default
173
174 By default, pdftops uses Ghostscript if this does not get changed
175 at compile time, for example by the Linux distribution vendor.
176
177 Hybrid means Ghostscript for most printers, but Poppler's pdftops
178 for Brother, Minolta, and Konica Minolta. Printer make and model
179 information comes from the PPD or via the "make-and-model" option.
180
181 2. Limitation of the image rendering resolution
182
183 If graphical structures of the incoming PDF file have to be
184 converted to bitmaps due to limitations of PostScript, the
185 conversion of the file by pdftops or the rendering by the printer
186 can get too slow if the bitmap resolution is too high or the
187 printout quality can degrade if the bitmap resolution is too low.
188
189 By default, pdftops tries to find out the actual printing
190 resolution and sets the resolution for bitmap generation to the
191 same value. If it cannot find the printing resolution, it uses 300
192 dpi. It never goes higher than a limit of 1440 dpi. Note that this
193 default limit can get changed at compile time, for example by the
194 Linux distribution vendor.
195
196 The resolution limit for bitmaps can be changed to a lower or
197 higher value, or be set to unlimited. This is done by the option
198 "pdftops-max-image-resolution", setting it to the desired value
199 (in dpi) or to zero for unlimited. It can be used per-job or as
200 per-queue default as the "pdftops-renderer" option described
201 above.
202
203 The "pdftops-max-image-resolution" option is ignored when Adobe
204 Reader is selected as PDF renderer.
205
206POSTSCRIPT PRINTING DEBUG MODE
207
208 Sometimes a PostScript printer's interpreter errors, crashes, or
209 somehow else misbehaves on Ghostscript's output. To find
210 workarounds (currently we have already workarounds for Brother and
211 Kyocera) it is much easier to work with uncompressed PostScript.
212 To get uncompressed PostScript as output, send a job with the
213 "psdebug" option, with commands like the following:
214
215 lpr -P <printer> -o psdebug <file>
216 lp -d <printer> -o psdebug <file>
217
218 If you want to send your job out of a desktop application, run
219
220 lpoptions -p <printer> -o psdebug
221
222 to make "psdebug" a personal default setting for you.
223
224 To extract the PostScript output for a developer to analyse it,
225 clone your print queue to a one which prints into a file:
226
227 cupsctl FileDevice=yes
228 lpadmin -p test -E -v file:/tmp/printout \
229 -P /etc/cups/ppd/<name of original queue>.ppd
230
231 and print into this queue as described above. The PostScript
232 output is in /tmp/printout after the job has completed.
233
234 This option does not change anything if Poppler's pdftops is used
235 as renderer.
236
237HELPER DAEMON FOR BROWSING REMOTE CUPS PRINTERS AND IPP NETWORK PRINTERS
238
239 From version 1.6.0 on in CUPS the CUPS broadcasting/browsing
240 facility was dropped, in favour of Bonjour-based broadcasting of
241 shared printers. This is done as Bonjour broadcasting of shared
242 printers is a standard, established by the PWG (Printing Working
243 Group, http://www.pwg.org/), and most other network services
244 (shared file systems, shared media files/streams, remote desktop
245 services, ...) are also broadcasted via Bonjour.
246
247 Problem is that CUPS only broadcasts its shared printers but does
248 not browse broadcasts of other CUPS servers to make the shared
249 remote printers available locally without any configuration
250 efforts. This is a regression compared to the old CUPS
251 broadcasting/browsing. The intention of CUPS upstream is that the
252 application's print dialogs browse the Bonjour broadcasts as an
253 AirPrint-capable iPhone does, but it will take its time until all
254 toolkit developers add the needed functionality, and programs
255 using old toolkits or no toolkits at all, or the command line stay
256 uncovered.
257
258 The solution is cups-browsed, a helper daemon running in parallel
259 to the CUPS daemon which listens to Bonjour broadcasts of shared
260 CUPS printers on remote machines in the local network via Avahi,
261 and can also listen for (and send) CUPS Browsing broadcasts. For
262 each reported remote printer it creates a local raw queue pointing
263 to the remote printer so that the printer appears in local print
264 dialogs and is also available for printing via the command
265 line. As with the former CUPS broadcasting/browsing with this
266 queue the driver on the server is used and the local print dialogs
267 give access to all options of the server-side printer driver.
268
269 Note that CUPS broadcasting/browsing is available for legacy
270 support, to let the local CUPS daemon work seamlessly together
271 with remote CUPS daemons of version 1.5.x and older which only
272 support CUPS broadcasting/browsing. In networks with only CUPS
273 1.6.x servers (or Ubuntu or Fedora/Red Hat servers with CUPS
274 1.5.x) please use the native Bonjour broadcasting of your servers
275 and cups-browsed, configured for Bonjour browsing only on the
276 clients.
277
278 Also high availability with redundant print servers and load
279 balancing is supported. If there is more than one server providing
280 a shared print queue with the same name, cups-browsed forms a
281 cluster locally with this name as queue name and printing through
282 the "implicitclass" backend. Each job triggers cups-browsed to
283 check which remote queue is suitable for the job, meaning that it
284 is enabled, accepts jobs, and is not currently printing. If none
285 of the remote queues fulfills these criteria, we check again in 5
286 seconds, until a printer gets free to accommodate the job. When we
287 search for a free printer, we do not start at the first in the
288 list, but always on the one after the last one used (as CUPS also
289 does with classes), so that all printer get used, even if the
290 frequency of jobs is low. This is also what CUPS formerly did with
291 implicit classes. Optionally, jobs can be sent immediately into
292 the remote queue with the lowest number of waiting jobs, so that
293 no local queue of waiting jobs is built up.
294
295 For maximum security cups-browsed uses IPPS (encrypted IPP)
296 whenever possible.
297
298 In addition, cups-browsed is also capable of discovering IPP
299 network printers (native printers, not CUPS queues) with known
300 page description languages (PWG Raster, Apple Raster, PDF,
301 PostScript, PCL XL, PCL 5c/e) in the local network and auto-create
302 print queues with auto-created PPD file or PPD-less for them (for
303 the latter using a System V interface script to control the filter
304 chain, only available for CUPS 2.1.0 and older, clients have to
305 IPP-poll the capabilities of the printer and send option settings
306 as standard IPP attributes then). This functionality is primarily
307 for mobile devices running CUPS to not need a printer setup tool
308 nor a collection of printer drivers and PPDs.
309
310 cups-browsed can also be started on-demand, for example to save
311 resources on mobile devices. For this, cups-browsed can be set
312 into an auto shutdown mode so that it stops automatically when it
313 has no remote printers to take care of any more, especially if an
314 on-demand running avahi-daemon stops. Note that CUPS must stay
315 running for cups-browsed removing its queues and so being able to
316 shut down. Ideal is if CUPS stays running another 30 seconds after
317 finishing its last job so that cups-browsed can take down the
318 queue. For how to set up and control this mode via command line,
319 configuration directives, or sending signals see the man pages
320 cups-browsed(8) and cups-browsed.conf(5).
321
322 The configuration file for cups-browsed is
323 /etc/cups/cups-browsed.conf. This file can include limited forms
324 of the original CUPS BrowseRemoteProtocols, BrowseLocalProtocols,
325 BrowsePoll, and BrowseAllow directives. It also can contain the
326 new CreateIPPPrinterQueues to activate discovering of IPP network
327 printers and creating PPD-less queues for them.
328
329 Note that cups-browsed does not work with remote CUPS servers
330 specified by a client.conf file. It always connects to the local
331 CUPS daemon by setting the CUPS_SERVER environment variable and so
332 overriding client.conf. If your local CUPS daemon uses a
333 non-standard domain socket as only way of access, you need to
334 specify it via the DomainSocket directive in
335 /etc/cups/cups-browsed.conf.
336
337 The "make install" process installs init scripts which make the
338 daemon automatically started during boot. You can also manually
339 start it with (as root):
340
341 /usr/sbin/cups-browsed &
342
343 or in debug mode with
344
345 /usr/sbin/cups-browsed --debug
346
347 Shut it down by sending signal 2 (SIGINT) or 15 (SIGTERM) to
348 it. The queues which it has created get removed then (except a
349 queue set as system default, to not loose its system default
350 state).
351
352 On systems using systemd use a
353 /usr/lib/systemd/system/cups-browsed.service file like this:
354
355 [Unit]
356 Description=Make remote CUPS printers available locally
357 After=cups.service avahi-daemon.service
358 Wants=cups.service avahi-daemon.service
359
360 [Service]
361 ExecStart=/usr/sbin/cups-browsed
362
363 [Install]
364 WantedBy=multi-user.target
365
366 On systems using Upstart use an /etc/init/cups-browsed.conf file like this:
367
368 start on (filesystem
369 and (started cups or runlevel [2345]))
370 stop on runlevel [016]
371
372 respawn
373 respawn limit 3 240
374
375 pre-start script
376 [ -x /usr/sbin/cups-browsed ]
377 end script
378
379 exec /usr/sbin/cups-browsed
380
381 These files are included in the source distribution as
382 utils/cups-browsed.service and utils/cups-browsed-upstart.conf.
383
384 In the examples we start cups-browsed after starting
385 avahi-daemon. This is not required. If cups-browsed starts first,
386 then Bonjour/DNS-SD browsing kicks in as soon as avahi-daemon comes
387 up. cups-browsed is also robust against any shutdown and restart
388 of avahi-daemon.
389
390 Here is some info on how cups-browsed works internally (first concept of a
391 daemon which does only Bonjour browsing):
392
393 - Daemon start
394 o Wait for CUPS daemon if it is not running
395 o Read out all CUPS queues created by this daemon (in former sessions)
396 o Mark them unconfirmed and set timeout 10 sec from now
397 - Main loop (use avahi_simple_poll_iterate() to do queue list maintenance
398 regularly)
399 o Event: New printer shows up
400 + Queue for printer is already created by this daemon -> Mark list
401 entry confirmed, if discovered printer is ipps but existing queue ipp,
402 upgrade existing queue by setting URI to ipps. Set status to
403 to-be-created and timeout to now-1 sec to make the CUPS queue be
404 updated.
405 + Queue does not yet exist -> Mark as to-be-created and set
406 timeout to now-1 sec.
407 o Event: A printer disappears
408 + If we have listed a queue for it, mark the entry as disappeared, set
409 timeout to now-1 sec
410 o On any of the above events and every 2 sec
411 + Check through list of our listed queues
412 - If queue is unconfirmed and timeout has passed, mark it as
413 disappeared, set timeout to now-1 sec
414 - If queue is marked disappered and timeout has passed, check whether
415 there are still jobs in it, if yes, set timeout to 10 sec from now,
416 if no, remove the CUPS queue and the queue entry in our list. If
417 removal fails, set timeout to 10 sec.
418 - If queue is to-be-created, create it, if succeeded set to
419 confirmed, if not, set timeout to 10 sec fron now. printer-is-shared
420 must be set to false.
421 - Daemon shutdown
422 o Remove all CUPS queues in our list, as long as they do not have jobs.
423
424 Do not overwrite existing queues which are not created by us If
425 the simple <remote_printer> name is already taken, try to create a
426 <remote_printer>@<server> name, if this is also taken, ignore the
427 remote printer. Do not retry, to avoid polling CUPS all the time.
428
429 Do not remove queues which are not created by us. We do this by
430 listing only our queues and remove only listed queues.
431
432 Queue names: Use the name of the remote queue. If a queue with the
433 same name from another server already exists, mark the new queue
434 as duplicate and when a queue disappears, check whether it has
435 duplicates and change the URI of the disappeared queue to the URI
436 of the first duplicate, mark the queue as to-be-created with
437 timeout now-1 sec (to update the URI of the CUPS queue) and mark
438 the duplicate disappeared with timeout now-1 sec. In terms of
439 high availability we replace the old load balancing of the
440 implicit class by a failover solution. Alternatively (not
441 implemented), if queue with same name but from other server
442 appears, create new queue as <original name>@<server name without
443 .local>. When queue with simple name is removed, replace the first
444 of the others by one with simple name (mark old queue disappeared
445 with timeout now-1 sec and create new queue with simple name).
446
447 Fill description of the created CUPS queue with the Bonjour
448 service name (= original description) and location with the server
449 name without .local.
450
451 stderr messages only in debug mode (command line options:
452 "--debug" or "-d" or "-v").
453
454 Queue identified as from this daemon by doing the equivalent of
455 "lpadmin -p printer -o cups-browsed-default", this generates a
456 "cups-browsed" attribute in printers.conf with value "true".
457
458CUPS FILTERS FOR PDF AS STANDARD PRINT JOB FORMAT
459
460 Here is documentation from the former CUPS add-on tarball with the filters
461 for the PDF-based printing workflow: imagetopdf, texttopdf,
462 pdftopdf, and pdftoraster
463
464 The original filters are from http://sourceforge.jp/projects/opfc/
465
466 NOTE: the texttops and imagetops filters shipping with this package
467 are simple wrapper scripts for backward compatibility with third-party
468 PPD files and custom configurations. There are not referred to in the
469 cupsfilters.convs file and therefore not used by the default
470 configuration. Direct conversion of text or images to PostScript is
471 deprecated in the PDF-based printing workflow. So do not use these
472 filters when creating new PPDs or custom configurations. The parameters
473 for these filters are the same as for texttopdf and imagetopdf (see
474 below) as the ...tops filter calls the ....topdf filter plus
475 Ghostscript's pdf2ps.
476
477
478IMAGETOPDF
479==========
480
4811. INTRODUCTION
482
483This program is "imagetopdf". "imagetopdf" is a CUPS filter which reads
484a single image file, converts it into a PDF file and outputs it to stdout.
485
486This program accepts the following image file format;
487
488 gif, png, jpeg, tiff, photocd, portable-anymap, portable-bitmap,
489 portable-graymap, portable-pixmap, sgi-rgb, sun-raster, xbitmap,
490 xpixmap, xwindowdump
491
492xbitmap, xpixmap and xwindowdump images are converted into png images by
493the "convert" command. Other kinds of image file format can be supported
494if the "convert" command support them.
495
496Output PDF file format conforms to PDF version 1.3 specification, and
497input image is converted and contained in the output PDF file as a binary
498format non-compression image.
499
500"imagetopdf" may outputs multiple pages if the input image exceeds page
501printable area.
502
5032. LICENSE
504
505"imagetopdf.c" is under the CUPS license. See the "COPYING" file.
506For other files, see the copyright notice and license of each file.
507
5083. COMMAND LINE
509
510"imagetopdf" is a CUPS filter, and the command line arguments, environment
511variables and configuration files are in accordance with the CUPS filter
512interface.
513
514imagetopdf <job> <user> <title> <num-copies> <options> [<filename>]
515
516"imagetopdf" ignores <job> and <user>.
517<title> is appended into the PDF dictionary as /Title.
518<num-copies> specifies the number of document copies.
519<options> is a CUPS option list.
520<filename> is an input image file name.
521
522When omit the <filename>, "imagetopdf" reads an image file from stdin.
523
5244. ENVIRONMENT VARIABLES
525
526This program refers the following environment variable;
527
528 PPD: PPD file name of the printer.
529
5305. COMMAND OPTIONS
531
532"imagetopdf" accepts the following CUPS standard options;
533
534fitplot
535mirror
536PageSize
537page-left, page-right, page-bottom, page-top
538OutputOrder
539Collate
540sides
541cupsEvenDuplex
542position
543scaling
544ppi
545natural-scaling
546landscape
547orientation-requested
548
549See the CUPS documents for details of these options.
550
5516. KNOWN PROBLEMS
552
553Problem:
554 PBM and SUN raster images can not be printed.
555Solution:
556 Due to the CUPS libcupsimage library's bug. Update the CUPS on your system.
557
5587. INFORMATION FOR DEVELOPERS
559
560Following information is for developers, not for driver users.
561
5627.1 Options handled by a printer or "imagetopdf"
563
564Following options are handled by a printer or "imagetopdf".
565 Collate, Copies, Duplex, OutputOrder
566
567Which handles these options depends on following options and attributes.
568 Collate, Copies, Duplex, OutputOrder, cupsEvenDuplex, cupsManualCopies
569
570"imagetopdf" judges whether a printer can handle these options according to
571the followings option settings in a PPD file.
572
573Collate:
574 If Collate is defined, "imagetopdf" judges the printer supports Collate.
575Copies:
576 If cupsManualCopies is defined as True, "imagetopdf" judges the printer
577 does not support Copies feature.
578
579Duplex:
580 If Duplex is defined, "imagetopdf" judges the printer supports Duplex.
581 If cupsEvenDuplex is True, Number of pages must be even.
582OutputOrder:
583 If OutputOrder is defined, "imagetopdf" judges the printer supports
584 OutputOrder.
585
586If the printer cannot handle these options, "imagetopdf" handles it.
587
588Following pseudo program describes how "imagetopdf" judges to handle
589these options.
590
591Variables
592
593Copies : specified Copies
594Duplex : specified Duplex
595Collate : specified Collate
596OutputOrder : specified OutputOrder
597EvenDuplex : specified cupsEvenDuplex
598pages : number of pages
599number_up : specified number-up
600
601device_copies : Copies passed to the printer
602device_duplex : Duplex passed to the printer
603device_collate : Collate passed to the printer
604device_outputorder : OutputOrder passed to the printer
605
606soft_copies : copies by imagetopdf
607
608
609device_copies = 1;
610device_duplex = False;
611device_collate = False;
612device_outputorder = False;
613
614if (Copies == 1) {
615 /* Collate is not needed. */
616 Collate = False;
617}
618
619if (!Duplex) {
620 /* EvenDuplex is not needed */
621 EvenDuplex = False;
622}
623
624
625if (Copies > 1 && the printer can handle Copies) device_copies = Copies;
626if (Duplex && the printer can handle Duplex) {
627 device_duplex = True;
628} else {
629 /* imagetopdf cannot handle Duplex */
630}
631if (Collate && the printer can handle Collate) device_collate = True;
632if (OutputOrder == Reverse && the printer can handle OutputOrder)
633 device_outputorder = True;
634
635if (Collate && !device_collate) {
636 /* The printer cannot handle Collate.
637 So imagetopdf handle Copies */
638 device_copies = 1;
639}
640
641if (device_copies != Copies /* imagetopdf handle Copies */ && Duplex)
642 /* Make imagetopdf handle Collate, otherwise both paper side may have
643 same page */
644 Collate = True;
645 device_collate = False;
646}
647
648if (Duplex && Collate && !device_collate) {
649 /* Handle EvenDuplex, otherwise the last page has
650 the next copy's first page in the other side of the paper. */
651 EvenDuplex = True;
652}
653
654if (Duplex && OutputOrder == Reverse && !device_outputorder) {
655 /* Handle EvenDuplex, otherwise the first page's other side of paper
656 is empty. */
657 EvenDuplex = True;
658}
659
660soft_copies = device_copies > 1 ? 1 : Copies;
661
6627.2 JCL
663
664When you print PDF files to a PostScript(PS) printer, you can specify
665device options in PS. In this case, you can write PS commands in a PPD file
666like as follows.
667
668*OpenUI *Resolution/Resolution : PickOne
669*DefaultResolution: 600
670*Resolution 300/300 dpi: "<</HWResolution[300 300]>>setpagedevice"
671*Resolution 600/600 dpi: "<</HWResolution[600 600]>>setpagedevice"
672*CloseUI: *Resolution
673
674However, if options cannot be described in PS file, you can write JCLs
675as follows;
676
677*JCLOpenUI *JCLFrameBufferSize/Frame Buffer Size: PickOne
678*DefaultJCLFrameBufferSize: Letter
679*OrderDependency: 20 JCLSetup *JCLFrameBufferSize
680*JCLFrameBufferSize Off: '@PJL SET PAGEPROTECT = OFF<0A>'
681*JCLFrameBufferSize Letter: '@PJL SET PAGEPROTECT = LTR<0A>'
682*JCLFrameBufferSize Legal: '@PJL SET PAGEPROTECT = LGL<0A>'
683*JCLCloseUI: *JCLFrameBufferSize
684
685Because PDF cannot specify device options in a PDF file, you have to define
686all the device options as JCLs.
687
688When a printer does not support PS or PDF, you can use Ghostscript (GS).
689In this case, you can specify device options like a PS printer.
690If you want to use the same printer and same PPD file for both PDF and PS
691printing, when you print a PS file, you can specify that GS handles it,
692and when you print a PDF file, you can also specify that PDF filters handle
693it in the same PPD file. However in this case, previous methods is not
694appropriate to specify device options.
695
696So, "imagetopdf" handles this case as follows;
697(In following pseudo program, JCL option is an option specified with JCLOpenUI)
698
699if (Both JCLBegin and JCLToPSInterpreter are specified in the PPD file) {
700 output JCLs that marked JCL options.
701}
702
703if (pdftopdfJCLBegin attribute is specified in the PPD file) {
704 output it's value
705}
706
707if (Copies option is specified in the PPD file) {
708 mark Number of copies specified
709} else if (pdftopdfJCLCopies is specified in the PPD file) {
710 output JCL specified with JCLCopies
711}
712
713for (each marked options) {
714 if (pdftopdfJCL<marked option's name> is specified in the PPD file) {
715 output it's value as a JCL
716 } else if (pdftopdfJCLBegin attributes is specified in the PPD file) {
717 output "<option's name>=<marked choice>;" as a JCL
718 }
719}
720output NEWLINE
721
722Thus, if you want to use both PDF filters and GS by single PPD file,
723what you should do is to add the following line in the PPD file;
724
725*pdftopdfJCLBegin: "pdfto... jobInfo:"
726
727Replace "pdfto..." by the name of the actual filter to be called after
728pdftopdf.
729
730Note:
731 If you specify JCLBegin, you have to specify JCLToPSInterpreter as well.
732
733Note:
734 When you need to specify the value which is different from the choosen
735 value based on the PPD into the jobInfo, you have to specify the values
736 with the key started by "pdftopdfJCL" string.
737
738 For example, if the page size is defined in a PPD file as following;
739
740 *OpenUI *PageSize/Page Size: PickOne
741 *DefaultPageSize: A4
742 *PageSize A4/A4:
743 *PageSize Letter/US Letter:
744 *CloseUI: *PageSize
745
746 if you choose the page size "Letter", the string "PageSize=Letter;" is
747 added to jobInfo. On the other hand, if the driver requires the different
748 value for the "Letter" size, for instance driver requires "PS=LT;"
749 instead of "PageSize=Letter;" as the jobInfo value, the PPD file has to
750 be defined as following;
751
752 *OpenUI *PageSize/Page Size: PickOne
753 *DefaultPageSize: A4
754 *PageSize A4/A4:
755 *pdftopdfJCLPageSize A4/A4: "PS=A4;"
756 *PageSize Letter/US Letter:
757 *pdftopdfJCLPageSize Letter/US Letter: "PS=LT;"
758 *CloseUI: *PageSize
759
7607.3 Temporally files location
761
762"imagetopdf" creates temporally files if needed. Temporary files are created
763in the location specified by TMPDIR environment variable. Default location
764is "/tmp".
765
766
767PDFTOPDF
768========
769
770The pdftopdf filter depends on libqpdf to read and write PDF files.
771
772It replaces and imitates the pstops filter in the PDF-based workflow.
773A similar filter (which can serve as behavior reference)
774is called "cgpdftopdf" in OS X (not open source).
775
776Command line
777------------
778
779pdftopdf follows the usual CUPS filter calling conventions, i.e.
780
781 pdftopdf <job> <user> <title> <num-copies> <options> [<filename>]
782
783together with the environment variables "PPD" and "CLASSIFICATION".
784
785When omitting <filename>, "pdftopdf" reads a PDF file from stdin.
786Internally this will write the data to a temporary file, because
787the PDF format cannot be processed in a streaming fashion.
788
789<options> are delimited by space; boolean type CUPS options can be set
790by only adding the option key, other types are provided as
791pairs of key and value, <key>=<value>.
792
793pdftopdf processes the following standard command-line and/or PPD options:
794
795Copies # ppd will only override, when commandline parameter was 1
796fitplot / fit-to-page / ipp-attribute-fidelity
797landscape / orientation-requested
798PageSize / page-size / MediaSize / media-size
799page-left / page-right / page-bottom / page-top
800media-top-margin / media-left-margin / media-right-margin / media-bottom-margin
801Duplex / JCLDuplex / EFDuplex / JD03Duplex / sides
802number-up / number-up-layout
803page-border
804OutputOrder / OutputBin / DefaultOutputOrder / page-delivery
805page-label
806page-set
807page-ranges
808MirrorPrint / mirror
809emit-jcl
810position
811Collate / multiple-document-handling / sheet-collate
812cupsEvenDuplex
813cupsManualCopies # via ppd
814
815Additional (non-standard) options
816---------------------------------
817
8181) Booklet printing
819
820 booklet=Off/On/Shuffle-Only
821
822"On" also tries to set DuplexTumble (two-sided-short-edge) and forces number-up=2
823
824 booklet-signature=(multiple of 4, or default: -1 to use "all pages")
825
8262) Page autorotate
827
828pdftopdf automatically rotates pages to the same orientation,
829instead of (e.g. fitplot) scaling them down unrotated.
830This behavier can be controlled by
831
832 pdfAutorotate / nopdfAutorotate
833
834Specifically, if a PDF file contains pages with page width greater than
835page height (a landscape page), such pages are automatically rotated
836anticlockwise by 90 degrees, unless the PPD file specifies
837"*LandscapeOrientation: Minus90". In this case, clockwise rotation is used.
838To turn off the feature on a job-by-job basis use
839
840 lp -d <print_queue_name> -o nopdfAutorotate <document>
841
842On a per-queue basis use
843
844 -o nopdfAutorotate-default
845
846as an option to lpadmin.
847
848When the 'landscape' or 'orientation-requested=4' (or =5) option of CUPS is
849given, the pdfAutorotate processing will adjust and accordingly rotate the
850non-landscape pages are rotated instead.
851
852Note: Some pages might end up 180 degree rotated (instead of 0 degree).
853Those should probably be rotated manually before binding the pages together.
854
8553) Method of flattening interactive PDF forms and annotations.
856
857Some PDF files (like application forms) contain interactive forms
858which the user can fill in inside a PDF viewer like evince. The filled
859in data is not integrated in each page of the PDF file but stored in
860an extra layer. Due to this the data gets lost when applying
861manipulations like scaling or N-up to the pages. To prevent the loss
862of the data pdftopdf flattens the form before doing the
863manipulations. This means the PDF will be converted into a static PDF
864file with the data being integral part of the pages.
865
866The same flattening is needed for annotations in PDF files.
867
868By default the actual flattening work is done by QPDF, as QPDF is also
869doing everything else in pdftopdf. This way no external utilities need
870to be called and so extra piping between processes and extra PDF
871interpreter runs are avoided which makes the filtering process faster.
872
873As we did not test the new QPDF-based form-flattening with thousands
874of PDF files yet and it has not been available to actual users yet it
875is possible that there are still some bugs. To give users a
876possibility to work around possible bugs in QPDF's form flattening, we
877have introduced an option to get back to the old flattening by the
878external tools pdftocairo or Ghostscript.
879
880The selection of the method is done by the "pdftopdf-form-flattening"
881option, setting it to "auto", "qpdf", "pdftocairo", "ghostscript",
882"gs", "internal" or "external":
883
884Per-job: lpr -o pdftopdf-form-flattening=pdftocairo ...
885Per-queue default: lpadmin -p printer -o pdftopdf-form-flattening-default=gs
886Remove default: lpadmin -p printer -R pdftopdf-form-flattening-default
887
888By default, pdftopdf uses QPDF if the option is not supplied, also the
889settings "auto" and "internal" make QPDF being used. "external"
890auto-selects from the two external utilities, trying pdftocairo at
891first and on failure Ghostscript. If the selected utility fails, the
892form stays unflattened and so the filled in data will possibly not get
893printed.
894
895Native PDF Printer / JCL Support
896--------------------------------
897
898Note that for most modern native PDF printers JCL is not needed any
899more as they are controlled via IPP. For these the PPD files get
900auto-generated by the support of CUPS and cups-filters for driverless
901IPP printing.
902
903pdftopdf will emit JCL when provided with a PPD file that includes the
904"*JCLToPDFInterpreter:" keyword.
905
906This enables for hardware copy generation and device collate; e.g. with PJL:
907
908*JCLBegin: "<1B>%-12345X@PJL JOB<0A>"
909*JCLToPDFInterpreter: "@PJL ENTER LANGUAGE = PDF <0A>"
910*JCLEnd: "<1B>%-12345X@PJL EOJ <0A><1B>%-12345X"
911
912For each marked option, the prefixed "pdftopdfJCL<option name>" keywords
913can also be used to send raw JCL strings for that option.
914These keywords also include *pdftopdfJCLBegin and *pdftopdfJCLCopies,
915This allows the use of the same PPD for PDF- and PS-based workflows,
916as pdftopdfJCL... will not be read in the PS case.
917
918When the PPD contains the "Copies" keyword, pdftopdf will detect the use
919of PJL and has special code which adds "@PJL SET COPIES=...",
920or "@PJL SET QTY=...", respectively.
921
922Other JCL code can be injected via "*JCLOpenUI: ..." ... "*JCLCloseUI: ...".
923
924Special PDF comments
925--------------------
926
927pdftopdf adds comments to the pdf preamble that might esp. be of use
928to subsequent filters, e.g.
929
930 % This file was generated by pdftopdf
931 %%PDFTOPDFNumCopies : 1
932 %%PDFTOPDFCollate : false
933
934The "NumCopies" and "Collate" values refer to the expected device/hardware
935copies, i.e. when pdftopdf's soft-copy generation did not handle this options.
936
937Limitations
938-----------
939
940pdftopdf does not support functions that are not related to printing
941features, including interactive features and document interchange features.
942Many of these operators and sections are just ignored.
943Some of these may be output, but those functions are not assured.
944
945Most notable is the use of AcroForms; their content will not be printed
946if any non-trivial processing by pdftopdf is involved (e.g. "fitplot").
947This only occurs when a file is printed directly, e.g. by "lpr".
948
949Usual PDF viewer applications (xpdf, evince, acroread, ghostscript, ...)
950will hardcopy the form content into printable pdf operations,
951when choosing to print such a document.
952
953Known issues
954------------
955
956- Borders, esp. in the "number-up=1 fitplot=false"-case might be drawn
957 at incorrect locations.
958
959- JCL documentation is sparse.
960 The imagetopdf or old pdftopdf documentation contains a tad more information.
961
962- Missing AcroForm-content might surprise users printing PDF files directly /
963 from the command-line (see the Limitations section, above).
964
965License
966-------
967
968pdftopdf is released under the MIT license.
969
970The required libqpdf is available under version 2.0 of the Apache License,
971e.g. here: https://github.com/qpdf/qpdf
972
973
974TEXTTOPDF
975=========
976
977This implements a texttopdf filter, and is derived from cups' texttops.
978
979To configure:
980-------------
981
982- texttopdf uses CUPS_DATADIR/charset/pdf.utf-8 for font configuration
983 (when utf-8 was requested as charset). The font names given there are
984 used as fontconfig selectors; the best matching font, that is both
985 monospaced and in a supported format (TTC, TTF or OTF) will then be used.
986
987- As a special exception, all fontnames that start with a '.' or '/' are
988 considered filenames, and fontconfig is skipped; the name is used directly
989 for loading the font file.
990
991- Implementation note: TrueType Collections (.TTC) are internally handled
992 by appending '/' and the index of the font inside the collection to
993 the filename (e.g. to use the second font of uming.ttc, the filename
994 uming.ttc/1 must be given to the fontembed-library).
995 By appending the index-field returned from fontconfig, this is completely
996 transparent to the user (but currently not widely tested).
997
998- You may look at the two examples: pdf.utf-8.simple and pdf.utf-8.heavy.
999
1000To use:
1001-------
1002
1003The filter is called just like any other cups filter. Have a
1004look at test.sh for example.
1005
1006Known Issues
1007------------
1008
1009 - Text extraction does not work (at least for pdftotext from xpdf)
1010 for the resulting pdfs.
1011
1012 - OTF(CFF) embedding currently does not subset the fonts.
1013
1014 - Text wrapping in pretty-printing mode does not respect double-wide
1015 characters (CJK), and thus produce wrong results (wrap too late)
1016 for lines where they occur. The fix is not trivial, since all the
1017 pretty-printing processing is done without knowledge of / prior to
1018 the font configuration (which is where single or double width
1019 code-ranges are specified).
1020
1021 - The hebrew example in test5.pdf shows one of our limitations:
1022 Compose glyphs are not composed with the primary glyph but printed
1023 as separate glyphs.
1024
1025Further Infos
1026-------------
1027
1028Font embedding is handled by libfontembed in the filter/fontembed
1029subdirectory.
1030
1031Please report all bugs to
1032
1033https://github.com/OpenPrinting/cups-filters/issues
1034
1035or to
1036
1037https://bugs.linuxfoundation.org/
1038
1039(product "OpenPrinting", component "cups-filters").
1040
1041
1042PDFTORASTER
1043===========
1044
10451. INTRODUCTION
1046
1047"pdftoraster" is a filter for CUPS. It reads PDF files, convert it and
1048output CUPS raster.
1049
1050"pdftoraster" does not support functions that are not related to printing
1051features, including interactive features and document interchange features.
1052Many of these operators and sections are just ignored.
1053Some of these may be output, but those functions are not assured.
1054Encryption feature is not supported.
1055
10562. LICENSE
1057
1058Almost all source files are under MIT like license. However,
1059"pdftoraster" links some "poppler" libraries, and these files are
1060under GNU public license. See copyright notice of each file for
1061details.
1062
10633. COMMAND LINE
1064
1065"pdftoraster" is a CUPS filter, and the command line arguments, environment
1066variables and configuration files are in accordance with the CUPS filter
1067interface.
1068
1069pdftoraster <job> <user> <title> <num-copies> <options> [<filename>]
1070
1071"pdftoraster" ignores <job> and <user>.
1072<title> is appended into the PDF dictionary as /Title.
1073<num-copies> specifies the number of document copies.
1074<options> is a CUPS option list.
1075<filename> is an input PDF file name.
1076
1077When omit the <filename>, "pdftoraster" reads a PDF file from the stdin,
1078and save it as a temporary file.
1079
10804. ENVIRONMENT VARIABLES
1081
1082This program refers the following environment variable;
1083 PPD: PPD file name of the printer.
1084
10855. COMMAND OPTIONS
1086
1087See CUPS documents for details.
1088
10896. INFORMATION FOR DEVELOPERS
1090
1091Following information is for developers, not for driver users.
1092
10936.1 Options handled by a printer or "pdftoraster"
1094
1095"pdftopdf" outputs the following special comments from the 4th line in the
1096created PDF data.
1097
1098%%PDFTOPDFNumCopies : <copies> --- <copies> specified Number of Copies
1099%%PDFTOPDFCollate : <collate> --- <collate> is true or false
1100
1101"pdftoraster" overrides the command line options by above two option's values.
1102
11036.2 Temporally files location
1104
1105"pdftoraster" creates temporally files if needed. Temporary files are created
1106in the location specified by TMPDIR environment variable. Default location
1107is "/tmp".
1108
1109
1110URFTOPDF
1111========
1112
1113"urftopdf" is a filter to convert Apple's proprietary URF raster
1114format into PDF. URF raster is generated by some iOS applications when
1115printing via Airprint, so this filter provides a more complete support
1116for AirPrint clients. Note that it is not clear whether nowadays all
1117iOS applications send PDF and not URF any more. Also the filter does
1118not support all variants of URF format so the URF support is most
1119probably incomplete.
1120
1121Apple does not provide any official documentation of the format but there is
1122already some reverse engineering done. A description of the format as far as it
1123got found out and two sample files can be found here:
1124
1125https://github.com/AlanQuatermain/unirast
1126
1127An actual implementation of an urftopdf filter is here:
1128
1129https://github.com/superna9999/urftopdf
1130
1131This original version uses libharu and to avoid an extra dependency
1132the filter coming with this package is converted to use libqpdf
1133instead (the same library as pdftopdf uses).
1134
1135License: GNU General Public License version 3 or any newer version
1136
1137
1138TEXTTOTEXT
1139==========
1140
1141This is a special filter for text-only printers (e. g. line printers,
1142daisy-wheel printers, POS printers, ...) or for using printers in
1143their text mode (e. g. dot-matrix printers or otherwise unsupported
1144printers). It takes plain text (UTF-8-encoded as this is standard with
1145CUPS) and not PDF as input.
1146
1147The texttotext filter replaces the former textonly filter.
1148
1149It is for the following use cases:
1150
1151- Using text-only printers, like line printers or daisy-wheel
1152 printers. Note that only text can get printed in the way the printer
1153 is designed. No support for graphics printing tricks like ASCII art
1154 or printing pixels with the period character.
1155
1156- Fast and less resource-consuming text printing with dot-matrix
1157 printers using the printer's text mode instead of converting the
1158 text to PDF and printing the PDF in the printer's graphics mode,
1159 which is slow, loud, and consumes much more ink.
1160
1161- POS printing. POS printers often print only text on roll paper. This
1162 filter has a non-paginated mode which prints continuously, ignoring
1163 page height definitions.
1164
1165The filter has the following features:
1166
1167- Conversion of UTF-8 to most printer's encodings.
1168
1169- To each page size a number of lines and columns is assigned, after that
1170 you only need to select the size of the paper in use.
1171
1172- At end of page you can optionally send a Form Feed or let the filter fill
1173 up the rest of the page with blank lines.
1174
1175- New lines can be initiated by Line Feed, Carriage Return, or both.
1176
1177- Adjustable margins.
1178
1179- Adjustable width for tab stops.
1180
1181- Pagination can be turned off for roll paper or continuous printing in
1182 general.
1183
1184- Wrapping or truncation of long lines
1185
1186- Support for most of CUPS' page management options (only with
1187 pagination turned on): page-ranges, page-set, output-order, collate,
1188 multiple copies.
1189
1190Setting up the printer
1191
1192In the printer setup tool select the "Generic Text-Only Printer" (with
1193lpadmin use "-m drv:///cupsfilters.drv/textonly.ppd"), then under the
1194"Installable Options" adjust the following:
1195
1196- Which page sizes to use and how many lines and columns the printer
1197 is capable to print on them. The default setting for lines and
1198 columns assume 6 lines per inch and 10 columns per inch.
1199
1200- Whether to send a Form Feed character after each page. Sending a
1201 Form Feed is highly recommended to get the content of each page
1202 exactly onto the desired sheet. If the printer does not support Form
1203 Feed characters, turn them off and make sure that you have adjusted
1204 the correct number of lines for each page size, as the printer is
1205 advancing pages by filling up the rest of the paper with blank
1206 lines.
1207
1208- How the printer advancs to a new line. Most printers require both
1209 Crriage Return and Line Feed (the DOS/Windows standard), but some
1210 would also work with either Carriage Return or Line Feed.
1211
1212- The printer's encoding: Most text and dot-matrix printers (usually
1213 older devices) do not understand CUPS' standard encoding UTF-8 but
1214 instead, the use a simpler encoding (where each character is
1215 represented by one byte). ASCII should always work, but does not
1216 support letters with accents. So check the printer's manual what is
1217 supported. You cannot only use the encodings suggested by the PPD
1218 file, but any one-byte-per-character encoding which the "iconv"
1219 utility supports (see "iconv --list" for a list of encodings).
1220
1221Also note that text-only and dot-matrix printers often have a DIP
1222switch block which allows for some hardware configuration, like
1223newline characters, length of page, input encoding, ...
1224
1225Options of the texttotext filter:
1226
1227To be usually used when sending a job:
1228
1229PageSize: Paper format to be used. Make sure that the number of lines
1230and columns printable on each paper size are correctly adjusted with
1231the appropriate setup option. The page height is ignore when
1232pagination is turned off. Possible values: Letter, Legal, Tabloid,
1233Ledger, A4, A3, FanFoldGerman, FanFoldGermanLegal, 11x14Rotated,
1234LegalRotated, Custom1, Custom2, Custom3
1235
1236OverLongLines: What to do with lines longer that the width of the
1237page: Truncate: Simply drop the extra characters; WrapAtWidth
1238(default): Continue the line in the next line on the paper; WordWrap:
1239As WrapAtWidth, but do not cut in the middle of a word.
1240
1241TabWidth: Width of a tab stop. Can be any positive number.
1242
1243Pagination: On: Text is divided in pages depending on the page size
1244selection, with each page having the user-selected margins,
1245recommended for sheet paper; Off: Text is printed continuously,
1246ignoring page breaks and the height and upper and lower margins of the
1247destination page size, recommended for roll paper, POS, long lists on
1248continuous paper, ... Note that with pagination turned off, multiple
1249copies, collate, page-ranges, page-set, and output-order are not
1250supported and therefore ignored.
1251
1252page-left, page-right, page-top, page-bottom: Width of the margins
1253left blank, counted in lines or columns. Top and bottom margins are
1254ignored when pagination is turned off. Can be any positive number or
1255zero for no margin.
1256
1257To be usually used when setting up the printer:
1258
1259PrinterEncoding: The printer's character encoding (code page). Any
1260encoding which the iconv utility can generate (see "iconv --list") and
1261which uses only one byte per character can be used. This should
1262support practically any printer which is capable of printing
1263text. ASCII is the default setting. See the printer's manual for the
1264correct encoding to use.
1265
1266NewlineCharacters: The characters sent on the end of a line, LineFeed
1267(LF), Crriage Return (CR), or both Carriage Return and Line Feed
1268(CRLF). Default is CRLF as most printers require this.
1269
1270SendFF: On: Send a Form Feed after each page, so that printer changes
1271to the next sheet. Off: Do not send Form Feeds. To advance to the next
1272page blank lines are printed to fill up the page (requires the number
1273of limes for the selected page size correctly being set). When
1274pagination is off, Form Feeds are never sent.
1275
1276LetterAvailable, LegalAvailable, TabloidAvailable, LedgerAvailable,
1277A4Available, A3Available, FanFoldGermanAvailable,
1278FanFoldGermanLegalAvailable, 11x14RotatedAvailable,
1279LegalRotatedAvailable, Custom1Available, Custom2Available,
1280Custom3Available: On: Paper of this size is available; Off: This paper
1281size is not available.
1282
1283LetterNumLines, LegalNumLines, TabloidNumLines, LedgerNumLines,
1284A4NumLines, A3NumLines, FanFoldGermanNumLines,
1285FanFoldGermanLegalNumLines, 11x14RotatedNumLines,
1286LegalRotatedNumLines, Custom1NumLines, Custom2NumLines,
1287Custom3NumLines: Maximum number of text lines fitting on the paper
1288size. Default value is selected assuming 6 lines per inch. Can be any
1289positive number.
1290
1291LetterNumColumns, LegalNumColumns, TabloidNumColumns,
1292LedgerNumColumns, A4NumColumns, A3NumColumns, FanFoldGermanNumColumns,
1293FanFoldGermanLegalNumColumns, 11x14RotatedNumColumns,
1294LegalRotatedNumColumns, Custom1NumColumns, Custom2NumColumns,
1295Custom3NumColumns: Maximum number of columns (characters) fitting on
1296the paper size. Default value is selected assuming 10 characters per
1297inch. Can be any positive number.
1298
1299Standard CUPS options supported:
1300
1301page-ranges, page set, output-order, collate
1302
1303Note that these options and multiple copies are ignored when
1304pagination is turned off.
1305
1306
1307BEH - Backend Error Handler wrapper backend
1308===========================================
1309
1310A wrapper for CUPS backends to make error handling more configurable
1311
1312Usually, if a CUPS backend exits with an error status other than zero
1313(for example if a printer is not turned on or not reachable on the
1314network), CUPS disables the print queue and one can only print again
1315if a system administrator re-enables the queue manually. Even
1316restarting CUPS (or rebooting) does not re-enable disabled queues.
1317
1318For system administrators this can get annoying, for newbie users who
1319are not aware of this problem it looks like that CUPS is severely
1320broken. They remove and re-install print queues, getting on the nerves
1321of distro install support, people, or even switch back to a
1322proprietary operating system.
1323
1324Nowadays CUPS allows some configurability to avoid this, setting the
1325Error Policy to "retry-job", but this does not allow to retry for
1326infinitely many times and generally does not allow to change the
1327number of repetitions. It is also not possible to simply drop the job
1328without disabling the queue when CUPS gives up repeating the job.
1329
1330This script makes the handling of such backend errors more
1331configurable, so that the problem can easily be worked around. The new
1332possibilities are:
1333
1334 - Let queues simply not being disabled. Simple approach, but job gets
1335 lost.
1336
1337 - Repeat a given number of times.
1338
1339 - Repeat infinitely often, until the job gets finally through. This
1340 is the standard of LPRng, and it eliminates loss of the job.
1341
1342 - The interval between two attempts to run the backend can also be
1343 configured.
1344
1345 - Configuration is done independently for each print queue. So local
1346 printers and network printers can be treated differently.
1347
1348
1349Usage:
1350
1351Activate "beh" for your print queue(s) with command(s) like this:
1352
1353lpadmin -p <queue name> -E -v beh:/<dd>/<att>/<delay>/<originaluri>
1354
1355with
1356 <queue name>: The name of your print queue
1357 <dd>: Don't Disable, if "1", beh always exits with zero
1358 status, so the queue gets never disabled when the
1359 original backend exits with an error. "0" carries
1360 the error status of the last call of the backend
1361 (after <att> retries) on to CUPS, so the queue
1362 usually gets disabled.
1363 <att>: Attempts, number of attempts to recall the backend
1364 in case of an error. "0" means infinite retries. In
1365 this case <dd> gets meaningless.
1366 <delay>: Delay between two attempts to call the beckend, to
1367 be given in seconds and as an integer number.
1368 Meaningless if <att> is one.
1369 <originaluri>: The original URI, which your queue had before. Can
1370 be determined with "lpstat -v".
1371
1372All parameters, especially, <dd>, <att>, and <delay> have always to be
1373specified, even if one of them is meaningless due to the setting of
1374the others.
1375
1376beh works with every backend except the "hp" backend of HPLIP, as the
1377"hp" backend repeats failed jobs by itself.
1378
1379Example URIs:
1380
1381beh:/1/3/5/socket://printer:9100
1382
1383 On the network printer with host name "printer" it is tried to
1384 access 3 times with 5 second delays between the attempts. If the job
1385 still fails, the queue is not disabled (and the job discarded).
1386
1387beh:/0/10/60/socket://printer:9100
1388
1389 Retry 10 times in one minute intervals, disable the queue when still
1390 not succeeding.
1391
1392beh:/1/0/60/usb://Brother/HL-5040%20series
1393
1394 On a Brother HL-5040 on the USB try infinitely often until the
1395 printer comes back, in intervals of one minute. This way the job
1396 does not get lost when the printer is turned off and one can
1397 intendedly delay printing by simply switching off the printer. The
1398 ideal configuration for desktop printers and/or home users.
1399
1400Originally this backend was written in Perl and part of the
1401foomatic-filters package. It was not overtaken into cups-filters
1402together with foomatic-rip to avoid the introduction of a dependency
1403on Perl. Now it has been re-written in C and so it can be part of
1404cups-filters without introducing new dependencies.
1405
1406
1407BRAILLE EMBOSSING
1408=================
1409
1410cups-filters also provides filters and drivers for braille
1411embossers. It supports:
1412
1413- Text on all kinds of embossers with generic support
1414- Text and graphics on the Index V3 embossers and above.
1415
1416This is configured in CUPS just like any printer. Options can then be configured
1417in the standard printer panel, or passed as -o options to the lp command.
1418
1419
1420------------
1421Text support
1422------------
1423
1424Text can be embossed either with no translation on the computer side (the
1425embosser will translate), or with translation on the computer side (thanks to
1426liblouis). It is a matter of running
1427
1428lp file.txt
1429
1430or even
1431
1432lp file.html
1433lp file.odt
1434lp file.doc
1435lp file.rtf
1436lp file.docx
1437lp file.pdf
1438
1439Important: it is really preferrable to directly print the document files
1440themselves, and not a pdf output, or printing from the application (which
1441would first convert to pdf). That way, the braille conversion will have the
1442proper document structure (paragraphs, titles, footnotes, etc.) to produce good
1443quality.
1444
1445
1446--------------------
1447Vector Image support
1448--------------------
1449
1450Vector images can be embossed by converting them to braille dots.
1451
1452This needs the inkscape package installed. Various input formats are then
1453supported: .svg, .fig, .wmf, .emf, .cgm, .cmx
1454
1455The conversion assumes that the input is black-on-white. If it is
1456white-on-black, the -o Negate option can be used.
1457
1458This image support is preferred over the generic image support described below,
1459which has to reconstruct lines to be embossed.
1460
1461
1462-------------
1463Image support
1464-------------
1465
1466Images can be embossed by converting them to braille dots.
1467
1468The orientation of the image can be controlled. By default it will be rotate to
1469fit the image orientation, i.e. it will be rotate by 90 degree if it is wider
1470than high and the paper is higher than wide, or if vice-versa. Other rotation
1471modes are provided.
1472
1473By default, the image will be resized to fit the size of the paper. Disabling
1474the resize (fitplot set to No) will crop the image to the paper size. This is
1475useful for instance when a carefully-drawn image was designed especially for
1476embossing, and thus its pixels should exactly match with braille dots. In such
1477case, edge detection should very probably be disabled too.
1478
1479The image can be processed for edge detection. When no processing is done (edge
1480detection is configured to "None"), the dark pixels are embossed if the Negate
1481option is off, or the light pixels are embossed if the Negate option is on. When
1482edge processing is done, only the edges of the images will be embossed. The
1483Basic and the Canny algorithms bring differing results. The Basic algorithm
1484can be tuned thanks to the edge factor only. The Canny algorithm can also be
1485tuned: increasing the Upper value will reduce the amount of detected edges (and
1486vice-versa), increasing the Lower value will reduce the lengths of the detected
1487edges (and vice-versa). The Radius and Sigma parameter control the blurring
1488performed before edge detection, to improve the result; the Radius parameter
1489controls how large blurring should be performed, setting it to zero requests
1490autodetection; the Sigma parameter determines how strongly blurring should be
1491performed.
1492
1493A lot of images formats are support, so one can just run
1494
1495lp file.png
1496lp file.gif
1497lp file.jpg
1498...
1499
1500Here are complete examples for controlling the processing (all options can be
1501omitted, the default values are shown here):
1502
1503Emboss the image without edge detection, as black on white or white on black:
1504
1505lp -o "Edge=None" file.png
1506lp -o "Edge=None Negate" file.png
1507
1508Emboss the image with edge detection, the default tuning parameters are set
1509here:
1510
1511lp -o "Edge=Edge EdgeFactor=1" file.png
1512lp -o "Edge=Canny CannyRadius=0 CannySigma=1 CannyLower=10 CannyUpper=30" file.png
1513
1514Emboss the image as it is, without any resize or edge detection, as black on
1515white or white on black:
1516
1517lp -o "nofitplot Edge=None" file.png
1518lp -o "nofitplot Edge=None Negate" file.png
1519
1520------------------------
1521Generic embosser support
1522------------------------
1523
1524It should be possible to make all embossers use the generic driver. For this to
1525work, one has to:
1526
1527- configure the embosser itself so that it uses an MIT/NABCC/BRF braille table
1528- add in CUPS a printer with the "Generic" manufacturer and "Braille embosser"
1529 model
1530- configure CUPS options according to the embosser settings, so that CUPS knows
1531 the page size, braille spacing, etc.
1532
1533The generic driver can emboss text, as well as images, but images will probably
1534be distorted by the Braille interline spacing.
1535
1536
1537-----------------------
1538Index embossers support
1539-----------------------
1540
1541Supported models:
1542
1543Basic-S V3/4
1544Basic-D V3/4
1545Everest-D V3/4
15464-Waves PRO V3
15474X4 PRO V3
1548Braille Box V4
1549
1550Index V3 embosser support has been well tested. It supports both text and
1551graphics mode. Embossers with firmware 10.30 and above can be easily configured
1552from CUPS (paper dimension, braille spacing, etc.).
1553
1554Index V4 embosser support has not been tested, but is very close to V3 support,
1555so it is probably working fine already. Feedback would be very welcome.
1556
1557To connect an Index embosser through Ethernet, gather its IP adress, select the
1558"AppSocket/HP JetDirect" network printer protocol, and set
1559socket://the.embosser.IP.address:9100 as Connection URL.
1560
1561The density of dots for images can easily be chosen from the command line, for
1562instance:
1563
1564lp -o "GraphicDotDistance=160" file.png
1565
1566to select 1.6mm dots spacing
1567
1568Troubleshooting: if your embosser starts every document with spurious
1569"TM0,BM0,IM0,OM0" or "TM0,BI0", your embosser is most probably still using an
1570old 10.20 firmware. Please either reflash the embosser with a firmware version
157110.30 or above, or select the 10.20 firmware version in the "index" panel of the
1572cups printer options.
1573
1574----------------------
1575Braille output options
1576----------------------
1577
1578The output can be finely tuned from the standard printing panel, or from the
1579command-line, the following example selects translation tables for French and
1580Greek, with 2.5mm dot spacing and 5mm line spacing. All options can be omitted,
1581the default values are shown here.
1582
1583lp -o "LibLouis=fr-fr-g1 LibLouis2=gr-gr-g1 TextDotDistance=250 LineSpacing=500" file.txt
1584
1585
1586---------------------------------
1587Reworking output before embossing
1588---------------------------------
1589
1590One may want to check and modify the .brf or .ubrl output before sending it to
1591the embosser. This can be achieved by first generating the .brf file:
1592
1593 /usr/sbin/cupsfilter -m application/vnd.cups-brf -p /etc/cups/ppd/yourprinter.ppd yourdocument.txt > ~/test.brf
1594
1595One can choose a ppd file and additionally pass -o options to control the
1596generated output. One can then modify the .brf file with a text editor. One can
1597then emboss it:
1598
1599 lp -o document-format=application/vnd.cups-brf ~/test.brf
1600
1601
1602The same can be achieved for images:
1603
1604 /usr/sbin/cupsfilter -m image/vnd.cups-ubrl -p /etc/cups/ppd/yourprinter.ppd yourimage.png > ~/test.ubrl
1605
1606 lp -o document-format=image/vnd.cups-ubrl ~/test.ubrl
1607
1608
1609---------------
1610BRF file output
1611---------------
1612
1613One can generate BRF files by adding a virtual BRF printer.
1614
1615When creating it in the cups interface, choose the CUPS-BRF local printer,
1616select the Generic maker, and choose the Generic Braille embosser model.
1617
1618Printing to the resulting printer will generate a .brf file in a BRF
1619subdirectory of the home directory.
1620
1621
1622----------------
1623UBRL file output
1624----------------
1625
1626One can generate Unicode braille files, not useful for embossing, but which can
1627be easily looked at by sighted people to check for the output.
1628
1629In the cups interface, create a printer with the CUPS-BRF local printer,
1630the Generic maker, and choose the Generic UBRL generator model.
1631
1632Printing to the resulting printer will generate a .brf file in a BRF
1633subdirectory of the home directory.
1634
1635
1636----------------------------
1637Remark about the source code
1638----------------------------
1639
1640The file filter/braille/drivers/index/ubrlto4dot.c is used to generate
1641the translation table in
1642filter/braille/drivers/index/imageubrltoindexv[34]. It is included as
1643"source code" for these two files, even if actually running the
1644generation in the Makefile is more tedious than really useful.
1645
1646
1647----
1648TODO
1649----
1650
1651- Test whether one wants to negate, e.g. to emboss as few dots as possible
1652- textubrltoindex when liblouis tools will be able to emit 8dot braille
1653
1654
README.OpenSource
README.md
1README - OpenPrinting CUPS Filters v1.28.17 - 2023-01-24
2--------------------------------------------------------
3
4Looking for compile instructions? Read the file "INSTALL.txt"
5instead...
6
7
8INTRODUCTION
9
10 CUPS is a standards-based, open source printing system developed
11 by Apple Inc. for Mac OS® X and other UNIX®-like operating
12 systems. CUPS uses the Internet Printing Protocol ("IPP") and
13 provides System V and Berkeley command-line interfaces, a web
14 interface, and a C API to manage printers and print jobs.
15
16 This package contains backends, filters, and other software that
17 was once part of the core CUPS distribution but is no longer
18 maintained by Apple Inc. In addition it contains additional
19 filters and software developed independently of Apple, especially
20 filters for the PDF-centric printing workflow introduced by
21 OpenPrinting and a daemon to browse broadcasts of remote CUPS
22 printers and IPP printers to make them available locally.
23
24 From CUPS 1.6.0 on, this package is required for using printer
25 drivers (and also driverless printing) with CUPS under Linux. With
26 CUPS 1.5.x and 1.4.x this package can be used optionally to switch
27 over to PDF-based printing. In that case some filters are provided
28 by both CUPS and this package. Then the filters of this package
29 should be used.
30
31 For compiling and using this package CUPS, libqpdf (8.3.0 or
32 newer), libjpeg, libpng, libtiff, freetype, fontconfig, liblcms
33 (liblcms2 recommended), libavahi-common, libavahi-client, libdbus,
34 and glib are needed. It is highly recommended, especially if
35 non-PDF printers are used, to have at least one of Ghostscript,
36 Poppler, or MuPDF.
37
38 The Poppler-based pdftoraster filter needs a C++ compiler which
39 supports C++11 and Poppler being built with the "./configure"
40 option "-DENABLE_CPP=ON" for building the C++ support library
41 libpoppler-cpp. This is the case for most modern Linux
42 distributions.
43
44 If you use MuPDF as PDF renderer make sure to use at least version
45 1.15, as the older versions have bugs and so some files get not
46 printed correctly.
47
48 For Apple Raster output (used by AirPrint printers) at least CUPS
49 2.2.2 is required.
50
51 For Braille embosser support (see below) you will also need at
52 least liblouis, ImageMagick, and poppler-utils. Recommended is to
53 also have liblouisutdml, antiword, docx2txt for more sophisticated
54 Braille generation representing also the formatting of the input
55 text. None of these is needed for compiling cups-filters.
56
57 CUPS, this package, and Ghostscript contain some rudimentary
58 printer drivers and especially the filters needed for driverless
59 printing (currently PWG Raster, Apple Raster, PCLm, and PDF output
60 formats, for printers supporting IPP Everywhere, AirPrint, Wi-Fi
61 Direct, and other standards), see
62 http://www.openprinting.org/drivers/ for a more comprehensive set
63 of printer drivers for Linux.
64
65 See
66
67 https://wiki.linuxfoundation.org/openprinting/pdf_as_standard_print_job_format
68
69 for information about the PDF-based printing workflow.
70
71 Report bugs to
72
73 https://github.com/OpenPrinting/cups-filters/issues
74
75 or alternatively to
76
77 https://bugs.linuxfoundation.org/
78
79 Choose "OpenPrinting" as the product and "cups-filters" as the component.
80
81 See the "COPYING" files for legal information.
82
83IMAGE PRINTING DEFAULT CHANGED TO "SCALE TO FIT"
84
85 Compared to the PostScript-based original CUPS filters there is a
86 change of defaults: The imagetopdf and imagetoraster filters print
87 in "scale-to-fit" mode (image is scaled to fill one page but
88 nothing of the image being cut off) by default.
89
90 This is done to support photo printing via AirPrint. The photo
91 apps on Apple's iOS devices send print jobs as JPEG images and do
92 not allow to set any options like "scaling" or the page size. With
93 "scale-to-fit" mode set by default, the iOS photos come out on one
94 page, as expected.
95
96 To get back to the old behavior, supply one of the options
97 "nofitplot" "filplot=Off", "nofit-to-page", or "fit-to-page=Off".
98
99GHOSTSCRIPT RENDERING OF FILLED PATHS
100
101 When Ghostscript is rendering PostScript or PDF files into a
102 raster format the filled paths are ususally rendered with the
103 any-part-of-pixel method as it is PostScript standard. On
104 low-resolution printers, like label printers with 203 dpi,
105 graphics output can get inaccurate and so for example bar codes do
106 not work any more. This problem can be solved by letting
107 Ghostscript use the center-of-pixel method.
108
109 This can be done by either supplying the option "-o
110 center-of-pixel" or "-o CenterOfPixel" on the command line when
111 printing or by adding a "CenterOfPixel" option to the PPD file and
112 set it to "true", for example by adding the following lines to the
113 PPD file of the print queue (usually in /etc/cups/ppd/):
114
115 *OpenUI *CenterOfPixel/Center Of Pixel: PickOne
116 *OrderDependency: 20 AnySetup *CenterOfPixel
117 *DefaultCenterOfPixel: true
118 *CenterOfPixel true/true: ""
119 *CenterOfPixel false/false: ""
120 *CloseUI: *CenterOfPixel
121
122 This option can be used when the print queue uses the gstoraster
123 filter.
124
125POSTSCRIPT PRINTING RENDERER AND RESOLUTION SELECTION
126
127 If you use CUPS with this package and a PostScript printer then
128 the included pdftops filter converts the print job data which is
129 in PDF format into PostScript. By default, the PostScript is
130 generated with Ghostscript's "ps2write" output device, which
131 generates a DSC-conforming PostScript with compressed embedded
132 fonts and compressed page content. This is resource-saving and
133 leads to fast wire transfer of print jobs to the printer.
134
135 Unfortunately, Ghostscript's PostScript output is not compatible
136 with some printers due to interpreter bugs in the printer and in
137 addition, processing (by Ghostscript or by the printer's
138 interpreter) can get very slow with high printing resolutions when
139 parts of the incoming PDF file are converted to bitmaps if they
140 contain graphical structures which are not supported by
141 PostScript. The bitmap problem especially occurs on input files
142 with transparency, especially also the ones produced by Cairo
143 (evince and many other GNOME/GTK applications) which unnecessarily
144 introduces transparency even if the input PDF has no transparency.
145
146 Therefore there are two possibilities to configure pdftops at
147 runtime:
148
149 1. Selection of the renderer: Ghostscript, Poppler, pdftocairo,
150 Adobe Reader, or MuPDF
151
152 Ghostscript has better color management and is generally optimized
153 more for printing. Poppler produces a PostScript which is
154 compatible with more buggy built-in PostScript interpreters of
155 printers and it leads to a somewhat quicker workflow when
156 graphical structures of the input PDF has to be turned into
157 bitmaps. Adobe Reader is the PDF renderer from Adobe, the ones who
158 created PDF and PostScript. pdftocairo is a good choice for the
159 PDF output of Cairo (for example when printing from evince). It
160 is less resource-consuming when rasterizing graphical elements
161 which cannot be represented in PostScript (like
162 transparency). Note that pdftocairo only supports PDF input using
163 DeviceRGB, DeviceGray, RGB or sGray and is not capable of
164 generating PostScript level 1. So its support is only experimental
165 and distributions should not choose it as default.
166
167 The selection is done by the "pdftops-renderer" option, setting it
168 to "gs", "pdftops", "pdftocairo", "acroread", "mupdf", or "hybrid":
169
170 Per-job: lpr -o pdftops-renderer=pdftops ...
171 Per-queue default: lpadmin -p printer -o pdftops-renderer-default=gs
172 Remove default: lpadmin -p printer -R pdftops-renderer-default
173
174 By default, pdftops uses Ghostscript if this does not get changed
175 at compile time, for example by the Linux distribution vendor.
176
177 Hybrid means Ghostscript for most printers, but Poppler's pdftops
178 for Brother, Minolta, and Konica Minolta. Printer make and model
179 information comes from the PPD or via the "make-and-model" option.
180
181 2. Limitation of the image rendering resolution
182
183 If graphical structures of the incoming PDF file have to be
184 converted to bitmaps due to limitations of PostScript, the
185 conversion of the file by pdftops or the rendering by the printer
186 can get too slow if the bitmap resolution is too high or the
187 printout quality can degrade if the bitmap resolution is too low.
188
189 By default, pdftops tries to find out the actual printing
190 resolution and sets the resolution for bitmap generation to the
191 same value. If it cannot find the printing resolution, it uses 300
192 dpi. It never goes higher than a limit of 1440 dpi. Note that this
193 default limit can get changed at compile time, for example by the
194 Linux distribution vendor.
195
196 The resolution limit for bitmaps can be changed to a lower or
197 higher value, or be set to unlimited. This is done by the option
198 "pdftops-max-image-resolution", setting it to the desired value
199 (in dpi) or to zero for unlimited. It can be used per-job or as
200 per-queue default as the "pdftops-renderer" option described
201 above.
202
203 The "pdftops-max-image-resolution" option is ignored when Adobe
204 Reader is selected as PDF renderer.
205
206POSTSCRIPT PRINTING DEBUG MODE
207
208 Sometimes a PostScript printer's interpreter errors, crashes, or
209 somehow else misbehaves on Ghostscript's output. To find
210 workarounds (currently we have already workarounds for Brother and
211 Kyocera) it is much easier to work with uncompressed PostScript.
212 To get uncompressed PostScript as output, send a job with the
213 "psdebug" option, with commands like the following:
214
215 lpr -P <printer> -o psdebug <file>
216 lp -d <printer> -o psdebug <file>
217
218 If you want to send your job out of a desktop application, run
219
220 lpoptions -p <printer> -o psdebug
221
222 to make "psdebug" a personal default setting for you.
223
224 To extract the PostScript output for a developer to analyse it,
225 clone your print queue to a one which prints into a file:
226
227 cupsctl FileDevice=yes
228 lpadmin -p test -E -v file:/tmp/printout \
229 -P /etc/cups/ppd/<name of original queue>.ppd
230
231 and print into this queue as described above. The PostScript
232 output is in /tmp/printout after the job has completed.
233
234 This option does not change anything if Poppler's pdftops is used
235 as renderer.
236
237HELPER DAEMON FOR BROWSING REMOTE CUPS PRINTERS AND IPP NETWORK PRINTERS
238
239 From version 1.6.0 on in CUPS the CUPS broadcasting/browsing
240 facility was dropped, in favour of Bonjour-based broadcasting of
241 shared printers. This is done as Bonjour broadcasting of shared
242 printers is a standard, established by the PWG (Printing Working
243 Group, http://www.pwg.org/), and most other network services
244 (shared file systems, shared media files/streams, remote desktop
245 services, ...) are also broadcasted via Bonjour.
246
247 Problem is that CUPS only broadcasts its shared printers but does
248 not browse broadcasts of other CUPS servers to make the shared
249 remote printers available locally without any configuration
250 efforts. This is a regression compared to the old CUPS
251 broadcasting/browsing. The intention of CUPS upstream is that the
252 application's print dialogs browse the Bonjour broadcasts as an
253 AirPrint-capable iPhone does, but it will take its time until all
254 toolkit developers add the needed functionality, and programs
255 using old toolkits or no toolkits at all, or the command line stay
256 uncovered.
257
258 The solution is cups-browsed, a helper daemon running in parallel
259 to the CUPS daemon which listens to Bonjour broadcasts of shared
260 CUPS printers on remote machines in the local network via Avahi,
261 and can also listen for (and send) CUPS Browsing broadcasts. For
262 each reported remote printer it creates a local raw queue pointing
263 to the remote printer so that the printer appears in local print
264 dialogs and is also available for printing via the command
265 line. As with the former CUPS broadcasting/browsing with this
266 queue the driver on the server is used and the local print dialogs
267 give access to all options of the server-side printer driver.
268
269 Note that CUPS broadcasting/browsing is available for legacy
270 support, to let the local CUPS daemon work seamlessly together
271 with remote CUPS daemons of version 1.5.x and older which only
272 support CUPS broadcasting/browsing. In networks with only CUPS
273 1.6.x servers (or Ubuntu or Fedora/Red Hat servers with CUPS
274 1.5.x) please use the native Bonjour broadcasting of your servers
275 and cups-browsed, configured for Bonjour browsing only on the
276 clients.
277
278 Also high availability with redundant print servers and load
279 balancing is supported. If there is more than one server providing
280 a shared print queue with the same name, cups-browsed forms a
281 cluster locally with this name as queue name and printing through
282 the "implicitclass" backend. Each job triggers cups-browsed to
283 check which remote queue is suitable for the job, meaning that it
284 is enabled, accepts jobs, and is not currently printing. If none
285 of the remote queues fulfills these criteria, we check again in 5
286 seconds, until a printer gets free to accommodate the job. When we
287 search for a free printer, we do not start at the first in the
288 list, but always on the one after the last one used (as CUPS also
289 does with classes), so that all printer get used, even if the
290 frequency of jobs is low. This is also what CUPS formerly did with
291 implicit classes. Optionally, jobs can be sent immediately into
292 the remote queue with the lowest number of waiting jobs, so that
293 no local queue of waiting jobs is built up.
294
295 For maximum security cups-browsed uses IPPS (encrypted IPP)
296 whenever possible.
297
298 In addition, cups-browsed is also capable of discovering IPP
299 network printers (native printers, not CUPS queues) with known
300 page description languages (PWG Raster, Apple Raster, PDF,
301 PostScript, PCL XL, PCL 5c/e) in the local network and auto-create
302 print queues with auto-created PPD file or PPD-less for them (for
303 the latter using a System V interface script to control the filter
304 chain, only available for CUPS 2.1.0 and older, clients have to
305 IPP-poll the capabilities of the printer and send option settings
306 as standard IPP attributes then). This functionality is primarily
307 for mobile devices running CUPS to not need a printer setup tool
308 nor a collection of printer drivers and PPDs.
309
310 cups-browsed can also be started on-demand, for example to save
311 resources on mobile devices. For this, cups-browsed can be set
312 into an auto shutdown mode so that it stops automatically when it
313 has no remote printers to take care of any more, especially if an
314 on-demand running avahi-daemon stops. Note that CUPS must stay
315 running for cups-browsed removing its queues and so being able to
316 shut down. Ideal is if CUPS stays running another 30 seconds after
317 finishing its last job so that cups-browsed can take down the
318 queue. For how to set up and control this mode via command line,
319 configuration directives, or sending signals see the man pages
320 cups-browsed(8) and cups-browsed.conf(5).
321
322 The configuration file for cups-browsed is
323 /etc/cups/cups-browsed.conf. This file can include limited forms
324 of the original CUPS BrowseRemoteProtocols, BrowseLocalProtocols,
325 BrowsePoll, and BrowseAllow directives. It also can contain the
326 new CreateIPPPrinterQueues to activate discovering of IPP network
327 printers and creating PPD-less queues for them.
328
329 Note that cups-browsed does not work with remote CUPS servers
330 specified by a client.conf file. It always connects to the local
331 CUPS daemon by setting the CUPS_SERVER environment variable and so
332 overriding client.conf. If your local CUPS daemon uses a
333 non-standard domain socket as only way of access, you need to
334 specify it via the DomainSocket directive in
335 /etc/cups/cups-browsed.conf.
336
337 The "make install" process installs init scripts which make the
338 daemon automatically started during boot. You can also manually
339 start it with (as root):
340
341 /usr/sbin/cups-browsed &
342
343 or in debug mode with
344
345 /usr/sbin/cups-browsed --debug
346
347 Shut it down by sending signal 2 (SIGINT) or 15 (SIGTERM) to
348 it. The queues which it has created get removed then (except a
349 queue set as system default, to not loose its system default
350 state).
351
352 On systems using systemd use a
353 /usr/lib/systemd/system/cups-browsed.service file like this:
354
355 [Unit]
356 Description=Make remote CUPS printers available locally
357 After=cups.service avahi-daemon.service
358 Wants=cups.service avahi-daemon.service
359
360 [Service]
361 ExecStart=/usr/sbin/cups-browsed
362
363 [Install]
364 WantedBy=multi-user.target
365
366 On systems using Upstart use an /etc/init/cups-browsed.conf file like this:
367
368 start on (filesystem
369 and (started cups or runlevel [2345]))
370 stop on runlevel [016]
371
372 respawn
373 respawn limit 3 240
374
375 pre-start script
376 [ -x /usr/sbin/cups-browsed ]
377 end script
378
379 exec /usr/sbin/cups-browsed
380
381 These files are included in the source distribution as
382 utils/cups-browsed.service and utils/cups-browsed-upstart.conf.
383
384 In the examples we start cups-browsed after starting
385 avahi-daemon. This is not required. If cups-browsed starts first,
386 then Bonjour/DNS-SD browsing kicks in as soon as avahi-daemon comes
387 up. cups-browsed is also robust against any shutdown and restart
388 of avahi-daemon.
389
390 Here is some info on how cups-browsed works internally (first concept of a
391 daemon which does only Bonjour browsing):
392
393 - Daemon start
394 o Wait for CUPS daemon if it is not running
395 o Read out all CUPS queues created by this daemon (in former sessions)
396 o Mark them unconfirmed and set timeout 10 sec from now
397 - Main loop (use avahi_simple_poll_iterate() to do queue list maintenance
398 regularly)
399 o Event: New printer shows up
400 + Queue for printer is already created by this daemon -> Mark list
401 entry confirmed, if discovered printer is ipps but existing queue ipp,
402 upgrade existing queue by setting URI to ipps. Set status to
403 to-be-created and timeout to now-1 sec to make the CUPS queue be
404 updated.
405 + Queue does not yet exist -> Mark as to-be-created and set
406 timeout to now-1 sec.
407 o Event: A printer disappears
408 + If we have listed a queue for it, mark the entry as disappeared, set
409 timeout to now-1 sec
410 o On any of the above events and every 2 sec
411 + Check through list of our listed queues
412 - If queue is unconfirmed and timeout has passed, mark it as
413 disappeared, set timeout to now-1 sec
414 - If queue is marked disappered and timeout has passed, check whether
415 there are still jobs in it, if yes, set timeout to 10 sec from now,
416 if no, remove the CUPS queue and the queue entry in our list. If
417 removal fails, set timeout to 10 sec.
418 - If queue is to-be-created, create it, if succeeded set to
419 confirmed, if not, set timeout to 10 sec fron now. printer-is-shared
420 must be set to false.
421 - Daemon shutdown
422 o Remove all CUPS queues in our list, as long as they do not have jobs.
423
424 Do not overwrite existing queues which are not created by us If
425 the simple <remote_printer> name is already taken, try to create a
426 <remote_printer>@<server> name, if this is also taken, ignore the
427 remote printer. Do not retry, to avoid polling CUPS all the time.
428
429 Do not remove queues which are not created by us. We do this by
430 listing only our queues and remove only listed queues.
431
432 Queue names: Use the name of the remote queue. If a queue with the
433 same name from another server already exists, mark the new queue
434 as duplicate and when a queue disappears, check whether it has
435 duplicates and change the URI of the disappeared queue to the URI
436 of the first duplicate, mark the queue as to-be-created with
437 timeout now-1 sec (to update the URI of the CUPS queue) and mark
438 the duplicate disappeared with timeout now-1 sec. In terms of
439 high availability we replace the old load balancing of the
440 implicit class by a failover solution. Alternatively (not
441 implemented), if queue with same name but from other server
442 appears, create new queue as <original name>@<server name without
443 .local>. When queue with simple name is removed, replace the first
444 of the others by one with simple name (mark old queue disappeared
445 with timeout now-1 sec and create new queue with simple name).
446
447 Fill description of the created CUPS queue with the Bonjour
448 service name (= original description) and location with the server
449 name without .local.
450
451 stderr messages only in debug mode (command line options:
452 "--debug" or "-d" or "-v").
453
454 Queue identified as from this daemon by doing the equivalent of
455 "lpadmin -p printer -o cups-browsed-default", this generates a
456 "cups-browsed" attribute in printers.conf with value "true".
457
458CUPS FILTERS FOR PDF AS STANDARD PRINT JOB FORMAT
459
460 Here is documentation from the former CUPS add-on tarball with the filters
461 for the PDF-based printing workflow: imagetopdf, texttopdf,
462 pdftopdf, and pdftoraster
463
464 The original filters are from http://sourceforge.jp/projects/opfc/
465
466 NOTE: the texttops and imagetops filters shipping with this package
467 are simple wrapper scripts for backward compatibility with third-party
468 PPD files and custom configurations. There are not referred to in the
469 cupsfilters.convs file and therefore not used by the default
470 configuration. Direct conversion of text or images to PostScript is
471 deprecated in the PDF-based printing workflow. So do not use these
472 filters when creating new PPDs or custom configurations. The parameters
473 for these filters are the same as for texttopdf and imagetopdf (see
474 below) as the ...tops filter calls the ....topdf filter plus
475 Ghostscript's pdf2ps.
476
477
478IMAGETOPDF
479==========
480
4811. INTRODUCTION
482
483This program is "imagetopdf". "imagetopdf" is a CUPS filter which reads
484a single image file, converts it into a PDF file and outputs it to stdout.
485
486This program accepts the following image file format;
487
488 gif, png, jpeg, tiff, photocd, portable-anymap, portable-bitmap,
489 portable-graymap, portable-pixmap, sgi-rgb, sun-raster, xbitmap,
490 xpixmap, xwindowdump
491
492xbitmap, xpixmap and xwindowdump images are converted into png images by
493the "convert" command. Other kinds of image file format can be supported
494if the "convert" command support them.
495
496Output PDF file format conforms to PDF version 1.3 specification, and
497input image is converted and contained in the output PDF file as a binary
498format non-compression image.
499
500"imagetopdf" may outputs multiple pages if the input image exceeds page
501printable area.
502
5032. LICENSE
504
505"imagetopdf.c" is under the CUPS license. See the "COPYING" file.
506For other files, see the copyright notice and license of each file.
507
5083. COMMAND LINE
509
510"imagetopdf" is a CUPS filter, and the command line arguments, environment
511variables and configuration files are in accordance with the CUPS filter
512interface.
513
514imagetopdf <job> <user> <title> <num-copies> <options> [<filename>]
515
516"imagetopdf" ignores <job> and <user>.
517<title> is appended into the PDF dictionary as /Title.
518<num-copies> specifies the number of document copies.
519<options> is a CUPS option list.
520<filename> is an input image file name.
521
522When omit the <filename>, "imagetopdf" reads an image file from stdin.
523
5244. ENVIRONMENT VARIABLES
525
526This program refers the following environment variable;
527
528 PPD: PPD file name of the printer.
529
5305. COMMAND OPTIONS
531
532"imagetopdf" accepts the following CUPS standard options;
533
534fitplot
535mirror
536PageSize
537page-left, page-right, page-bottom, page-top
538OutputOrder
539Collate
540sides
541cupsEvenDuplex
542position
543scaling
544ppi
545natural-scaling
546landscape
547orientation-requested
548
549See the CUPS documents for details of these options.
550
5516. KNOWN PROBLEMS
552
553Problem:
554 PBM and SUN raster images can not be printed.
555Solution:
556 Due to the CUPS libcupsimage library's bug. Update the CUPS on your system.
557
5587. INFORMATION FOR DEVELOPERS
559
560Following information is for developers, not for driver users.
561
5627.1 Options handled by a printer or "imagetopdf"
563
564Following options are handled by a printer or "imagetopdf".
565 Collate, Copies, Duplex, OutputOrder
566
567Which handles these options depends on following options and attributes.
568 Collate, Copies, Duplex, OutputOrder, cupsEvenDuplex, cupsManualCopies
569
570"imagetopdf" judges whether a printer can handle these options according to
571the followings option settings in a PPD file.
572
573Collate:
574 If Collate is defined, "imagetopdf" judges the printer supports Collate.
575Copies:
576 If cupsManualCopies is defined as True, "imagetopdf" judges the printer
577 does not support Copies feature.
578
579Duplex:
580 If Duplex is defined, "imagetopdf" judges the printer supports Duplex.
581 If cupsEvenDuplex is True, Number of pages must be even.
582OutputOrder:
583 If OutputOrder is defined, "imagetopdf" judges the printer supports
584 OutputOrder.
585
586If the printer cannot handle these options, "imagetopdf" handles it.
587
588Following pseudo program describes how "imagetopdf" judges to handle
589these options.
590
591Variables
592
593Copies : specified Copies
594Duplex : specified Duplex
595Collate : specified Collate
596OutputOrder : specified OutputOrder
597EvenDuplex : specified cupsEvenDuplex
598pages : number of pages
599number_up : specified number-up
600
601device_copies : Copies passed to the printer
602device_duplex : Duplex passed to the printer
603device_collate : Collate passed to the printer
604device_outputorder : OutputOrder passed to the printer
605
606soft_copies : copies by imagetopdf
607
608
609device_copies = 1;
610device_duplex = False;
611device_collate = False;
612device_outputorder = False;
613
614if (Copies == 1) {
615 /* Collate is not needed. */
616 Collate = False;
617}
618
619if (!Duplex) {
620 /* EvenDuplex is not needed */
621 EvenDuplex = False;
622}
623
624
625if (Copies > 1 && the printer can handle Copies) device_copies = Copies;
626if (Duplex && the printer can handle Duplex) {
627 device_duplex = True;
628} else {
629 /* imagetopdf cannot handle Duplex */
630}
631if (Collate && the printer can handle Collate) device_collate = True;
632if (OutputOrder == Reverse && the printer can handle OutputOrder)
633 device_outputorder = True;
634
635if (Collate && !device_collate) {
636 /* The printer cannot handle Collate.
637 So imagetopdf handle Copies */
638 device_copies = 1;
639}
640
641if (device_copies != Copies /* imagetopdf handle Copies */ && Duplex)
642 /* Make imagetopdf handle Collate, otherwise both paper side may have
643 same page */
644 Collate = True;
645 device_collate = False;
646}
647
648if (Duplex && Collate && !device_collate) {
649 /* Handle EvenDuplex, otherwise the last page has
650 the next copy's first page in the other side of the paper. */
651 EvenDuplex = True;
652}
653
654if (Duplex && OutputOrder == Reverse && !device_outputorder) {
655 /* Handle EvenDuplex, otherwise the first page's other side of paper
656 is empty. */
657 EvenDuplex = True;
658}
659
660soft_copies = device_copies > 1 ? 1 : Copies;
661
6627.2 JCL
663
664When you print PDF files to a PostScript(PS) printer, you can specify
665device options in PS. In this case, you can write PS commands in a PPD file
666like as follows.
667
668*OpenUI *Resolution/Resolution : PickOne
669*DefaultResolution: 600
670*Resolution 300/300 dpi: "<</HWResolution[300 300]>>setpagedevice"
671*Resolution 600/600 dpi: "<</HWResolution[600 600]>>setpagedevice"
672*CloseUI: *Resolution
673
674However, if options cannot be described in PS file, you can write JCLs
675as follows;
676
677*JCLOpenUI *JCLFrameBufferSize/Frame Buffer Size: PickOne
678*DefaultJCLFrameBufferSize: Letter
679*OrderDependency: 20 JCLSetup *JCLFrameBufferSize
680*JCLFrameBufferSize Off: '@PJL SET PAGEPROTECT = OFF<0A>'
681*JCLFrameBufferSize Letter: '@PJL SET PAGEPROTECT = LTR<0A>'
682*JCLFrameBufferSize Legal: '@PJL SET PAGEPROTECT = LGL<0A>'
683*JCLCloseUI: *JCLFrameBufferSize
684
685Because PDF cannot specify device options in a PDF file, you have to define
686all the device options as JCLs.
687
688When a printer does not support PS or PDF, you can use Ghostscript (GS).
689In this case, you can specify device options like a PS printer.
690If you want to use the same printer and same PPD file for both PDF and PS
691printing, when you print a PS file, you can specify that GS handles it,
692and when you print a PDF file, you can also specify that PDF filters handle
693it in the same PPD file. However in this case, previous methods is not
694appropriate to specify device options.
695
696So, "imagetopdf" handles this case as follows;
697(In following pseudo program, JCL option is an option specified with JCLOpenUI)
698
699if (Both JCLBegin and JCLToPSInterpreter are specified in the PPD file) {
700 output JCLs that marked JCL options.
701}
702
703if (pdftopdfJCLBegin attribute is specified in the PPD file) {
704 output it's value
705}
706
707if (Copies option is specified in the PPD file) {
708 mark Number of copies specified
709} else if (pdftopdfJCLCopies is specified in the PPD file) {
710 output JCL specified with JCLCopies
711}
712
713for (each marked options) {
714 if (pdftopdfJCL<marked option's name> is specified in the PPD file) {
715 output it's value as a JCL
716 } else if (pdftopdfJCLBegin attributes is specified in the PPD file) {
717 output "<option's name>=<marked choice>;" as a JCL
718 }
719}
720output NEWLINE
721
722Thus, if you want to use both PDF filters and GS by single PPD file,
723what you should do is to add the following line in the PPD file;
724
725*pdftopdfJCLBegin: "pdfto... jobInfo:"
726
727Replace "pdfto..." by the name of the actual filter to be called after
728pdftopdf.
729
730Note:
731 If you specify JCLBegin, you have to specify JCLToPSInterpreter as well.
732
733Note:
734 When you need to specify the value which is different from the choosen
735 value based on the PPD into the jobInfo, you have to specify the values
736 with the key started by "pdftopdfJCL" string.
737
738 For example, if the page size is defined in a PPD file as following;
739
740 *OpenUI *PageSize/Page Size: PickOne
741 *DefaultPageSize: A4
742 *PageSize A4/A4:
743 *PageSize Letter/US Letter:
744 *CloseUI: *PageSize
745
746 if you choose the page size "Letter", the string "PageSize=Letter;" is
747 added to jobInfo. On the other hand, if the driver requires the different
748 value for the "Letter" size, for instance driver requires "PS=LT;"
749 instead of "PageSize=Letter;" as the jobInfo value, the PPD file has to
750 be defined as following;
751
752 *OpenUI *PageSize/Page Size: PickOne
753 *DefaultPageSize: A4
754 *PageSize A4/A4:
755 *pdftopdfJCLPageSize A4/A4: "PS=A4;"
756 *PageSize Letter/US Letter:
757 *pdftopdfJCLPageSize Letter/US Letter: "PS=LT;"
758 *CloseUI: *PageSize
759
7607.3 Temporally files location
761
762"imagetopdf" creates temporally files if needed. Temporary files are created
763in the location specified by TMPDIR environment variable. Default location
764is "/tmp".
765
766
767PDFTOPDF
768========
769
770The pdftopdf filter depends on libqpdf to read and write PDF files.
771
772It replaces and imitates the pstops filter in the PDF-based workflow.
773A similar filter (which can serve as behavior reference)
774is called "cgpdftopdf" in OS X (not open source).
775
776Command line
777------------
778
779pdftopdf follows the usual CUPS filter calling conventions, i.e.
780
781 pdftopdf <job> <user> <title> <num-copies> <options> [<filename>]
782
783together with the environment variables "PPD" and "CLASSIFICATION".
784
785When omitting <filename>, "pdftopdf" reads a PDF file from stdin.
786Internally this will write the data to a temporary file, because
787the PDF format cannot be processed in a streaming fashion.
788
789<options> are delimited by space; boolean type CUPS options can be set
790by only adding the option key, other types are provided as
791pairs of key and value, <key>=<value>.
792
793pdftopdf processes the following standard command-line and/or PPD options:
794
795Copies # ppd will only override, when commandline parameter was 1
796fitplot / fit-to-page / ipp-attribute-fidelity
797landscape / orientation-requested
798PageSize / page-size / MediaSize / media-size
799page-left / page-right / page-bottom / page-top
800media-top-margin / media-left-margin / media-right-margin / media-bottom-margin
801Duplex / JCLDuplex / EFDuplex / JD03Duplex / sides
802number-up / number-up-layout
803page-border
804OutputOrder / OutputBin / DefaultOutputOrder / page-delivery
805page-label
806page-set
807page-ranges
808MirrorPrint / mirror
809emit-jcl
810position
811Collate / multiple-document-handling / sheet-collate
812cupsEvenDuplex
813cupsManualCopies # via ppd
814
815Additional (non-standard) options
816---------------------------------
817
8181) Booklet printing
819
820 booklet=Off/On/Shuffle-Only
821
822"On" also tries to set DuplexTumble (two-sided-short-edge) and forces number-up=2
823
824 booklet-signature=(multiple of 4, or default: -1 to use "all pages")
825
8262) Page autorotate
827
828pdftopdf automatically rotates pages to the same orientation,
829instead of (e.g. fitplot) scaling them down unrotated.
830This behavier can be controlled by
831
832 pdfAutorotate / nopdfAutorotate
833
834Specifically, if a PDF file contains pages with page width greater than
835page height (a landscape page), such pages are automatically rotated
836anticlockwise by 90 degrees, unless the PPD file specifies
837"*LandscapeOrientation: Minus90". In this case, clockwise rotation is used.
838To turn off the feature on a job-by-job basis use
839
840 lp -d <print_queue_name> -o nopdfAutorotate <document>
841
842On a per-queue basis use
843
844 -o nopdfAutorotate-default
845
846as an option to lpadmin.
847
848When the 'landscape' or 'orientation-requested=4' (or =5) option of CUPS is
849given, the pdfAutorotate processing will adjust and accordingly rotate the
850non-landscape pages are rotated instead.
851
852Note: Some pages might end up 180 degree rotated (instead of 0 degree).
853Those should probably be rotated manually before binding the pages together.
854
8553) Method of flattening interactive PDF forms and annotations.
856
857Some PDF files (like application forms) contain interactive forms
858which the user can fill in inside a PDF viewer like evince. The filled
859in data is not integrated in each page of the PDF file but stored in
860an extra layer. Due to this the data gets lost when applying
861manipulations like scaling or N-up to the pages. To prevent the loss
862of the data pdftopdf flattens the form before doing the
863manipulations. This means the PDF will be converted into a static PDF
864file with the data being integral part of the pages.
865
866The same flattening is needed for annotations in PDF files.
867
868By default the actual flattening work is done by QPDF, as QPDF is also
869doing everything else in pdftopdf. This way no external utilities need
870to be called and so extra piping between processes and extra PDF
871interpreter runs are avoided which makes the filtering process faster.
872
873As we did not test the new QPDF-based form-flattening with thousands
874of PDF files yet and it has not been available to actual users yet it
875is possible that there are still some bugs. To give users a
876possibility to work around possible bugs in QPDF's form flattening, we
877have introduced an option to get back to the old flattening by the
878external tools pdftocairo or Ghostscript.
879
880The selection of the method is done by the "pdftopdf-form-flattening"
881option, setting it to "auto", "qpdf", "pdftocairo", "ghostscript",
882"gs", "internal" or "external":
883
884Per-job: lpr -o pdftopdf-form-flattening=pdftocairo ...
885Per-queue default: lpadmin -p printer -o pdftopdf-form-flattening-default=gs
886Remove default: lpadmin -p printer -R pdftopdf-form-flattening-default
887
888By default, pdftopdf uses QPDF if the option is not supplied, also the
889settings "auto" and "internal" make QPDF being used. "external"
890auto-selects from the two external utilities, trying pdftocairo at
891first and on failure Ghostscript. If the selected utility fails, the
892form stays unflattened and so the filled in data will possibly not get
893printed.
894
895Native PDF Printer / JCL Support
896--------------------------------
897
898Note that for most modern native PDF printers JCL is not needed any
899more as they are controlled via IPP. For these the PPD files get
900auto-generated by the support of CUPS and cups-filters for driverless
901IPP printing.
902
903pdftopdf will emit JCL when provided with a PPD file that includes the
904"*JCLToPDFInterpreter:" keyword.
905
906This enables for hardware copy generation and device collate; e.g. with PJL:
907
908*JCLBegin: "<1B>%-12345X@PJL JOB<0A>"
909*JCLToPDFInterpreter: "@PJL ENTER LANGUAGE = PDF <0A>"
910*JCLEnd: "<1B>%-12345X@PJL EOJ <0A><1B>%-12345X"
911
912For each marked option, the prefixed "pdftopdfJCL<option name>" keywords
913can also be used to send raw JCL strings for that option.
914These keywords also include *pdftopdfJCLBegin and *pdftopdfJCLCopies,
915This allows the use of the same PPD for PDF- and PS-based workflows,
916as pdftopdfJCL... will not be read in the PS case.
917
918When the PPD contains the "Copies" keyword, pdftopdf will detect the use
919of PJL and has special code which adds "@PJL SET COPIES=...",
920or "@PJL SET QTY=...", respectively.
921
922Other JCL code can be injected via "*JCLOpenUI: ..." ... "*JCLCloseUI: ...".
923
924Special PDF comments
925--------------------
926
927pdftopdf adds comments to the pdf preamble that might esp. be of use
928to subsequent filters, e.g.
929
930 % This file was generated by pdftopdf
931 %%PDFTOPDFNumCopies : 1
932 %%PDFTOPDFCollate : false
933
934The "NumCopies" and "Collate" values refer to the expected device/hardware
935copies, i.e. when pdftopdf's soft-copy generation did not handle this options.
936
937Limitations
938-----------
939
940pdftopdf does not support functions that are not related to printing
941features, including interactive features and document interchange features.
942Many of these operators and sections are just ignored.
943Some of these may be output, but those functions are not assured.
944
945Most notable is the use of AcroForms; their content will not be printed
946if any non-trivial processing by pdftopdf is involved (e.g. "fitplot").
947This only occurs when a file is printed directly, e.g. by "lpr".
948
949Usual PDF viewer applications (xpdf, evince, acroread, ghostscript, ...)
950will hardcopy the form content into printable pdf operations,
951when choosing to print such a document.
952
953Known issues
954------------
955
956- Borders, esp. in the "number-up=1 fitplot=false"-case might be drawn
957 at incorrect locations.
958
959- JCL documentation is sparse.
960 The imagetopdf or old pdftopdf documentation contains a tad more information.
961
962- Missing AcroForm-content might surprise users printing PDF files directly /
963 from the command-line (see the Limitations section, above).
964
965License
966-------
967
968pdftopdf is released under the MIT license.
969
970The required libqpdf is available under version 2.0 of the Apache License,
971e.g. here: https://github.com/qpdf/qpdf
972
973
974TEXTTOPDF
975=========
976
977This implements a texttopdf filter, and is derived from cups' texttops.
978
979To configure:
980-------------
981
982- texttopdf uses CUPS_DATADIR/charset/pdf.utf-8 for font configuration
983 (when utf-8 was requested as charset). The font names given there are
984 used as fontconfig selectors; the best matching font, that is both
985 monospaced and in a supported format (TTC, TTF or OTF) will then be used.
986
987- As a special exception, all fontnames that start with a '.' or '/' are
988 considered filenames, and fontconfig is skipped; the name is used directly
989 for loading the font file.
990
991- Implementation note: TrueType Collections (.TTC) are internally handled
992 by appending '/' and the index of the font inside the collection to
993 the filename (e.g. to use the second font of uming.ttc, the filename
994 uming.ttc/1 must be given to the fontembed-library).
995 By appending the index-field returned from fontconfig, this is completely
996 transparent to the user (but currently not widely tested).
997
998- You may look at the two examples: pdf.utf-8.simple and pdf.utf-8.heavy.
999
1000To use:
1001-------
1002
1003The filter is called just like any other cups filter. Have a
1004look at test.sh for example.
1005
1006Known Issues
1007------------
1008
1009 - Text extraction does not work (at least for pdftotext from xpdf)
1010 for the resulting pdfs.
1011
1012 - OTF(CFF) embedding currently does not subset the fonts.
1013
1014 - Text wrapping in pretty-printing mode does not respect double-wide
1015 characters (CJK), and thus produce wrong results (wrap too late)
1016 for lines where they occur. The fix is not trivial, since all the
1017 pretty-printing processing is done without knowledge of / prior to
1018 the font configuration (which is where single or double width
1019 code-ranges are specified).
1020
1021 - The hebrew example in test5.pdf shows one of our limitations:
1022 Compose glyphs are not composed with the primary glyph but printed
1023 as separate glyphs.
1024
1025Further Infos
1026-------------
1027
1028Font embedding is handled by libfontembed in the filter/fontembed
1029subdirectory.
1030
1031Please report all bugs to
1032
1033https://github.com/OpenPrinting/cups-filters/issues
1034
1035or to
1036
1037https://bugs.linuxfoundation.org/
1038
1039(product "OpenPrinting", component "cups-filters").
1040
1041
1042PDFTORASTER
1043===========
1044
10451. INTRODUCTION
1046
1047"pdftoraster" is a filter for CUPS. It reads PDF files, convert it and
1048output CUPS raster.
1049
1050"pdftoraster" does not support functions that are not related to printing
1051features, including interactive features and document interchange features.
1052Many of these operators and sections are just ignored.
1053Some of these may be output, but those functions are not assured.
1054Encryption feature is not supported.
1055
10562. LICENSE
1057
1058Almost all source files are under MIT like license. However,
1059"pdftoraster" links some "poppler" libraries, and these files are
1060under GNU public license. See copyright notice of each file for
1061details.
1062
10633. COMMAND LINE
1064
1065"pdftoraster" is a CUPS filter, and the command line arguments, environment
1066variables and configuration files are in accordance with the CUPS filter
1067interface.
1068
1069pdftoraster <job> <user> <title> <num-copies> <options> [<filename>]
1070
1071"pdftoraster" ignores <job> and <user>.
1072<title> is appended into the PDF dictionary as /Title.
1073<num-copies> specifies the number of document copies.
1074<options> is a CUPS option list.
1075<filename> is an input PDF file name.
1076
1077When omit the <filename>, "pdftoraster" reads a PDF file from the stdin,
1078and save it as a temporary file.
1079
10804. ENVIRONMENT VARIABLES
1081
1082This program refers the following environment variable;
1083 PPD: PPD file name of the printer.
1084
10855. COMMAND OPTIONS
1086
1087See CUPS documents for details.
1088
10896. INFORMATION FOR DEVELOPERS
1090
1091Following information is for developers, not for driver users.
1092
10936.1 Options handled by a printer or "pdftoraster"
1094
1095"pdftopdf" outputs the following special comments from the 4th line in the
1096created PDF data.
1097
1098%%PDFTOPDFNumCopies : <copies> --- <copies> specified Number of Copies
1099%%PDFTOPDFCollate : <collate> --- <collate> is true or false
1100
1101"pdftoraster" overrides the command line options by above two option's values.
1102
11036.2 Temporally files location
1104
1105"pdftoraster" creates temporally files if needed. Temporary files are created
1106in the location specified by TMPDIR environment variable. Default location
1107is "/tmp".
1108
1109
1110URFTOPDF
1111========
1112
1113"urftopdf" is a filter to convert Apple's proprietary URF raster
1114format into PDF. URF raster is generated by some iOS applications when
1115printing via Airprint, so this filter provides a more complete support
1116for AirPrint clients. Note that it is not clear whether nowadays all
1117iOS applications send PDF and not URF any more. Also the filter does
1118not support all variants of URF format so the URF support is most
1119probably incomplete.
1120
1121Apple does not provide any official documentation of the format but there is
1122already some reverse engineering done. A description of the format as far as it
1123got found out and two sample files can be found here:
1124
1125https://github.com/AlanQuatermain/unirast
1126
1127An actual implementation of an urftopdf filter is here:
1128
1129https://github.com/superna9999/urftopdf
1130
1131This original version uses libharu and to avoid an extra dependency
1132the filter coming with this package is converted to use libqpdf
1133instead (the same library as pdftopdf uses).
1134
1135License: GNU General Public License version 3 or any newer version
1136
1137
1138TEXTTOTEXT
1139==========
1140
1141This is a special filter for text-only printers (e. g. line printers,
1142daisy-wheel printers, POS printers, ...) or for using printers in
1143their text mode (e. g. dot-matrix printers or otherwise unsupported
1144printers). It takes plain text (UTF-8-encoded as this is standard with
1145CUPS) and not PDF as input.
1146
1147The texttotext filter replaces the former textonly filter.
1148
1149It is for the following use cases:
1150
1151- Using text-only printers, like line printers or daisy-wheel
1152 printers. Note that only text can get printed in the way the printer
1153 is designed. No support for graphics printing tricks like ASCII
1154 or printing pixels with the period character.
1155
1156- Fast and less resource-consuming text printing with dot-matrix
1157 printers using the printer's text mode instead of converting the
1158 text to PDF and printing the PDF in the printer's graphics mode,
1159 which is slow, loud, and consumes much more ink.
1160
1161- POS printing. POS printers often print only text on roll paper. This
1162 filter has a non-paginated mode which prints continuously, ignoring
1163 page height definitions.
1164
1165The filter has the following features:
1166
1167- Conversion of UTF-8 to most printer's encodings.
1168
1169- To each page size a number of lines and columns is assigned, after that
1170 you only need to select the size of the paper in use.
1171
1172- At end of page you can optionally send a Form Feed or let the filter fill
1173 up the rest of the page with blank lines.
1174
1175- New lines can be initiated by Line Feed, Carriage Return, or both.
1176
1177- Adjustable margins.
1178
1179- Adjustable width for tab stops.
1180
1181- Pagination can be turned off for roll paper or continuous printing in
1182 general.
1183
1184- Wrapping or truncation of long lines
1185
1186- Support for most of CUPS' page management options (only with
1187 pagination turned on): page-ranges, page-set, output-order, collate,
1188 multiple copies.
1189
1190Setting up the printer
1191
1192In the printer setup tool select the "Generic Text-Only Printer" (with
1193lpadmin use "-m drv:///cupsfilters.drv/textonly.ppd"), then under the
1194"Installable Options" adjust the following:
1195
1196- Which page sizes to use and how many lines and columns the printer
1197 is capable to print on them. The default setting for lines and
1198 columns assume 6 lines per inch and 10 columns per inch.
1199
1200- Whether to send a Form Feed character after each page. Sending a
1201 Form Feed is highly recommended to get the content of each page
1202 exactly onto the desired sheet. If the printer does not support Form
1203 Feed characters, turn them off and make sure that you have adjusted
1204 the correct number of lines for each page size, as the printer is
1205 advancing pages by filling up the rest of the paper with blank
1206 lines.
1207
1208- How the printer advancs to a new line. Most printers require both
1209 Crriage Return and Line Feed (the DOS/Windows standard), but some
1210 would also work with either Carriage Return or Line Feed.
1211
1212- The printer's encoding: Most text and dot-matrix printers (usually
1213 older devices) do not understand CUPS' standard encoding UTF-8 but
1214 instead, the use a simpler encoding (where each character is
1215 represented by one byte). ASCII should always work, but does not
1216 support letters with accents. So check the printer's manual what is
1217 supported. You cannot only use the encodings suggested by the PPD
1218 file, but any one-byte-per-character encoding which the "iconv"
1219 utility supports (see "iconv --list" for a list of encodings).
1220
1221Also note that text-only and dot-matrix printers often have a DIP
1222switch block which allows for some hardware configuration, like
1223newline characters, length of page, input encoding, ...
1224
1225Options of the texttotext filter:
1226
1227To be usually used when sending a job:
1228
1229PageSize: Paper format to be used. Make sure that the number of lines
1230and columns printable on each paper size are correctly adjusted with
1231the appropriate setup option. The page height is ignore when
1232pagination is turned off. Possible values: Letter, Legal, Tabloid,
1233Ledger, A4, A3, FanFoldGerman, FanFoldGermanLegal, 11x14Rotated,
1234LegalRotated, Custom1, Custom2, Custom3
1235
1236OverLongLines: What to do with lines longer that the width of the
1237page: Truncate: Simply drop the extra characters; WrapAtWidth
1238(default): Continue the line in the next line on the paper; WordWrap:
1239As WrapAtWidth, but do not cut in the middle of a word.
1240
1241TabWidth: Width of a tab stop. Can be any positive number.
1242
1243Pagination: On: Text is divided in pages depending on the page size
1244selection, with each page having the user-selected margins,
1245recommended for sheet paper; Off: Text is printed continuously,
1246ignoring page breaks and the height and upper and lower margins of the
1247destination page size, recommended for roll paper, POS, long lists on
1248continuous paper, ... Note that with pagination turned off, multiple
1249copies, collate, page-ranges, page-set, and output-order are not
1250supported and therefore ignored.
1251
1252page-left, page-right, page-top, page-bottom: Width of the margins
1253left blank, counted in lines or columns. Top and bottom margins are
1254ignored when pagination is turned off. Can be any positive number or
1255zero for no margin.
1256
1257To be usually used when setting up the printer:
1258
1259PrinterEncoding: The printer's character encoding (code page). Any
1260encoding which the iconv utility can generate (see "iconv --list") and
1261which uses only one byte per character can be used. This should
1262support practically any printer which is capable of printing
1263text. ASCII is the default setting. See the printer's manual for the
1264correct encoding to use.
1265
1266NewlineCharacters: The characters sent on the end of a line, LineFeed
1267(LF), Crriage Return (CR), or both Carriage Return and Line Feed
1268(CRLF). Default is CRLF as most printers require this.
1269
1270SendFF: On: Send a Form Feed after each page, so that printer changes
1271to the next sheet. Off: Do not send Form Feeds. To advance to the next
1272page blank lines are printed to fill up the page (requires the number
1273of limes for the selected page size correctly being set). When
1274pagination is off, Form Feeds are never sent.
1275
1276LetterAvailable, LegalAvailable, TabloidAvailable, LedgerAvailable,
1277A4Available, A3Available, FanFoldGermanAvailable,
1278FanFoldGermanLegalAvailable, 11x14RotatedAvailable,
1279LegalRotatedAvailable, Custom1Available, Custom2Available,
1280Custom3Available: On: Paper of this size is available; Off: This paper
1281size is not available.
1282
1283LetterNumLines, LegalNumLines, TabloidNumLines, LedgerNumLines,
1284A4NumLines, A3NumLines, FanFoldGermanNumLines,
1285FanFoldGermanLegalNumLines, 11x14RotatedNumLines,
1286LegalRotatedNumLines, Custom1NumLines, Custom2NumLines,
1287Custom3NumLines: Maximum number of text lines fitting on the paper
1288size. Default value is selected assuming 6 lines per inch. Can be any
1289positive number.
1290
1291LetterNumColumns, LegalNumColumns, TabloidNumColumns,
1292LedgerNumColumns, A4NumColumns, A3NumColumns, FanFoldGermanNumColumns,
1293FanFoldGermanLegalNumColumns, 11x14RotatedNumColumns,
1294LegalRotatedNumColumns, Custom1NumColumns, Custom2NumColumns,
1295Custom3NumColumns: Maximum number of columns (characters) fitting on
1296the paper size. Default value is selected assuming 10 characters per
1297inch. Can be any positive number.
1298
1299Standard CUPS options supported:
1300
1301page-ranges, page set, output-order, collate
1302
1303Note that these options and multiple copies are ignored when
1304pagination is turned off.
1305
1306
1307BEH - Backend Error Handler wrapper backend
1308===========================================
1309
1310A wrapper for CUPS backends to make error handling more configurable
1311
1312Usually, if a CUPS backend exits with an error status other than zero
1313(for example if a printer is not turned on or not reachable on the
1314network), CUPS disables the print queue and one can only print again
1315if a system administrator re-enables the queue manually. Even
1316restarting CUPS (or rebooting) does not re-enable disabled queues.
1317
1318For system administrators this can get annoying, for newbie users who
1319are not aware of this problem it looks like that CUPS is severely
1320broken. They remove and re-install print queues, getting on the nerves
1321of distro install support, people, or even switch back to a
1322proprietary operating system.
1323
1324Nowadays CUPS allows some configurability to avoid this, setting the
1325Error Policy to "retry-job", but this does not allow to retry for
1326infinitely many times and generally does not allow to change the
1327number of repetitions. It is also not possible to simply drop the job
1328without disabling the queue when CUPS gives up repeating the job.
1329
1330This script makes the handling of such backend errors more
1331configurable, so that the problem can easily be worked around. The new
1332possibilities are:
1333
1334 - Let queues simply not being disabled. Simple approach, but job gets
1335 lost.
1336
1337 - Repeat a given number of times.
1338
1339 - Repeat infinitely often, until the job gets finally through. This
1340 is the standard of LPRng, and it eliminates loss of the job.
1341
1342 - The interval between two attempts to run the backend can also be
1343 configured.
1344
1345 - Configuration is done independently for each print queue. So local
1346 printers and network printers can be treated differently.
1347
1348
1349Usage:
1350
1351Activate "beh" for your print queue(s) with command(s) like this:
1352
1353lpadmin -p <queue name> -E -v beh:/<dd>/<att>/<delay>/<originaluri>
1354
1355with
1356 <queue name>: The name of your print queue
1357 <dd>: Don't Disable, if "1", beh always exits with zero
1358 status, so the queue gets never disabled when the
1359 original backend exits with an error. "0" carries
1360 the error status of the last call of the backend
1361 (after <att> retries) on to CUPS, so the queue
1362 usually gets disabled.
1363 <att>: Attempts, number of attempts to recall the backend
1364 in case of an error. "0" means infinite retries. In
1365 this case <dd> gets meaningless.
1366 <delay>: Delay between two attempts to call the beckend, to
1367 be given in seconds and as an integer number.
1368 Meaningless if <att> is one.
1369 <originaluri>: The original URI, which your queue had before. Can
1370 be determined with "lpstat -v".
1371
1372All parameters, especially, <dd>, <att>, and <delay> have always to be
1373specified, even if one of them is meaningless due to the setting of
1374the others.
1375
1376beh works with every backend except the "hp" backend of HPLIP, as the
1377"hp" backend repeats failed jobs by itself.
1378
1379Example URIs:
1380
1381beh:/1/3/5/socket://printer:9100
1382
1383 On the network printer with host name "printer" it is tried to
1384 access 3 times with 5 second delays between the attempts. If the job
1385 still fails, the queue is not disabled (and the job discarded).
1386
1387beh:/0/10/60/socket://printer:9100
1388
1389 Retry 10 times in one minute intervals, disable the queue when still
1390 not succeeding.
1391
1392beh:/1/0/60/usb://Brother/HL-5040%20series
1393
1394 On a Brother HL-5040 on the USB try infinitely often until the
1395 printer comes back, in intervals of one minute. This way the job
1396 does not get lost when the printer is turned off and one can
1397 intendedly delay printing by simply switching off the printer. The
1398 ideal configuration for desktop printers and/or home users.
1399
1400Originally this backend was written in Perl and part of the
1401foomatic-filters package. It was not overtaken into cups-filters
1402together with foomatic-rip to avoid the introduction of a dependency
1403on Perl. Now it has been re-written in C and so it can be part of
1404cups-filters without introducing new dependencies.
1405
1406
1407BRAILLE EMBOSSING
1408=================
1409
1410cups-filters also provides filters and drivers for braille
1411embossers. It supports:
1412
1413- Text on all kinds of embossers with generic support
1414- Text and graphics on the Index V3 embossers and above.
1415
1416This is configured in CUPS just like any printer. Options can then be configured
1417in the standard printer panel, or passed as -o options to the lp command.
1418
1419
1420------------
1421Text support
1422------------
1423
1424Text can be embossed either with no translation on the computer side (the
1425embosser will translate), or with translation on the computer side (thanks to
1426liblouis). It is a matter of running
1427
1428lp file.txt
1429
1430or even
1431
1432lp file.html
1433lp file.odt
1434lp file.doc
1435lp file.rtf
1436lp file.docx
1437lp file.pdf
1438
1439Important: it is really preferrable to directly print the document files
1440themselves, and not a pdf output, or printing from the application (which
1441would first convert to pdf). That way, the braille conversion will have the
1442proper document structure (paragraphs, titles, footnotes, etc.) to produce good
1443quality.
1444
1445
1446--------------------
1447Vector Image support
1448--------------------
1449
1450Vector images can be embossed by converting them to braille dots.
1451
1452This needs the inkscape package installed. Various input formats are then
1453supported: .svg, .fig, .wmf, .emf, .cgm, .cmx
1454
1455The conversion assumes that the input is black-on-white. If it is
1456white-on-black, the -o Negate option can be used.
1457
1458This image support is preferred over the generic image support described below,
1459which has to reconstruct lines to be embossed.
1460
1461
1462-------------
1463Image support
1464-------------
1465
1466Images can be embossed by converting them to braille dots.
1467
1468The orientation of the image can be controlled. By default it will be rotate to
1469fit the image orientation, i.e. it will be rotate by 90 degree if it is wider
1470than high and the paper is higher than wide, or if vice-versa. Other rotation
1471modes are provided.
1472
1473By default, the image will be resized to fit the size of the paper. Disabling
1474the resize (fitplot set to No) will crop the image to the paper size. This is
1475useful for instance when a carefully-drawn image was designed especially for
1476embossing, and thus its pixels should exactly match with braille dots. In such
1477case, edge detection should very probably be disabled too.
1478
1479The image can be processed for edge detection. When no processing is done (edge
1480detection is configured to "None"), the dark pixels are embossed if the Negate
1481option is off, or the light pixels are embossed if the Negate option is on. When
1482edge processing is done, only the edges of the images will be embossed. The
1483Basic and the Canny algorithms bring differing results. The Basic algorithm
1484can be tuned thanks to the edge factor only. The Canny algorithm can also be
1485tuned: increasing the Upper value will reduce the amount of detected edges (and
1486vice-versa), increasing the Lower value will reduce the lengths of the detected
1487edges (and vice-versa). The Radius and Sigma parameter control the blurring
1488performed before edge detection, to improve the result; the Radius parameter
1489controls how large blurring should be performed, setting it to zero requests
1490autodetection; the Sigma parameter determines how strongly blurring should be
1491performed.
1492
1493A lot of images formats are support, so one can just run
1494
1495lp file.png
1496lp file.gif
1497lp file.jpg
1498...
1499
1500Here are complete examples for controlling the processing (all options can be
1501omitted, the default values are shown here):
1502
1503Emboss the image without edge detection, as black on white or white on black:
1504
1505lp -o "Edge=None" file.png
1506lp -o "Edge=None Negate" file.png
1507
1508Emboss the image with edge detection, the default tuning parameters are set
1509here:
1510
1511lp -o "Edge=Edge EdgeFactor=1" file.png
1512lp -o "Edge=Canny CannyRadius=0 CannySigma=1 CannyLower=10 CannyUpper=30" file.png
1513
1514Emboss the image as it is, without any resize or edge detection, as black on
1515white or white on black:
1516
1517lp -o "nofitplot Edge=None" file.png
1518lp -o "nofitplot Edge=None Negate" file.png
1519
1520------------------------
1521Generic embosser support
1522------------------------
1523
1524It should be possible to make all embossers use the generic driver. For this to
1525work, one has to:
1526
1527- configure the embosser itself so that it uses an MIT/NABCC/BRF braille table
1528- add in CUPS a printer with the "Generic" manufacturer and "Braille embosser"
1529 model
1530- configure CUPS options according to the embosser settings, so that CUPS knows
1531 the page size, braille spacing, etc.
1532
1533The generic driver can emboss text, as well as images, but images will probably
1534be distorted by the Braille interline spacing.
1535
1536
1537-----------------------
1538Index embossers support
1539-----------------------
1540
1541Supported models:
1542
1543Basic-S V3/4
1544Basic-D V3/4
1545Everest-D V3/4
15464-Waves PRO V3
15474X4 PRO V3
1548Braille Box V4
1549
1550Index V3 embosser support has been well tested. It supports both text and
1551graphics mode. Embossers with firmware 10.30 and above can be easily configured
1552from CUPS (paper dimension, braille spacing, etc.).
1553
1554Index V4 embosser support has not been tested, but is very close to V3 support,
1555so it is probably working fine already. Feedback would be very welcome.
1556
1557To connect an Index embosser through Ethernet, gather its IP adress, select the
1558"AppSocket/HP JetDirect" network printer protocol, and set
1559socket://the.embosser.IP.address:9100 as Connection URL.
1560
1561The density of dots for images can easily be chosen from the command line, for
1562instance:
1563
1564lp -o "GraphicDotDistance=160" file.png
1565
1566to select 1.6mm dots spacing
1567
1568Troubleshooting: if your embosser starts every document with spurious
1569"TM0,BM0,IM0,OM0" or "TM0,BI0", your embosser is most probably still using an
1570old 10.20 firmware. Please either reflash the embosser with a firmware version
157110.30 or above, or select the 10.20 firmware version in the "index" panel of the
1572cups printer options.
1573
1574----------------------
1575Braille output options
1576----------------------
1577
1578The output can be finely tuned from the standard printing panel, or from the
1579command-line, the following example selects translation tables for French and
1580Greek, with 2.5mm dot spacing and 5mm line spacing. All options can be omitted,
1581the default values are shown here.
1582
1583lp -o "LibLouis=fr-fr-g1 LibLouis2=gr-gr-g1 TextDotDistance=250 LineSpacing=500" file.txt
1584
1585
1586---------------------------------
1587Reworking output before embossing
1588---------------------------------
1589
1590One may want to check and modify the .brf or .ubrl output before sending it to
1591the embosser. This can be achieved by first generating the .brf file:
1592
1593 /usr/sbin/cupsfilter -m application/vnd.cups-brf -p /etc/cups/ppd/yourprinter.ppd yourdocument.txt > ~/test.brf
1594
1595One can choose a ppd file and additionally pass -o options to control the
1596generated output. One can then modify the .brf file with a text editor. One can
1597then emboss it:
1598
1599 lp -o document-format=application/vnd.cups-brf ~/test.brf
1600
1601
1602The same can be achieved for images:
1603
1604 /usr/sbin/cupsfilter -m image/vnd.cups-ubrl -p /etc/cups/ppd/yourprinter.ppd yourimage.png > ~/test.ubrl
1605
1606 lp -o document-format=image/vnd.cups-ubrl ~/test.ubrl
1607
1608
1609---------------
1610BRF file output
1611---------------
1612
1613One can generate BRF files by adding a virtual BRF printer.
1614
1615When creating it in the cups interface, choose the CUPS-BRF local printer,
1616select the Generic maker, and choose the Generic Braille embosser model.
1617
1618Printing to the resulting printer will generate a .brf file in a BRF
1619subdirectory of the home directory.
1620
1621
1622----------------
1623UBRL file output
1624----------------
1625
1626One can generate Unicode braille files, not useful for embossing, but which can
1627be easily looked at by sighted people to check for the output.
1628
1629In the cups interface, create a printer with the CUPS-BRF local printer,
1630the Generic maker, and choose the Generic UBRL generator model.
1631
1632Printing to the resulting printer will generate a .brf file in a BRF
1633subdirectory of the home directory.
1634
1635
1636----------------------------
1637Remark about the source code
1638----------------------------
1639
1640The file filter/braille/drivers/index/ubrlto4dot.c is used to generate
1641the translation table in
1642filter/braille/drivers/index/imageubrltoindexv[34]. It is included as
1643"source code" for these two files, even if actually running the
1644generation in the Makefile is more tedious than really useful.
1645
1646
1647----
1648TODO
1649----
1650
1651- Test whether one wants to negate, e.g. to emboss as few dots as possible
1652- textubrltoindex when liblouis tools will be able to emit 8dot braille
1653
1654