Java – character encoding of Jasper Report PDF format

I want to use custom fonts in Jasper reports Myanmar 3 is the standard font in Myanmar

When exporting a report to an HTML file It can display the report title However, the exported PDF file does not display correctly

In the 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">
        <@R_291_2419@ leftPadding="0">
            <pen lineWidth="1.0" lineColor="#000000"/>
        </@R_291_2419@>
    </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 have added myanmar3 Ttf file and in jasperreports-fonts-5.1 0. Jar for myanmar3 font configuration

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 many configurations, references and examples However, it has no effect on PDF files

If you have any suggestions and provide, please let me know

Solution

This is a problem with iText (version test 5.5.4) and TTF fonts. IText does not support ligatures. Please refer to the comments below

Because Jasper reports uses iText as its library to render PDF, this problem cannot be solved in Jasper reports

The sample code using iText only will render the same output as the 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 posted a follow-up question in the iText section to understand why iText does not render fonts correctly

This is a comment from @ Bruno lowagie, the original developer of iText

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>