为什么 jasper 生成的报告在 Java 中不显示西里尔文(保加利亚语)?

Why is jasper generated report not showing cyrillic (bulgarian) in Java?

我在 Java 项目中使用 JDK 1.6.0_35,但在恢复属性文件(编码在 ISO8859-1 中)时遇到 java.util.ResourceBundle 问题。

我们被要求出示带有英文标签的发票,但只有一张,必须用保加利亚语书写。问题是它只恢复和显示不是用保加利亚语写的文本。

我试过用两种方式插入文本:

\u0424\u0430\u043A\u0442\u0443\u0440\u0430\r\n\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B

"Фактура\r\nОригинал"

他们都没有工作。我正在谷歌搜索,它似乎应该使用第一种方式工作(虽然不舒服,但它应该工作),但是这样写的文本不会显示在我的 PDF 中(我正在使用 Jasperreports)。

执行 JasperFillManager.fillReport() 时,我的 params 变量包含 "INVOICE=INVOICE/XXXФактураXXX",但打开 PDF 时它只显示 "INVOICE/XXX"。

Java代码:

Object obj = JRLoader.loadObject(new InputStream(someSource));
JasperReport reportMaster = (JasperReport) obj;
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(data);
JasperPrint jasperPrint = JasperFillManager.fillReport(reportMaster, params, ds);
String pathArialFont = "";
String pathArialBFont = "";
String pathArialIFont = "";
String pathArialBIFont = "";
try {
    pathArialFont = Thread.currentThread().getContextClassLoader().getResource("arial.ttf").toURI()
        .toString();


    pathArialBFont = Thread.currentThread().getContextClassLoader().getResource("arialbd.ttf").toURI()
        .toString();


    pathArialIFont = Thread.currentThread().getContextClassLoader().getResource("ariali.ttf").toURI()
        .toString();


    pathArialBIFont = Thread.currentThread().getContextClassLoader().getResource("arialbi.ttf").toURI()
        .toString();
    LOGGER.debug("pathArialBIFont:".concat(pathArialBIFont));

} catch (final URISyntaxException e) {
    LOGGER.error("", e);
}

String arial = "Arial";
HashMap<FontKey, PdfFont> fontMap = new HashMap<FontKey, PdfFont>();
FontKey key1 = new FontKey(arial, false, false);
PdfFont font1 = new PdfFont(pathArialFont, BaseFont.CP1252, true);

FontKey key2 = new FontKey(arial, true, false);
PdfFont font2 = new PdfFont(pathArialBFont, BaseFont.CP1252, true);

FontKey key3 = new FontKey(arial, false, true);
PdfFont font3 = new PdfFont(pathArialIFont, BaseFont.CP1252, true);
FontKey key4 = new FontKey(arial, true, true);
PdfFont font4 = new PdfFont(pathArialBIFont, BaseFont.CP1252, true);

fontMap.put(key1, font1);
fontMap.put(key2, font2);
fontMap.put(key3, font3);
fontMap.put(key4, font4);

JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, informe);
exporter.setParameter(JRExporterParameter.FONT_MAP, fontMap);

reportMaster.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");

exporter.exportReport();

在这里你可以在我的一个调试中看到字符串到达​​ Java 西里尔文代码:

fontsfamily1365159936026.xml:

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <fontFamily name="Arial">
        <normal><![CDATA[fonts/arial.ttf]]></normal>
        <bold><![CDATA[fonts/arialbd.ttf]]></bold>
        <italic><![CDATA[fonts/ariali.ttf]]></italic>
        <boldItalic><![CDATA[fonts/arialbi.ttf]]></boldItalic>
        <pdfEncoding><![CDATA[Cp1252]]></pdfEncoding>
        <pdfEmbedded><![CDATA[false]]></pdfEmbedded>
    </fontFamily>
</fontFamilies>

jasperreports_extension.properties:

net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ireportfamily1365159936026=fontsfamily1365159936026.xml

有什么线索吗?

我终于实现了。我需要在 xml:

中更改这两行
<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
<pdfEmbedded><![CDATA[true]]></pdfEmbedded>

我在 Java 代码中更改了 BaseFont 常量 BaseFont。CP1252 在这些行中:

new PdfFont(pathArialFont, BaseFont.IDENTITY_H, true);

并在我的 ISO8859-1 属性文件中输入文本,如下所示:

label=\u0424\u0430\u043A\u0442\u0443\u0440\u0430\r\n\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B

并且在设计器模式下,我将字段编辑为字体 "Arial Unicode MS" 并使用 Pdf 编码检查 "Pdf embedded" "Identity-H"。