Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jasper Report Character Encoding in PDF

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.

enter image description here

In PDF

enter image description here

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.

like image 871
Zaw Than oo Avatar asked Oct 22 '22 05:10

Zaw Than oo


1 Answers

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."

like image 113
Petter Friberg Avatar answered Oct 23 '22 22:10

Petter Friberg