• Home
Name Date Size #Lines LOC

..--

backend/07-Sep-2024-3,9942,471

banners/07-Sep-2024-3522

charset/07-Sep-2024-7569

cupsfilters/07-Sep-2024-29,75422,387

data/07-Sep-2024-137

drv/07-Sep-2024-6,7486,530

filter/07-Sep-2024-42,80130,842

fontembed/07-Sep-2024-4,4163,519

m4/07-Sep-2024-1,3941,139

mime/07-Sep-2024-464410

ppd/07-Sep-2024-1,9421,814

scripting/07-Sep-2024-1,240827

utils/07-Sep-2024-16,06912,968

.gitignoreD07-Sep-20241.4 KiB9998

AUTHORSD07-Sep-2024606 1514

BUILD.gnD07-Sep-20244.7 KiB157138

COPYINGD07-Sep-202410.9 KiB363313

ChangeLogD07-Sep-20240

INSTALLD07-Sep-20246.7 KiB184133

Makefile.amD07-Sep-202424.2 KiB1,082903

NEWSD07-Sep-2024169.1 KiB3,6943,319

OAT.xmlD07-Sep-202412.3 KiB179125

READMED07-Sep-202462.8 KiB1,6541,226

README.OpenSourceD07-Sep-2024473 1111

README.mdD07-Sep-202462.8 KiB1,6541,226

README_zh.mdD07-Sep-20242.3 KiB4434

autogen.shD07-Sep-20241.6 KiB7863

backport-CVE-2023-24805.patchD07-Sep-20245.1 KiB173161

bundle.jsonD07-Sep-20241 KiB4141

config.hD07-Sep-20242.8 KiB9675

configure.acD07-Sep-202433.1 KiB986892

install-shD07-Sep-20245.3 KiB221136

install.pyD07-Sep-20241.9 KiB6439

libcupsfilters.pc.inD07-Sep-2024391 1310

libfontembed.pc.inD07-Sep-2024308 129

ln-srfD07-Sep-2024855 5033

ohos_pdf_convs.patchD07-Sep-2024476 1311

ohos_pdftoraster.patchD07-Sep-202411.6 KiB297282

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

1[
2    {
3        "Name": "cups-filters",
4        "License": "Apache 2.0 License",
5        "License File": "COPYING",
6        "Version Number": "1.28.17",
7        "Owner": "dongzhengkuan@huawei.com",
8        "Upstream URL": "https://github.com/OpenPrinting/cups-filter/releases/download/1.28.17/cups-filter-1.28.17.tar.gz",
9        "Description": "This project provides backends, filters, and other software that was once part of the core CUPS distribution"
10    }
11]

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

README_zh.md

1# 三方开源软件CUPS-Filters
2## CUPS-Filters简介
3CUPS-Filters是CUPS(Common Unix Printing System)的一部分,它包含了丰富的文件转化过滤器,其中最常用的是“imagetoraster”, 该过滤器可以将图片文件转换为raster文件传给打印机执行打印。
4CUPS-Filters还提供了一些其它功能,例如打印机状态监控和报告等,跟CUPS一样,支持IPP(Internet Printing Protocal)、LPD(Line Printer Daemon Protocol)、AppSocket等打印协议
5
6您也可以通过[CUPS-Filters官网主页](https://github.com/OpenPrinting/cups-filters)了解更多关于CUPS-Filters项目的信息。
7
8## 引入背景简述
9在OpenHarmony系统中,CUPS开源库只支持PostScript、Raster等少见的文件格式打印;为了适配图片和pdf等文件打印,需要引入CUPS-Filters来完善文件转化功能。
10
11## 目录结构
12```
13- backend                           打印机通信后端支持
14- banners                           banner文件
15- charset                           字符相关文件
16- cupsfilters                       cupsfilters库
17- data                              示例文件
18- drv                               示例drv文件
19- filters                           文件转化过滤器文件
20- fontembed                         fontembed数据库
21- m4                                m4文件
22- mime                              文件转化过滤器功能配置文件
23- ppd                               ppd驱动示例文件
24- scripting                         脚本文件
25- README.OpenSource                 项目README.OpenSource文件
26- README.md                         英文说明
27- README_zh.md                      中文说明
28- generate_cupsfilters_convs.py     适配OpenHarmony编译python脚本文件
29```
30
31## 如何使用
32CUPS-Filters无法单独使用,编译出来的imagetoraster等文件转换过滤器需要配合CUPS开源库一起使用;详细使用方式参考[社区CUPS地址](https://gitee.com/openharmony/third_party_cups)
33
34## 相关仓
35[third_party_cups](https://gitee.com/openharmony/third_party_cups)
36
37[print_print_fwk](https://gitee.com/openharmony/print_print_fwk)
38
39## 参与贡献
40[如何贡献](https://gitee.com/openharmony/docs/blob/HEAD/zh-cn/contribute/参与贡献.md)
41
42[Commit message规范](https://gitee.com/openharmony/device_qemu/wikis/Commit%20message%E8%A7%84%E8%8C%83)
43
44