我在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
有任何线索吗?
答案 0 :(得分:0)
我终于实现了它。我需要在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
在设计师模式中,我将字段编辑为字体&#34; Arial Unicode MS&#34;并检查&#34; Pdf嵌入&#34;使用Pdf编码&#34; Identity-H&#34;。