 |
|
| |
PDF::Builder::FontManager(3) |
User Contributed Perl Documentation |
PDF::Builder::FontManager(3) |
PDF::Builder::FontManager - Managing the font library for
PDF::Builder
These routines are called from the PDF::Builder class (see
get_font(), add_font()
methods).
# core fonts come pre-loaded
# Add new a new font face and variants
my $rc = $pdf->add_font(
'face' => $unique_face_name, # font family, e.g., Times
'type' => 'core', # note that core fonts preloaded
'style' => 'serif', # also sans-serif, script (cursive),
# and symbol
'width' => 'proportional', # also constant
'settings' => { 'encode' => $encoding },
# note that these are actual core font names rather than file paths
'file' => { 'roman' => 'Times-Roman',
'italic' => 'Times-Italic',
'bold' => 'Times-Bold',
'bold-italic' => 'Times-BoldItalic' },
# for non-core these would be the actual file paths
# prefixed with font search paths
);
$rc = $pdf->add_font(
'face' => 'DejaVuSans', # Deja Vu sans serif family
'type' => 'ttf', # otf uses 'ttf'
'style' => 'sans-serif',
'width' => 'proportional',
'settings' => { 'encode' => 'utf8' },
# the defined font paths will be prepended to find the actual path
'file' => { 'roman' => 'DejaVuSans.ttf',
'italic' => 'DejaVuSans-Oblique.ttf',
'bold' => 'DejaVuSans-Bold.ttf',
'bold-italic' => 'DejaVuSans-BoldOblique.ttf' }
);
Some of the global data, which can be reset via the
font_settings() method:
* default-face: initialized to Times-Roman (core), used if you start
formatting text without explicitly setting a face
* default-serif: initialized to Times-Roman (core), used if you want
a "generic" serif typeface
* default-sansserif: initialized to Helvetica (core), used if you want
a "generic" sans-serif typeface
* default-constant: initialized to Courier (core), used if you want
a "generic" constant-width typeface
* default-script: NOT initialized (no default), used if you want
a "generic" script (cursive) typeface
* default-symbol initialized to Symbol (core), used if you want
a "generic" symbol typeface
* font-paths: C:/Windows/Fonts for Windows systems for TTF, other types
are in non-standard paths, and for non-Windows, anything goes
Usage of get_font() is to specify the face
and variants, and then each time, specify italic and bold to
be on or off. If the desired file is not yet opened, it will be, and the
$font returned. If the font was already created
earlier, the saved $font will be returned.
my $font = $pdf->get_font(
'face' => 'Times',
'italic' => 0, # desire Roman (upright)
'bold' => 0, # desire medium weight
);
# if $font is undef, we have a problem...
$text->font($font, $font_size);
$text->... # use this font (medium weight Times-Roman core font)
$font = $pdf->get_font('italic' => 1);
$text->... # switched to italic
$font = $pdf->get_font('italic' => 0);
$text->... # back to Roman (upright) text
PDF::Builder::FontManager->new(%opts)
This is called from Builder.pm's
new(). Currently there are no options selectable. It
will set up the font manager system and preload it with the core fonts.
Various defaults will be set for the face (core Times-Roman), serif face (core
Times-Roman), sans-serif face (core Helvetica), constant width (fixed pitch)
face (core Courier), and a symbol font (core Symbol). There is no default for
a script (cursive) font unless you set one using the
font_settings() method.
@list = $pdf->font_settings() # Get
$pdf->font_settings(%info) # Set
Get or set some information about fonts, particularly the
fonts to be used for "generic" purposes.
"Get" returns a list (array) of the default font face
name, the default generic serif face, the default generic sans-serif face,
the default generic constant width face, the default generic symbol face,
and the default generic script (cursive) face. It is possible for an element
to be undefined (e.g., the generic script face is
"undef").
"Set" changes one or more default settings:
'font' => face to use for the default font face (initialized to Times)
'serif' => face to use for the generic serif face (initialized to Times)
'sans-serif' => face to use for the generic sans serif face
(initialized to Helvetica)
'constant' => face to use for the generic constant width face
(initialized to Courier)
'script' => face to use for the generic script face (uninitialized)
'symbol' => face to use for the generic symbol face
(initialized to Symbol)
$rc = $pdf->add_font_path("a directory path", %opts)
This method adds one search path to the list of paths to
search. In the get_font() method, each defined search
path will be prepended to the "file" entry
(except for core fonts) in turn, until the font file is found. However, if the
"file" entry starts with / or ./ or ../, it
will be used alone. A "file" entry starting
with .../ is a special case, which is turned into ../ before the search path
is prepended. This permits you to give a search path that you expect to move
up one or more directories.
The font path search list always includes the current directory
(.), and is initialized in "Builder.pm" as
@font_path. For the Windows operating system,
"/Windows/Fonts" usually contains a number
of TTF fonts that come standard with Windows, so it is added by default.
Anything else, including all Linux (and other non-Windows operating
systems), will have to be added depending on your particular system. Some
common places are:
Windows (NOTE: use / and not \\ in Windows paths!). Linux
systems may or may not handle spaces in directory names gracefully!
/Windows/Fonts
/WinNT/Fonts
/Program Files/MikTex 2.9/fonts/type1/urw/bookman (URW Bookman for MikTex)
/Program Files (x86)/MikTex 2.9/fonts/type1/urw/bookman (older versions)
/Program Files/Adobe/Acrobat DC/Resource/CIDFont (Adobe Reader fonts)
GhostScript may have its own directories
Note that directory names with spaces (e.g.,
"/Program Files") may not play nice with
some Linux systems, so they are not included by default.
Linux, etc.
/usr/share/fonts (common base)
/usr/local/share/fonts (common base)
/usr/share/fonts/dejavu-sans-fonts (Deja Vu Sans TTF specifically)
/usr/share/fonts/truetype/ttf-dejavu
/usr/share/fonts/truetype/dejavu
/usr/lib/defoma/gs.d/devs/fonts (GhostScript?)
/usr/share/fonts/type1/gsfonts (GhostScript PS)
/usr/share/X11/fonts/urw-fonts (URW PS)
Third-party application installations, such as Adobe's Acrobat
Reader, may be a source of installed fonts, too.
A return code of 0 means the path was successfully added, while 1
means there was a problem encountered (and a message was issued).
No options are currently defined.
$rc = add_font(%info)
Add a new font entry (by face and variants) to the Font
Manager's list of known fonts.
%info items to be defined:
- face => 'face
name'
- This should be a unique string to identify just one entry in the Font
Manager fonts table. I.e., you should not have two "Times" (one
a core font and the other a TTF font). Give them different names (face
names are case sensitive, so 'Times' is different from 'times').
The "face" name is used to retrieve the
desired font.
- type => 'type
string'
- This tells which Builder font routine to use to load the font. The allowed
entries are:
- core
- This is a core font, and is loaded via the
CoreFont() routine. Note that the core fonts are
automatically pre-loaded (including additional ones on Windows systems),
so you should not need to explicitly load any core fonts (at least, the 14
basic ones). All PDF installation are supposed to include these 14 basic
core fonts, but the precise actual file type may vary among installations,
and substitutions may be made (so long as the metrics match). Currently,
core fonts are limited to single byte encodings.
On Windows systems, there are an additional 14 core fonts
which are normally loaded. These are Georgia, Verdana, Trebuchet,
Wingdings, and Webdings faces. Use caution if making use of these
additional core fonts, as non-Windows systems may not include them
without explicit manual installation of these fonts. These fonts may be
safe to use if you know that all your PDF readers will be running on
Windows systems.
- ttf
- This is a TrueType (.ttf) or OpenType (.otf) font, loaded with
ttfont(). Currently this is the only type which
can be used with multibyte (e.g., utf8) encodings, as well as with
single byte encodings such as Latin-1. It is also the only font
type that can be used with HarfBuzz::Shaper. Many systems include a number
of TTF fonts, but unlike core fonts, none are automatically loaded by the
PDF::Builder Font Manager, and must be explicitly loaded via
add_font().
- type1
- This is a PostScript (Type1) font, loaded with
psfont(), which used to be quite commonly used,
but is fairly rarely used today, having mostly been supplanted by the more
capable TTF format. Some systems may include some Type1 fonts, but
Windows, for example, does not normally come with any. No Type1 fonts are
automatically loaded by the PDF::Builder Font Manager, and must be
explicitly loaded via add_font().
It is assumed that the font metrics file (.afm or .pfm) has
the same base file name as the glyph file (.pfa or .pfb), is found in
the same directory, and either can work with either. If you have
need for a different directory, a different base name, or a specific
metrics file to go with a specific glyph file, let us know, so we can
add such functionality. Otherwise, you will need to directly use the
psfont() method in order to specify such
different paths.
- cjk
- This is an East Asian (Chinese-Japanese-Korean) type font, loaded with the
cjkfont() method. Note that CJK fonts have never
been well supported by PDF::Builder, and depend on some fairly old
(obsolete) features and external files (.cmap and .data). We suggest that,
rather than going directly to CJK files, you first try directly using the
(usually) TTF files, in the TTF format. Few systems come with CJK fonts
installed. No CJK fonts are automatically loaded by the PDF::Builder Font
Manager, and must be explicitly loaded via
add_font().
- bdf
- This is an Adobe Bitmap Distribution Format font, loaded with the
bdfont() method, a very old bitmapped format
dating back to the early days of the X11 system. Unlike the filled smooth
outlines used in most modern fonts, BDF's are a coarse grid of on/off
pixels. Please be kind to your readers and use this format sparingly, such
as only for chapter titles or headings! Few systems come with BDF fonts
installed any more. No BDF fonts are automatically loaded by the
PDF::Builder Font Manager, and must be explicitly loaded via
add_font().
- settings => {
'encode' => string, ... }
- This is a collection of any other settings, flags, etc. accepted by this
particular font type. See the POD for
"corefont",
"ttfont", etc. (per type for the
allowable entries. An important one will be the encoding, which you will
need to specify, if you use any characters beyond basic ASCII.
Currently, all fonts may use any single byte encoding you
desire (the default is CP-1252). Only TTF type fonts (which
includes OTF and CJK fonts) may currently specify a multibyte encoding
such as utf8. Needless to say, the text data that you pass to
text routines must conform to the given encoding. You are not
forced to use the same encoding for all defined fonts, but if you wish
to mix-and-match encodings, it is up to you to define your text that
uses the encoding specified for the particular font used!
Note in particular when you use entities that (if
numeric) they are given in the Unicode number. When out of the single
byte range (x00-xFF), results are unpredictable if you give an entity
that does not fall within the encoding's range! Also check results for
Unicode points within the range x80-xFF if you are using utf8
encoding.
- style =>
'styling'
- This specifies the styling of the font: serif, sans-serif,
constant (constant width, or fixed pitch), script (cursive),
or symbol (non-alphabetic). It has no effect on how a font is
loaded or used, but may be useful to you for defining a generic style
font.
- width => 'relative
widths'
- Currently, proportional (variable width) and constant
(constant width) may be specified. It has no effect on how a font is
loaded or used, but may be useful to you for defining a generic style
font.
- file => {anonymous hash of
source files}
- This tells the Font Manager where to find the actual font file. For core
fonts, it is the standard name, rather than a file (and remember, they are
pre-loaded). For all other types, it lists from one to four of the
following variants:
- roman => 'path to
Roman'
- This specifies the "Roman" or "regular" posture
variant of the font. Almost all available fonts include a Roman (normal,
upright posture) variant at normal (medium) weight.
- italic => 'path
to Italic'
- This specifies the "Italic", "slanted", or
"oblique" posture variant of the font. Most available fonts
include an italic variant at normal (medium) weight.
- bold => 'path to
Bold'
- This specifies the "Bold" or "heavy" variant of the
font. Most available fonts include a bold (heavy weight) variant with
normal (Roman) posture.
- bold-italic
=> 'path to BoldItalic'
- This specifies the "Bold" and "Italic" variant
of the font. Many available fonts include a bold (heavy weight) variant
with italic posture.
- symbol => 'path
to Symbol'
- For symbol type fonts (non-alphabetic), rather than risk confusion by
reusing the "roman" term, the "symbol" term is used to
specify what is usually the only variant of a symbol font. It is possible
that there are bold, italic, and even bold-italic variants of a symbol
file, but if so, they are not currently supported.
You can give the entire path of the font's source file, in
an absolute path, if you wish. However, it's usually less typing to use
add_font_path() to specify a list of font
directories to search, and only give the name (and perhaps a subdirectory)
for the path here in add_font().
@current = $pdf->get_font() # Get
$font = $pdf->get_font(%info) # Set
If no parameters are given
( "@current = $pdf->get_font()"), a list
(array) is returned giving the current font setting: face name,
italic flag 0/1, bold flag 0/1, type ('core', 'ttf',
etc.), a hash reference of settings, such as the encoding
('utf8', etc.), style value, width value, and an array reference
(list) of variants (roman, bold, etc.). If no font has yet been explicitly
set, the current font will be the default font.
If at least one parameter is given (%info
hash), the font manager will attempt to discover the appropriate font (from
within the font list), load it if not already done, and return the
$font value. If undef is returned, there was
an error.
%info fields:
- face => face name
string
- This is the font family (face) name loaded up with the core fonts (e.g.,
Times), or by "$pdf->add_font()"
calls. In addition, the current font face or the default
face can be requested, the serif generic serif face, the
sans-serif generic sans-serif face, the constant generic
constant width face, or the script generic script (cursive) face
(if defined) may be requested.
If you give the "face"
entry, the other settings ("italic",
"bold", etc.) are not reset,
unless it is impossible to use the existing setting. If you do
not give the "face" entry, the
current entry will be updated (bold, italic switched on/off,
etc.). You may always explicitly give current to make it clear in
your code that you don't want to change the face.
- italic =>
flag
- This requests use of the italic (slanted, oblique) variant of the font, in
either the current face ("face" not
given in this call) or the new face. The value is 0 or 1 for
"off" (Roman/upright posture) and "on" (italic
posture).
- bold => flag
- This requests use of the bold (heavy weight) variant of the font, in
either the current face ("face" not
given in this call) or the new face. The value is 0 or 1 for
"off" (medium weight) and "on" (heavy weight).
$pdf->dump_font_tables()
Print (to STDOUT) all the Font Manager font information
on hand.
Visit the GSP FreeBSD Man Page Interface. Output converted with ManDoc.
|