Differences between revisions 1 and 14 (spanning 13 versions)
Revision 1 as of 2015-06-10 10:07:23
Size: 9722
Editor: Brian Potkin
Comment: Initial release
Revision 14 as of 2022-02-15 22:06:15
Size: 8393
Editor: Brian Potkin
Comment: rjessie is unsupported. Removing references to it also simplifies the page. Some revision and rewriting. Testing.
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
## page was renamed from ThetexttopdfFilter
## page was renamed from The texttopdf Filter
Line 4: Line 6:
A brief look at getting the most out of the texttopdf filter used with CUPS. Getting the most out of the texttopdf filter used with CUPS on Debian 9 (stretch) and later.
Line 9: Line 11:
<<Anchor(selection)>>
Line 12: Line 15:
on the system. Supported font formats are TrueType (TTF), !OpenType (OTF) and
TrueType
Collection (TTC). The font must be monospaced.
on the system. Supported font formats are [[WikiPedia:TrueType|TrueType]] (TTF), [[WikiPedia:OpenType|OpenType]] (OTF) and [[WikiPedia:TrueType#TrueType_Collection|TrueType Collection]] (TTC). The font should be [[WikiPedia:Monospaced_font|monospaced]].
Line 15: Line 17:
On Debian 8.0.x (Jessie) and 7.0.x (Wheezy) font configuration is taken
care of by fontconfig in conjunction with pdf.utf-8, which is found in
/usr/share/cups/charsets and installed by the cups-filters package. By
default pdf.utf-8 is symlinked to pdf.utf-8.simple, whose essential
content is
Font selection is taken care of within the [[DebianPkg:fontconfig|fontconfig]] framework, documented in [[DebianMan:fonts-conf|fonts-conf]], in conjunction with ''pdf.utf-8'', which is found in ''/usr/share/cups/charsets'' and installed by the [[DebianPkg:cups-filters|cups-filters]] package. By default, ''pdf.utf-8'' is symlinked to ''pdf.utf-8.simple'', whose essential content is
Line 22: Line 20:
  charset utf8
  0000 04FF ltor single FreeMono FreeMono:bold FreeMono:oblique FreeMono:bold:oblique
  0500 05FF rtol single FreeMono
charset utf8
0000 04FF ltor single monospace monospace:bold monospace:oblique monospace:bold:oblique
0500 05FF rtol single monospace
Line 27: Line 25:
Note that the font names are not file names but selectors which enable
fontconfig to choose a monopaced font. The font used for printing will
be !FreeMono if fontconfig finds it on the system but otherwise it will
conduct a search based on the generic font group which Freemono belongs
to. !FreeMono belongs to the monospace group of fonts so fontconfig will
search for other fonts that are registered in this group and use the
first match it finds.
Note that ''monospace'' is a selector that enables fontconfig to choose a monopaced font. fontconfig will search for fonts that are registered in the ''monospace'' group and return what it considers to be the best suitable candidate that is available on the system. This could be [[DebianPkg:fonts-freefont-ttf|FreeMono]] or [[DebianPkg:fonts-dejavu-core|DejaVuSansMono]] or any other monospaced font.
Line 35: Line 27:
=== Jessie and Wheezy Default Text Printing Font === A preference for a particular font can be configured on a [[#system|per-system]] basis by means of a fontconfig configuration file. A user with a font preference is [[#user|also catered for]].
Line 37: Line 29:
Assuming a minimal Debian install (text mode, no desktop or window
manager environment) the following will be the case:
<<Anchor(system)>>
=== Altering the System-wide Default Font for Printing ===
Line 40: Line 32:
On Jessie the cups-filters package pulls in fontconfig-config (via
libfontconfig1) because it depends on it. In its turn fontconfig-config
has the dependency
The cups-filters package hasn't [[DebianBug:735223|any dependency on a specific font package]] but it pulls in [[DebianPkg:fontconfig-config|fontconfig-config]] (via [[DebianPkg:libfontconfig1|libfontconfig1]]) because it depends on it. In its turn fontconfig-config has a dependency beginning
Line 45: Line 35:
  ttf-dejavu-core | ttf-bitstream-vera | fonts-liberation | ttf-freefont fonts-dejavu-core | ttf-bitstream-vera | fonts-liberation | fonts-freefont...
Line 48: Line 38:
and so there is bound to be one monspaced TrueType font (from
ttf-dejavu-core) installed. Because !FreeMono is not there fontconfig
will search and supply texttopdf with !DejaVuSansMono. If you really
wanted !LiberationMono for your printed texts you could pre-empt the
installation of ttf-dejavu-core by installing fonts-liberation before
cups-filters.
This will normally lead to the first in the list being installed. fonts-dejavu-core has a monospaced font. Consequently, there will always be one monospaced font on the system.
Line 55: Line 40:
On Wheezy the fontconfig-config font dependency is different: The preferred way of using a chosen ''textttopdf_font'' would be to create ''/etc/fonts/local.conf'' with the contents

<<Anchor(snippet)>>
{{{
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
 <alias>
   <family>monospace</family>
   <prefer>
     <family>textttopdf_font</family>
   </prefer>
 </alias>
</fontconfig>
}}}

Possibilities for ''textttopdf_font'' are ''Liberation Mono'', ''!FreeMono'', ''Moto Mono'' or ''Inconsolata''.

<<Anchor(user)>>
=== User Control of the Default Printing Font ===

Filters such as texttopdf are always run by the printing system as a non-privileged user, typically ''lp'', with no connection to the user's desktop. This implies that printing via cups-filters is not an option and that a user would have to execute texttopdf under user privileges to gain control of font selection.

The conversion of a text file to a PDF is done with with
Line 58: Line 66:
  ttf-dejavu-core | ttf-bitstream-vera | ttf-freefont | gsfonts-x11 CHARSET=utf-8 /usr/lib/cups/filter/texttopdf 1 1 1 1 1 < <text_file> > out.pdf
Line 61: Line 69:
Also, while the Jessie cups-filters has [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=735223|no font dependency,]]
the package for Wheezy has a Depends: line with
''CHARSET=utf-8'' tells the filter to consult [[#selection|/usr/share/cups/charsets/pdf.utf-8]], where it will find the request for a ''monospace'' font.

fontconfig will now be capable of using what a user wants from the ''monospace'' selector when the xml snippet [[#snippet|above]] is put into ''$HOME/.config/fontconfig/fonts.conf''. The user's ''fonts.conf'' will take precedence over the system's ''/etc/fonts/local.conf'' because texttopdf is being run by an ordinary user.

The two-step production of a PDF and sending it to the printing system can be automated with [[CUPSTea4CUPS#Text to PDF with a Selected Font|Tea4CUPS]]

<<Anchor(freemono)>>
=== The Case for FreeMono ===

The choice of a font for printing text files may very well be based on the look of the font. This is a reasonable criterion. However, there are other factors such as the range of [[WikiPedia:Glyphs|glyphs]] in the font and, by implication, the language(s) used in the text.

[[http://www.gnu.org/software/freefont/|GNU FreeMono]] has veryfont good coverage of glyphs and caters for characters from many [[WikiPedia:Unicode_blocks|Unicode blocks]]. It can be compared with other monospaced fonts by altering the [[#system| the system]] or [[#user|user-chosen]] font and producing and viewing a PDF of
[[http://www.cl.cam.ac.uk/~mgk25/ucs/examples/|UTF-8-demo.txt]] using (respectively) [[ThecupsfilterUtility|cupsfilter]] or texttopdf:

 * Produce a PDF with
{{{
/usr/sbin/cupsfilter UTF-8-demo.txt > out.pdf
CHARSET=utf-8 /usr/lib/cups/filter/texttopdf 1 1 1 1 1 UTF-8-demo.txt > out.pdf
}}}

 * Check the font used with
{{{
pdffonts out.pdf
}}}

 * View the PDF with
{{{
your_favourite_pdf_viewer out.pdf
}}}

<<Anchor(pdfs)>>
=== Using texttpdf to Produce PDFs ===

The primary purpose of [[PrintingGlossaryandIndex#cupsfilters|cups-filters]] is to process files (in conjunction with [[PrintingGlossaryandIndex#cups|CUPS]]) to produce an end product of toner or ink being put on a medium such as paper. However, it didn't take long for people to realise the CUPS+cupsfilters combination gave a way of capturing a PDF file without sending it to a printer. This opens up a way of archiving text files and scripting batch production of PDFs from them using something that is probably on the system already.

Either of the two commands [[#freemono|given previously]] may be used to produce a PDF. An issue that may arise is that the PDFs do not have searchable or extractable test. This is a consequence of the design of the texttopdf filter. If it matters, the situation may be rectified with some post-processing.

 * With the [[#system|system]] text font:
Line 65: Line 109:
  ttf-freefont | fonts-liberation | ttf-dejavu /usr/sbin/cupsfilter <input.txt> | pdftocairo -pdf - out.pdf
Line 68: Line 112:
This means that ttf-freefont will be installed to satisfy both
fontconfig-config and cups-filters and again texttopdf will have the use
of a monospaced font because fontconfig will search and find !FreeMono.
To have !DejaVuSansMono as the default font for printing the pre-emption
would be done with ttf-dejavu.

=== Altering the System-wide Default Font for Printing ===

As pdf.utf-8.simple is written in Jessie and Wheezy fontconfig will always select !FreeMono if this font is installed and only fall back to !DejaVuSansMono or !LiberationMono if it is not available. One of these must then be on the system to satisfy dependencies.

The previous section indicates one way of not using !FreeMono but
this is on a rather basic system. As the system develops !FreeMono may
become a requirement for other packages, such as vlc. So the question
becomes: how can we have !FreeMono but not use it for printing text files?

One way is to create the file pdf.utf-8.defaultfont and have pdf.utf-8
link to it.
 * With a [[#user|user's]] text font:
Line 87: Line 115:
  charset utf8
  0000 04FF ltor single defaultfont defaultfont:bold defaultfont:oblique defaultfont:bold:oblique
CHARSET=utf-8 /usr/lib/cups/filter/texttopdf 1 1 1 1 1 <input.txt> | pdftocairo -pdf - out.pdf
Line 91: Line 118:
fontconfig will search first for defaultfont. Depending on the font, some
adjustment may be needed to the typefaces used.
You may want to look at the [[CUPSTea4CUPS|Tea4CUPS page]] for ideas on creating a searchable PDF with chosen embedded fonts as part of the printing system workflow.
Line 94: Line 120:
A second method is not to use fontconfig but specify exactly what font
file to load in pdf.utf-8.defaultfont. For example, with the
fonts-linuxlibertine package:
=== Text Orientation ===
Line 98: Line 122:
  charset utf8
  0000 04FF ltor single /usr/share/fonts/opentype/linux-libertine/LinLibertine_M.otf

A third approach is to follow the proposal [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=788048|here]] and alter pdf.utf-8.simple to
texttopdf handles a text file such as ''/etc/services'' by producing a [[pdftopdfandPageRotation#portrait|PDF portrait page]] with the text parallel to the short edge. If either ''landscape'' or ''orientation-requested=4'' is given as an option to texttopdf, the PDF is a [[pdftopdfandPageRotation#portrait|landscape page]] and the text is placed parallel to the long edge. The second PDF is [[pdftopdfandPageRotation#autorotate|processed by pdftopdf]] to print correctly.
Line 104: Line 125:
  0000 04FF ltor single monospace monospace:bold monospace:oblique monospace:bold:oblique
  0500 05FF rtol single monospace

lp -d <queue> /etc/services lp -d <queue> -o landscape /etc/services
     +------------+ +----------------------+
     |AAAAAAAAAAAA| |BBBBBBBBBBBBBBBBBBBBBB|
     | | | |
     | | | |
     | | +----------------------+
     | |
     | |
     +------------+
Line 107: Line 136:

Then create /etc/fonts/local.conf with the contents

{{{
  <?xml version='1.0'?>
  <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
  <fontconfig>
   <alias>
     <family>monospace</family>
     <prefer>
       <family>textttopdf_font</family>
     </prefer>
   </alias>
  </fontconfig>
}}}

to have a chosen font for printing.

=== User Control of the Default Printing Font ===

If the print job is being sent to a local CUPS server it is possible to
select the font used by putting the previous xml snippet in
~/.config/fontconfig/fonts.conf. This works whether or not root access
to the server is available.

When the job is sent to a remote server the processing by texttopdf takes place there, so local font configuration in principle has no bearing on what font is used for printing. However, control of the font used can be gained with a
technique involving Tea4cups. [LINK TO BE DONE]

=== The Case for FreeMono ===

The choice of a font for printing text files may very well be based on
the look of the font. This is a reasonable criterion. However, there are
other factors such as the range of glyphs in the font and, by
implication, the language(s) used in the text.

[[http://www.gnu.org/software/freefont/|GNU FreeMono]] has very good coverage of glyphs and caters for characters from many Unicode blocks. It may
be compared with other monospaced fonts by producing and viewing a PDF of the
[[http://www.cl.cam.ac.uk/~mgk25/ucs/examples/|UTF-8-demo.txt]] using [[The cupsfilter Utility|cupsfilter.]]

=== A Difference Between TrueType and OpenType Fonts When Printing ===

Install fonts-freefont-ttf and print to file as described in [[The cupsfilter Utility|here.]]

{{{
  /usr/sbin/cupsfilter /etc/services > services.pdf
}}}

Find the size of services.pdf and the fonts it uses.

{{{
brian@jessie:~$ ls -l services.pdf
-rw-r--r-- 1 brian brian 239047 Jun 9 16:35 services.pdf
brian@jessie:~$ pdffonts services.pdf
name type encoding emb sub uni object ID
--------------- ------------ ---------- ---------------------
SHXZNP+FreeMono CID TrueType Identity-H yes yes no 41 0
}}}

Remove fonts-freefont-ttf, replace it with fonts-freefont-otf and
repeat.

{{{
brian@jessie:~$ ls -l services.pdf
-rw-r--r-- 1 brian brian 755004 Jun 9 16:23 services.pdf
brian@jessie:~$ pdffonts services.pdf
name type encoding emb sub uni object ID
----------------------- ----------- ---------- ---------------------
FreeMonoBold-Identity-H CID Type 0C Identity-H yes no no 40 0
FreeMono-Identity-H CID Type 0C Identity-H yes no no 45 0
}}}

The second file has the fonts embedded but not subset, In other words,
the complete font has been included in the file produced by texttopdf.
This results in a much larger file to be sent to the printer and it
might result in a longer printing time. This is not necessarily a
problem but it is as well to be aware that using OTF is [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=663192|not yet equivalent]] to using TTF as the monospaced font.

=== Using texttpdf to Produce PDFs ===

The primary purpose of cups-filters is to process files (often in
conjunction with CUPS) to produce an end product of toner or ink being put on a medium such as paper. However, it didn't take long for people to realise the CUPS+cupsfilters combination gave a way of capturing a PDF file without sending it to a printer. This opens up a way of archiving of files and
scripting batch production of PDFs from them using something which is
probably on the system already.

The command to use has been given earlier. Please look again at
both pdffonts outputs in that section and note that uni is "no". This means there is no !ToUnicode map in the PDF file and this in turn implies the text in the PDF is not searchable or capable of being copied. If this does not
matter to you you have a decent method to produce a PDF from a text
file.

If it does matter there is

{{{
   /usr/lib/cups/filter/texttopdf 1 2 3 4 5 input.txt > out.pdf
}}}

out.pdf is searchable but not copyable. If you use pdffonts it can be seen there are no fonts embedded in it, so printing it would have to rely on whatever
fonts the printer provides. It should be viewable on any machine because
the font is courier.

For creating a searchable PDF with chosen embedded fonts you will have
look elsewhere. The Tea4cups page [LINK TO COME] has a suggestion to make on this topic.
Line 212: Line 140:
<<MailTo(smilingthax@googlemail.com,Tobias Hoffman)>> under the auspices of the [[https://wiki.linuxfoundation.org/en/OpenPrinting|OpenPrinting]] group. Significant work has been done in [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=662660| bug #662660]] and [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=663070|bug #663070]] by <<MailTo(fabian@debian.org,Fabian Greffrath)>> to integrate the use of fontconfig into the filter. <<MailTo(smilingthax SPAMFREE AT googlemail DOT com,Tobias Hoffmann)>> under the auspices of the [[https://wiki.linuxfoundation.org/en/OpenPrinting|OpenPrinting]] group. Significant work has been done in [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=662660| bug #662660]] and [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=663070|bug #663070]] by <<MailTo(fabian SPAMFREE AT debian DOT org,Fabian Greffrath)>> to integrate the use of fontconfig into the filter.
Line 214: Line 142:
=== See Also ===
 * [[Printing|The Debian Printing Portal]]
Line 234: Line 163:
## If this page belongs to an existing Category, add it below.
## CategorySomething | CategoryAnother

CategoryPrinter

Translation(s): none


Getting the most out of the texttopdf filter used with CUPS on Debian 9 (stretch) and later.

Font Selection and fontconfig

Printing a text file requires at least one suitable font to be available on the system. Supported font formats are TrueType (TTF), OpenType (OTF) and TrueType Collection (TTC). The font should be monospaced.

Font selection is taken care of within the fontconfig framework, documented in fonts-conf, in conjunction with pdf.utf-8, which is found in /usr/share/cups/charsets and installed by the cups-filters package. By default, pdf.utf-8 is symlinked to pdf.utf-8.simple, whose essential content is

charset utf8
0000 04FF ltor single monospace monospace:bold monospace:oblique monospace:bold:oblique
0500 05FF rtol single monospace

Note that monospace is a selector that enables fontconfig to choose a monopaced font. fontconfig will search for fonts that are registered in the monospace group and return what it considers to be the best suitable candidate that is available on the system. This could be FreeMono or DejaVuSansMono or any other monospaced font.

A preference for a particular font can be configured on a per-system basis by means of a fontconfig configuration file. A user with a font preference is also catered for.

Altering the System-wide Default Font for Printing

The cups-filters package hasn't any dependency on a specific font package but it pulls in fontconfig-config (via libfontconfig1) because it depends on it. In its turn fontconfig-config has a dependency beginning

fonts-dejavu-core | ttf-bitstream-vera | fonts-liberation | fonts-freefont...

This will normally lead to the first in the list being installed. fonts-dejavu-core has a monospaced font. Consequently, there will always be one monospaced font on the system.

The preferred way of using a chosen textttopdf_font would be to create /etc/fonts/local.conf with the contents

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
 <alias>
   <family>monospace</family>
   <prefer>
     <family>textttopdf_font</family>
   </prefer>
 </alias>
</fontconfig>

Possibilities for textttopdf_font are Liberation Mono, FreeMono, Moto Mono or Inconsolata.

User Control of the Default Printing Font

Filters such as texttopdf are always run by the printing system as a non-privileged user, typically lp, with no connection to the user's desktop. This implies that printing via cups-filters is not an option and that a user would have to execute texttopdf under user privileges to gain control of font selection.

The conversion of a text file to a PDF is done with with

CHARSET=utf-8 /usr/lib/cups/filter/texttopdf 1 1 1 1 1 < <text_file> > out.pdf

CHARSET=utf-8 tells the filter to consult /usr/share/cups/charsets/pdf.utf-8, where it will find the request for a monospace font.

fontconfig will now be capable of using what a user wants from the monospace selector when the xml snippet above is put into $HOME/.config/fontconfig/fonts.conf. The user's fonts.conf will take precedence over the system's /etc/fonts/local.conf because texttopdf is being run by an ordinary user.

The two-step production of a PDF and sending it to the printing system can be automated with Tea4CUPS

The Case for FreeMono

The choice of a font for printing text files may very well be based on the look of the font. This is a reasonable criterion. However, there are other factors such as the range of glyphs in the font and, by implication, the language(s) used in the text.

GNU FreeMono has veryfont good coverage of glyphs and caters for characters from many Unicode blocks. It can be compared with other monospaced fonts by altering the the system or user-chosen font and producing and viewing a PDF of UTF-8-demo.txt using (respectively) cupsfilter or texttopdf:

  • Produce a PDF with

/usr/sbin/cupsfilter UTF-8-demo.txt > out.pdf
CHARSET=utf-8 /usr/lib/cups/filter/texttopdf 1 1 1 1 1 UTF-8-demo.txt > out.pdf
  • Check the font used with

pdffonts out.pdf
  • View the PDF with

your_favourite_pdf_viewer out.pdf

Using texttpdf to Produce PDFs

The primary purpose of cups-filters is to process files (in conjunction with CUPS) to produce an end product of toner or ink being put on a medium such as paper. However, it didn't take long for people to realise the CUPS+cupsfilters combination gave a way of capturing a PDF file without sending it to a printer. This opens up a way of archiving text files and scripting batch production of PDFs from them using something that is probably on the system already.

Either of the two commands given previously may be used to produce a PDF. An issue that may arise is that the PDFs do not have searchable or extractable test. This is a consequence of the design of the texttopdf filter. If it matters, the situation may be rectified with some post-processing.

/usr/sbin/cupsfilter <input.txt> | pdftocairo -pdf - out.pdf

CHARSET=utf-8 /usr/lib/cups/filter/texttopdf 1 1 1 1 1 <input.txt> | pdftocairo -pdf - out.pdf

You may want to look at the Tea4CUPS page for ideas on creating a searchable PDF with chosen embedded fonts as part of the printing system workflow.

Text Orientation

texttopdf handles a text file such as /etc/services by producing a PDF portrait page with the text parallel to the short edge. If either landscape or orientation-requested=4 is given as an option to texttopdf, the PDF is a landscape page and the text is placed parallel to the long edge. The second PDF is processed by pdftopdf to print correctly.

lp -d <queue> /etc/services      lp -d <queue> -o landscape /etc/services
     +------------+                      +----------------------+
     |AAAAAAAAAAAA|                      |BBBBBBBBBBBBBBBBBBBBBB|
     |            |                      |                      |
     |            |                      |                      |
     |            |                      +----------------------+  
     |            |
     |            |
     +------------+ 

Credits

The texttopdf filter is based on CUPS' texttops filter and written by Tobias Hoffmann <smilingthax SPAMFREE AT googlemail DOT com> under the auspices of the OpenPrinting group. Significant work has been done in bug #662660 and bug #663070 by Fabian Greffrath <fabian SPAMFREE AT debian DOT org> to integrate the use of fontconfig into the filter.

See Also


CategoryPrinter