首页 > 解决方案 > 如何在 PDF 中正确显示 Jasper 报告导出的越南语?

问题描述

我正在使用这些依赖项

implementation ('net.sf.jasperreports:jasperreports:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-fonts:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-functions:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-metadata:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-fonts:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-annotation-processors:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-chart-themes:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-chart-customizers:6.9.0')
implementation ('net.sf.jasperreports:jasperreports-custom-visualization:6.9.0')
compile 'com.lowagie:itext:2.1.7.js5'

Eclipse 2019.6 的 Jasper 报告。越南语字符显示错误

Java 代码

@RequestMapping(value = "/ca_audit/minute_pdf", method = RequestMethod.GET)
public void generatePDFCashAuditMinute() throws JRException {
    JasperReport jasperReport = JasperCompileManager.compileReport("D:/vy/template.jrxml");
    Map<String, Object> parameters = new HashMap<>();
    parameters.put("p1", "Example joint stock company"); // Tên tổ chức
    parameters.put("p2", "EXKK002"); // Số biên bản
    parameters.put("p3", 26); // Ngày
    JRDataSource jrDataSource = new JREmptyDataSource();
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
    JasperExportManager.exportReportToPdfFile(jasperPrint, "D:/foo/out.pdf");
}

文件 *.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="bien_ban_kiem_ke_quy_a4" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="7098c966-5c92-43e3-a729-b3d486fc858b">
    <parameter name="p1" class="java.lang.String"/>
    <parameter name="p2" class="java.lang.String"/>
    <parameter name="p3" class="java.lang.Integer"/>
    <queryString>
        <![CDATA[select 1 as id]]>
    </queryString>
    <field name="id" class="java.lang.Integer"/>
    <title>
        <band height="84" splitType="Stretch">
            <textField>
                <reportElement x="14" y="6" width="100" height="30" uuid="2106c35d-3d5e-4203-950a-54a87b6952ea"/>
                <textElement>
                    <font fontName="Arial"/>
                </textElement>
                <textFieldExpression><![CDATA[$P{p1}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="376" y="23" width="64" height="16" uuid="77d41a67-82d2-46d0-9a3e-5327ae3b450b"/>
                <text><![CDATA[Số biên bản:]]></text>
            </staticText>
            <textField>
                <reportElement x="440" y="23" width="50" height="16" uuid="a505da46-48af-4dcb-84bc-f9d27697919d"/>
                <textFieldExpression><![CDATA[$P{p2}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="260" y="47" width="34" height="13" uuid="541c25ed-4b29-4cc4-a19d-05f295ae0340"/>
                <text><![CDATA[ngày]]></text>
            </staticText>
            <textField>
                <reportElement x="290" y="47" width="40" height="13" uuid="72e64426-d702-4694-bc25-81a2f3e43f82"/>
                <textFieldExpression><![CDATA[$P{p3}]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

jasperreports.properties我在类路径中 创建文件在此处输入图像描述

在 Eclipse IDE 中(带有 Jaspersoft 模块) 在此处输入图像描述

如何解决?

标签: javafontsjasper-reports

解决方案


尝试这个:

  1. 不要为您使用 Arial ttf 创建的字体系列设置 PDF 字体名称。您不想使用 Helvetica,因为它不包含越南语字符的字形。将其留空,以便在 PDF 中使用 Arial ttf。
  2. 将字体系列的 PDF 编码设置为 Identity-H(越南语使用水平书写)。
  3. 屏幕截图显示字体系列称为“times”,因此您必须使用<font fontName="times"/>text 元素。

这将导致 Arial ttf 嵌入 PDF 文件(实际上是它的一个子集)并用于文本。因此,PDF 将显示越南字符,只要 Arial ttf 包含它们的字形(我的 Arial ttf 副本包含)。

如果由于某种原因您不想在 PDF 文件中嵌入 Arial,您还可以使用 net.sf.jasperreports:jasperreports-fonts:6.9.0 中包含的 DejaVu 字体,例如<font fontName="DejaVu Sans"/>

如果您通常想在 PDF 中嵌入字体,您可能还想将该net.sf.jasperreports.default.pdf.encoding属性设置为 ,或者只是不设置它并为每个字体系列指定 PDF 编码。Identity-H


推荐阅读