You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-users@xmlgraphics.apache.org by eborisow <eb...@yahoo.com> on 2008/09/05 18:19:24 UTC

Trying to programmatically add fonts

Hi,

I am trying to embed fonts in a program.  I was able to get my fonts to work
when I run fop.bat standalone.  Here were the relevant lines from the config
xml.

<font-base>file:///C:/programs/apache/fop-0.94-bin-jdk1.3/fonts/</font-base>

<!-- not sure if font tags will display on web site -->
<fonts>
        
          <font-triplet name="Verdana" style="normal" weight="normal"/>
        
		
          <font-triplet name="Verdana" style="normal" weight="bold"/>
        
		
          <font-triplet name="Verdana" style="italic" weight="bold"/>
        
</fonts>

Like I said, this one works.  Now, in an application, I am trying to do the
same using the API.


            // Set the Font Base URL
           
fopFactory.setFontBaseURL("file:///C:/programs/apache/fop-0.94-bin-jdk1.3/fonts/");
            
            String font1 = "verdana.xml";
            String font1Url = "verdana.ttf";
            
            String font2 = "verdanab.xml";
            String font2Url = "verdanab.ttf";
            
            String font3 = "verdanaz.xml";
            String font3Url = "verdanaz.ttf";
            
            FontTriplet fontTriplet1 = new FontTriplet("Verdana",
Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
            FontTriplet fontTriplet2 = new FontTriplet("Verdana",
Font.STYLE_NORMAL, Font.WEIGHT_BOLD);
            FontTriplet fontTriplet3 = new FontTriplet("Verdana",
Font.STYLE_ITALIC, Font.WEIGHT_BOLD);
            
            List fontTriplets1 = new ArrayList();
            fontTriplets1.add(fontTriplet1);
            
            List fontTriplets2 = new ArrayList();
            fontTriplets2.add(fontTriplet2);
            
            List fontTriplets3 = new ArrayList();
            fontTriplets3.add(fontTriplet3);
            
            EmbedFontInfo verdanaFontInfo = new EmbedFontInfo(font1, true,
fontTriplets1, font1Url);
            EmbedFontInfo verdanaBoldFontInfo = new EmbedFontInfo(font2,
true, fontTriplets2, font2Url);
            EmbedFontInfo verdanaBoldItalicFontInfo = new
EmbedFontInfo(font3, true, fontTriplets3, font3Url);
            FontCache fontCache = fopFactory.getFontCache();
            fontCache.addFont(verdanaFontInfo);
            fontCache.addFont(verdanaBoldFontInfo);
            fontCache.addFont(verdanaBoldItalicFontInfo);
            fontCache.save();

I test the cache using the following:

            log.debug("Contains verdana font: " +
fontCache.containsFont(verdanaFontInfo));
            log.debug("Verdana font info is: " +
fontCache.getFont("verdana.ttf").toString());
            
            log.debug("Contains verdana-bold font: " +
fontCache.containsFont(verdanaBoldFontInfo));
            log.debug("Verdana-bold font info is: " +
fontCache.getFont("verdanab.ttf").toString());
            
            log.debug("Contains verdana-bold-italic font: " +
fontCache.containsFont(verdanaBoldItalicFontInfo));
            log.debug("Verdana-bold-italic font info is: " +
fontCache.getFont("verdanaz.ttf").toString());

In the log, I get the following:

2008-09-05 12:05:12,014 [main] DEBUG
embedding.ExampleXML2PDF(ExampleXML2PDF.java:153)  - Contains verdana font:
true
2008-09-05 12:05:12,014 [main] DEBUG
embedding.ExampleXML2PDF(ExampleXML2PDF.java:154)  - Verdana font info is:
metrics-url=verdana.xml,embed-url=verdana.ttf, kerning=true,
font-triplet=[Verdana,normal,400], lastModified=-1
2008-09-05 12:05:12,014 [main] DEBUG
embedding.ExampleXML2PDF(ExampleXML2PDF.java:156)  - Contains verdana-bold
font: true
2008-09-05 12:05:12,014 [main] DEBUG
embedding.ExampleXML2PDF(ExampleXML2PDF.java:157)  - Verdana-bold font info
is: metrics-url=verdanab.xml,embed-url=verdanab.ttf, kerning=true,
font-triplet=[Verdana,normal,700], lastModified=-1
2008-09-05 12:05:12,014 [main] DEBUG
embedding.ExampleXML2PDF(ExampleXML2PDF.java:159)  - Contains
verdana-bold-italic font: true
2008-09-05 12:05:12,014 [main] DEBUG
embedding.ExampleXML2PDF(ExampleXML2PDF.java:160)  - Verdana-bold-italic
font info is: metrics-url=verdanaz.xml,embed-url=verdanaz.ttf, kerning=true,
font-triplet=[Verdana,italic,700], lastModified=-1

However, when it actually tries to convert the XML to PDF, I see the
following message in the log:

2008-09-05 12:05:26,905 [main] DEBUG
org.apache.fop.fonts.FontInfo(FontInfo.java:134)  - Font lookup: Verdana
normal 400
2008-09-05 12:05:26,905 [main] WARN 
org.apache.fop.fonts.FontInfo(FontInfo.java:263)  - Font
'Verdana,normal,400' not found. Substituting with 'any,normal,400'.

So, I am obviously doing something wrong.  Can someone see what the problem
is?

Thanks,
Eric
-- 
View this message in context: http://www.nabble.com/Trying-to-programmatically-add-fonts-tp19334713p19334713.html
Sent from the FOP - Users mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-help@xmlgraphics.apache.org


Re: Trying to programmatically add fonts

Posted by Laurent Morel <la...@al6.fr>.
eborisow a écrit :
> Alias John Brown wrote:
>   
>> According to the documentation at 
>> http://xmlgraphics.apache.org/fop/0.95/fonts.html#basics
>>
>> "It is currently not possible to easily configure fonts from Java code."
>>
>> I assume that this means that it is not impossible, but I have no idea
>> how. Hopefully an expert will turn up soon.
>>
>>
>>     
>
> John,
>
> Thanks for the reply.  I have also tried specifying the config file using
> the method in the docs.  Here is what I tried:
>
>             DefaultConfigurationBuilder cfgBuilder = new
> DefaultConfigurationBuilder();
>             Configuration cfg = cfgBuilder.buildFromFile(new File(baseDir,
> "Local\\personal\\durkan\\projects\\fop\\new-font.conf.xml"));
>             fopFactory.setUserConfig(cfg);
>
> This gives me the same result.  The fonts are not available.  So, I am
> probably doing something wrong.
>
> Thanks,
> Eric
>   
So did you manage to specify fonts programmatically ?
I am very interested in this feature because I'd like to embed the fonts 
required
by my software in the jar file.

AFAIK, this is currently not possible directly, because even if I embed the
configuration file and read it with cfgBuilder.build(InputStream), this file
still refers to a font file name that does not exist in the disk files 
hierarchy.
I'd had to copy the fonts files somewhere in a temp dir, then use 
setFontBaseURL()
to specify this dir : I don't like that approach. File copy shouldn't be 
required.

BTW, I want to embed one single OS installed font. Currently I use
<fonts>  <auto-detect/>  </fonts> which works fine, but scans the whole
system fonts directory and that takes time (and probably memory).
Is the only other way to generate a font metric as described here
http://xmlgraphics.apache.org/fop/0.95/fonts.html#register ?

It would be nice if we could refer to a single font file by its name, 
and fop
would generate the font metric at execution time.
Well I could copy the font in a temp dir and still use <auto-detect>,
but I'd like to avoid this copy.

Thanks,

   Laurent Morel



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-help@xmlgraphics.apache.org


Re: Trying to programmatically add fonts

Posted by Frederic W <Fr...@hotmail.com>.
Hi,
fopFactory.setUserConfig(new File(userConfigPath));
works for me !!!

To generate a FOP font metrics file (.xml) and create a UserConfigFile, I
have done what's explained here:
http://www.sagehill.net/docbookxsl/AddFont.html
http://xmlgraphics.apache.org/fop/0.94/fonts.html

I use FOP 0.95beta1
but setUserConfig works only after I have excluded the default dependency
and add one manually.
That's from my pom.xml file : 

<dependency>
  		<groupId>org.apache.xmlgraphics</groupId>
  		<artifactId>fop</artifactId>
  		<version>0.95beta-1</version>
  		<exclusions>
  			<exclusion>
  				<groupId>org.apache.avalon.framework</groupId>
  				<artifactId>avalon-framework-api</artifactId>
  			</exclusion>
  		</exclusions>
  	</dependency>
  	<dependency>
  		<groupId>avalon</groupId>
  		<artifactId>avalon-framework</artifactId>
  		<version>4.1.4</version>
  	</dependency>





eborisow wrote:
> 
> 
> Alias John Brown wrote:
>> 
>> 
>> According to the documentation at 
>> http://xmlgraphics.apache.org/fop/0.95/fonts.html#basics
>> 
>> "It is currently not possible to easily configure fonts from Java code."
>> 
>> I assume that this means that it is not impossible, but I have no idea
>> how. Hopefully an expert will turn up soon.
>> 
>> 
> 
> John,
> 
> Thanks for the reply.  I have also tried specifying the config file using
> the method in the docs.  Here is what I tried:
> 
>             DefaultConfigurationBuilder cfgBuilder = new
> DefaultConfigurationBuilder();
>             Configuration cfg = cfgBuilder.buildFromFile(new File(baseDir,
> "Local\\personal\\durkan\\projects\\fop\\new-font.conf.xml"));
>             fopFactory.setUserConfig(cfg);
> 
> This gives me the same result.  The fonts are not available.  So, I am
> probably doing something wrong.
> 
> Thanks,
> Eric
> 

-- 
View this message in context: http://www.nabble.com/Trying-to-programmatically-add-fonts-tp19334713p19840816.html
Sent from the FOP - Users mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-help@xmlgraphics.apache.org


Re: Trying to programmatically add fonts

Posted by John Brown <jo...@hotmail.com>.
eborisow <eborisow <at> yahoo.com> writes:

> 
> 
> Alias John Brown wrote:
> > 
> > 
> > "It is currently not possible to easily configure fonts from Java code."
> > 

> 
> John,
> 
> Thanks for the reply.  I have also tried specifying the config file using
> the method in the docs.  Here is what I tried:
> 
>             DefaultConfigurationBuilder cfgBuilder = new
> DefaultConfigurationBuilder();
>             Configuration cfg = cfgBuilder.buildFromFile(new File(baseDir,
> "Local\\personal\\durkan\\projects\\fop\\new-font.conf.xml"));
>             fopFactory.setUserConfig(cfg);
> 
> This gives me the same result.  The fonts are not available.  So, I am
> probably doing something wrong.
> 
> Thanks,
> Eric

1) Are you sure that the new config file was found? If you rename it, does
   the program throw an exception, or silently fail and set cfg to NULL?
