java - 如何在 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 模块)
如何解决?
解决方案
尝试这个:
- 不要为您使用 Arial ttf 创建的字体系列设置 PDF 字体名称。您不想使用 Helvetica,因为它不包含越南语字符的字形。将其留空,以便在 PDF 中使用 Arial ttf。
- 将字体系列的 PDF 编码设置为 Identity-H(越南语使用水平书写)。
- 屏幕截图显示字体系列称为“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
推荐阅读
- flutter - 在flutter_charts中使用了动画曲线
- php - PHP 7.3.30 扩展未启用
- c++ - 我的程序偶尔会打印输出,尽管它已正确编译?
- c++ - 没有通过用户定义的函数获得相同的输出
- javascript - 在 mac os 版本 10.12 上安装 Watchman 失败
- java - 您如何取消对已保存的代码的注释,该代码已变成评论
- java - Spring Batch 中的自定义项目阅读器
- javascript - 在灯箱打开之前加载灯箱序列中的图像
- javascript - 从url中提取最后一部分
- upwork-api - 在 Upwork 中,有人将我添加到房间中,但在我的消息中不可见