FOP makes me feel
dumb because it is
great.
In a
previous post I already mentioned that FOP's font handling was better than I thought first, so I could have been wrong forcing a custom font naming. As a matter of fact, FOP holds a list of fonts inside the
FontCache
of its
FontFactory
. Novelang instantiates the
FontFactory
so it has full hands on it.
Using a Java debugger, let's look at what a
FontCache
contains.
fontMap = {java.util.HashMap}
[0] = {java.util.HashMap$Entry}
key: java.lang.String
"file:/…/fonts/URWGothicL-BookObli.ttf"
value: org.apache.fop.fonts.CachedFontInfo
lastModified = 1042610200000
metricsFile = {java.lang.String}
"file:/…/.fop-font-metrics-14045 \
.temp/URWGothicL-BookObli.xml"
embedFile = {java.lang.String}
"file:/…/fonts/URWGothicL-BookObli.ttf"
kerning = true
fontTriplets = {java.util.ArrayList}
[0] = {org.apache.fop.fonts.FontTriplet}
name = {java.lang.String}
"URWGothicL-BookObli"
style = {java.lang.String} "normal"
weight = 400
priority = 0
key = {java.lang.String}
"URWGothicL-BookObli,normal,400"
[…]
[…]
failedFontMap = {java.util.HashMap}
Sweet! Here is everything I need:
- Font name.
- Font style, "italic" or "normal".
- Weight. Not just "normal" or "bold" but "light" and "extra-bold".
- Priority for dealing with duplicates
- A list of fonts which could not be read (
failedFontMap
).
The moderately bad news is,
fontMap
and
failedFontMap
are private fields but I see no reason to not use dirty reflexion here.
The example above is biased as it was created from a Novelang-generated font list, so I'll have to investigate a bit more to see how Fop deals with:
- Failed fonts.
- Font name different from font file name.
- Multiple directories (including nested ones).
To sum up, FOP provides all I need to make Novelang code cleaner and bring following enhancements:
- Multiple directories.
- List of failed fonts.
- Warning in case of duplicates.
- Fonts sorted by font name.
- Throw away temporary
.fop-font-metrics
directory.
- Cache of font descriptions handled by FOP itself (this is the meaning of the
lastModified
field in the FontCache
).
- Support more font types. By letting FOP do its job we let its
FontFileFinder
recognize following font files: *.ttf
for True Type, *.pfb
for Type One. The *.otf
suffix also appears and those fonts may be treated as TTF,
No comments:
Post a Comment