2) Try using font auto-detection instead of explicitly declaring Verdana:

<renderer mime="application/pdf">
  <filterList>
    <!-- blah blah -->
  </filterList>
  
  <fonts>
    <auto-detect/>
  </fonts>

</renderer>





---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-help@xmlgraphics.apache.org


Re: Trying to programmatically add fonts

Posted by eborisow <eb...@yahoo.com>.

Alias John Brown wrote:
> 
> 
> According to the documentation at 
> http://xmlgraphics.apache.org/fop/0.95/fonts.html#basics
> 
> "It is currently not possible to easily configure fonts from Java code."
> 
> I assume that this means that it is not impossible, but I have no idea
> how. Hopefully an expert will turn up soon.
> 
> 

John,

Thanks for the reply.  I have also tried specifying the config file using
the method in the docs.  Here is what I tried:

            DefaultConfigurationBuilder cfgBuilder = new
DefaultConfigurationBuilder();
            Configuration cfg = cfgBuilder.buildFromFile(new File(baseDir,
"Local\\personal\\durkan\\projects\\fop\\new-font.conf.xml"));
            fopFactory.setUserConfig(cfg);

This gives me the same result.  The fonts are not available.  So, I am
probably doing something wrong.

Thanks,
Eric
-- 
View this message in context: http://www.nabble.com/Trying-to-programmatically-add-fonts-tp19334713p19342339.html
Sent from the FOP - Users mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-help@xmlgraphics.apache.org


Re: Trying to programmatically add fonts

Posted by John Brown <jo...@hotmail.com>.
eborisow <eborisow <at> yahoo.com> writes:

> 
> 
> Hi,
> 
> I am trying to embed fonts in a program.  I was able to get my fonts to work
> when I run fop.bat standalone.  Here were the relevant lines from the config
> xml.
> 

<snip>
Contents of config file
</snip>
 
> Like I said, this one works.  Now, in an application, I am trying to do the
> same using the API.
> 
<snip>
Code to do above programatically
</snip>

<snip>
Contents of log
</snip> 

> So, I am obviously doing something wrong.  Can someone see what the problem
> is?

According to the documentation at 
http://xmlgraphics.apache.org/fop/0.95/fonts.html#basics

"It is currently not possible to easily configure fonts from Java code."

I assume that this means that it is not impossible, but I have no idea
how. Hopefully an expert will turn up soon.

> 
> Thanks,
> Eric





---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-help@xmlgraphics.apache.org