I am trying to use custom font in jasper report. Myanmar3 is the standard font of Myanmar.
Everything is ok, but ReportTitle must be Myanmar Font with Myanmar3.
Google also use Myanmar3 for Myanmar locale.
When export the report as html file. It can display report title, well.But, Exported PDF file cannot display incorrectly.
In browser.

In PDF

public void report() throws Exception {
List<SalesReport> saleReports = salesReportService.findSalesReport(new SalesReportCriteria());
InputStream inputStream = new FileInputStream("report-template/saleReportTemplate.jrxml");
String outputFilePdf = "D:/temp/BasicReport.pdf";
String outputFileHtml = "D:/temp/BasicReport.html";
Map paramMap = new HashMap();
paramMap.put("ReportTitle", "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038");
paramMap.put("TableDataSource", new JRBeanCollectionDataSource(saleReports));
JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, paramMap, new JRBeanCollectionDataSource(saleReports));
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilePdf);
JasperExportManager.exportReportToHtmlFile(jasperPrint, outputFileHtml);
}
saleReportTemplate.jrxml
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="TableReport" pageWidth="842" pageHeight="595" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="802"
leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" isFloatColumnFooter="true" whenResourceMissingType="Empty" uuid="a255c602-4ff1-4db8-ab72-65b5c3ff9bdd">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<style name="Myanmar3" isDefault="true" fontName="Myanmar3" fontSize="10" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
<style name="Table">
<box leftPadding="0">
<pen lineWidth="1.0" lineColor="#000000"/>
</box>
</style>
<style name="TableHeader" mode="Opaque" backcolor="#808080"/>
<style name="TableFooter" mode="Opaque" backcolor="#C0C0C0"/>
<subDataset name="TableData" uuid="41cd3dac-2d22-41b9-9872-8fdb465d0f85">
<field ... for table generation/>
</subDataset>
<parameter name="TableDataSource" class="net.sf.jasperreports.engine.JRDataSource"/>
<parameter name="ReportTitle" class="java.lang.String" isForPrompting="false"/>
<title>
<band height="153">
<textField isBlankWhenNull="true">
<reportElement uuid="b44cb7c1-f7d5-467c-8982-b95f65dcb849" x="106" y="0" width="573" height="59"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="22" isBold="true" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{ReportTitle}]]></textFieldExpression>
</textField>
<componentElement>
-->other tag for table....
</componentElement>
</band>
</title>
</jasperReport>
I already add MYANMAR3.TTF file and configure in jasperreports-fonts-5.1.0.jar for myanmar3 font.
jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml
net.sf.jasperreports.extension.simple.font.families.myanmar3=net/sf/jasperreports/fonts/fonts.xml
font.xml
...other default config.
<fontFamily name="Myanmar3">
<normal>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</normal>
<bold>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</bold>
<italic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</italic>
<boldItalic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
I have tested so many configuration, reference and example. But, there is no effect on PDF file.
Let me know, if u have any suggestion and providing.
This is a problem of iText (version tested 5.5.4) and the ttf font, itext doesn't support ligatures, see comment below
Since jasper-reports is using itext as its library to render the pdf there is nothing you can do in jasper report to solve this problem.
Example code using only iText will render same output as jasper report
public class FontTest {
/** The resulting PDF file. */
public static final String RESULT = "pdf/fontTest.pdf";
/** Test text. */
public static final String TEST = "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038";
public void createPdf(String filename) throws IOException, DocumentException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
document.open();
BaseFont bf = BaseFont.createFont(
"lib/myanmar3.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bf, 20);
ColumnText column = new ColumnText(writer.getDirectContent());
column.setSimpleColumn(36, 730, 569, 36);
column.addElement(new Paragraph(TEST, font));
column.go();
document.close();
}
public static void main(String[] args) throws IOException, DocumentException {
new FontTest().createPdf(RESULT);
}
}
I have posted a follow up question in itext section to understand why itext can't render font correctly.
This is the comment of @Bruno Lowagie (Original developer of iText) is
"The behavior you see is caused by the fact that iText doesn't support ligatures. You need one of the next, unreleased versions of iText. We'll release beta versions next year but only to customers."
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With