REPORT_CLASS_LOADER and Font Extensions Issue

0

Hi,

 

I am trying to fill a report and export it as a pdf and within the report, I have some elements that use certain fonts, using the "fontName" property, fonts which are not available to my OS. Therefore, I package the font/fonts using iReport to export as a font extension. That font extension is placed in a location which I try to make available to my application using the REPORT_CLASS_LOADER, with a code as follows (FYI, the font is called 'Corbel'):

 

ClassLoader cl = new URLClassLoader( new URL[] {new URL("file:///D:/path/to/Corbel_jar_folder/")} );
param = new HashMap();
param.put(JRParameter.REPORT_CLASS_LOADER, cl);
jasperReport = JasperCompileManager.compileReport("d:/path/to/Report_with_Corbel_font.jrxml");
jasperPrint = JasperFillManager.fillReport(jasperReport, param, new JREmptyDataSource());

 

Then after filling, which seems to go on without errors (no error saying that the font is not available to my JVM), when I export this is a pdf (via JRPdfExporter), the pdf does not show up as using my requested font, i.e. the part of the report, that should use that font, does not use it.

What's even more strange is that, if I place just the .TTF file in the location indicated above as "D:/path/to/Corbel_jar_folder", I get the error with the font not being available to the JVM.

I am using JasperReports 3.7.1 and also the font extension I mentioned earlier has been exported via iReport 3.7.1.

I have been reading all posts I could find on this topic of "fonts" and I have used the code indicated in previous posts. I am attaching the report also, in case it is needed.

 

Any help on this would be greatly appreciated.

 

Best regards,

Andrei

 

 

 

 

 

acostache's picture
Joined: Sep 16 2009 - 5:24am
Last seen: 2 months 3 weeks ago

8 Answers:

0

Hi Andrei,

 

I understood from the attached jrxml that u have used different fonts for each text component. But the pdf font which u have chosed is Helvitica. So if u export the jrml to pdf and view it in acrobat reader the font will be helvitica and not the one specified by u. But u can see the fonts specified by u by viewing the jrxml in reports viewer.

 

Regards,

Indhira P

indhira's picture
Joined: Jun 3 2010 - 12:52am
Last seen: 4 years 2 months ago
0

Thank you for your reply!

Indeed, when I export to pdf, my chosen/specified font ('Corbel') is not rendered on the pdf, when viewing it with, for instance, Acrobat Reader. But, in the internal iReport viewer it shows up ok.

And I am not sure how to make Jasper aware of my extensions, from within my application, other than the ideas I have tried (without success) as REPORT_CLASS_LOADER (and also setting the JRExporterParameter.CLASS_LOADER to a class loader, as was an idea on a previous post) or setting the "net.sf.jasperreports.export.pdf.fontdir.jasper" property to the absolute path of my font extension/resource directory.

Not sure what else to try/do.

 

Regards,
Andrei

acostache's picture
Joined: Sep 16 2009 - 5:24am
Last seen: 2 months 3 weeks ago
0

JasperReports extension jars are resolved from the thread context classloader, and not from REPORT_CLASS_LOADER or JRExporterParameter.CLASS_LOADER.  So what you need to do is Thread.currentThread().setContextClassLoader(cl) (and revert to the original thread classloader when JR is done).

You can also log an enhancement request to consider REPORT_CLASS_LOADER and JRExporterParameter.CLASS_LOADER when looking for extensions.

Regards,

Lucian

lucianc's picture
5281
Joined: Jul 17 2006 - 1:10am
Last seen: 1 month 3 days ago
0

Hi Lucian,

 

Great! Thank you for the reply and the explanation.

I will try that!

 

Regards,

Andrei

acostache's picture
Joined: Sep 16 2009 - 5:24am
Last seen: 2 months 3 weeks ago
0

Lucian,

 

Thank you for the explanation: indeed the context classloaders' switch solved our problem.

 

Best regards,
Andrei

acostache's picture
Joined: Sep 16 2009 - 5:24am
Last seen: 2 months 3 weeks ago
0

Hi Lucian,

I'm currently (re)implementing the font support to our ERP-System and try to use the font-extenion logic as well.

We work in J2EE environment (JBoss) and switching the context-classloader is not a good idea. (and also doesn't work)

As we need individual fonts at server (while filling) and client side (for viewing/printing) I do store the font-extensions as jar-files in database. So I wrote a "FontsClassLoader" ( already some years ago - initially for loading ttf's to PDF-Exporter -> now for font-extension as jar/zip) that loads that font (extension) from database when needed (and caches of course).

But as expected my FontsClassLoader is not used for checking fonts, as the JRFontUtil doesn't use any specific classloader.

As the font's could change at runtime (e.g. when user change/redesign templates) it must be dynamically - so just putting the font (extension) to classpath would cause an server-restart. Also deploying to clients classpath would be difficult - that's why I need the FontsClassLoader.

Is there any workaround to get the font-extension loaded from database instead just from classpath?

(I'm using still 3.7.6)

 

regards from sunny Germany

Christian

 

 

 

CBox's picture
766
Joined: Jul 19 2006 - 5:58pm
Last seen: 2 months 1 week ago
0

Hi CBox,

I'm currently developing a Report Service that receives requests from different systems, compiles, fills and returns the reports in the file format wanted. The service is running fine, compiling all kinds of reports, but the fonts are a problem. I work at a University and some reports serve as certificates, with different lettering and styles, so fonts are unusual and not present in JVM or in the OS.

I tried to export the fonts from iReport 4.5.1 as font-extensions and put them on my classpath, also trying to change the ClassLoader of the Thread as seen in this topic, but it didn't work.

I'd appreciate any help that you can give me and I thank you in advance.

Diogo

diogopaludo's picture
Joined: Apr 25 2012 - 11:11am
Last seen: 3 months 3 weeks ago
0

Hi,

I implemented my own "AfpsDruckFontExtensionRegistry" that implements the ExtensionsRegistry interface and also "AfpsDruckFontExtensionsRegistryFactory" that implements the ExtensionsRegistryFactory interface JasperReports provides.

So these two classes (and some other) helps me to load the fonts dynamically from database at runtime without a server restart.

 

To let the JasperReports enginge know that I use my own FontExtensionRegistry I set a property:

net.sf.jasperreports.extension.registry.factory.fonts=de.ibees.jasperreports.extensions.fonts.AfpsDruckFontExtensionsRegistryFactory

As for performance reason I hold all fonts within a Map<String, InputStream> in my AfpsDruckFontExtensionRegistry to not load the ttf everytime from database when something is printed. (the tffs are sometimes quite big)

The clients lookup to the server cache and loads the fonts if there has been changed any of them (so if one font is deleted/moved/added) so that the server uses my "AfpsDruckFontExtensionRegistry" when filling and the client also use it for viewing/printing.

Works fine for now more than one year. So in detail I don't know how it works exactly but you shoud have a point how to start. :-)

hth

C-Box

 

 


 

CBox's picture
766
Joined: Jul 19 2006 - 5:58pm
Last seen: 2 months 1 week ago
Feedback
randomness