2016-09-12 4 views
0

Я использую JDK 1.6.0_35 в Java-проекте, и у меня возникла проблема с java.util.ResourceBundle при восстановлении файла свойств (закодированного в ISO8859-1).Почему отчет, созданный jasper, не показывает кириллицу (болгарский) в Java?

Нам было предложено предъявить счет с английскими надписями, но только один, который должен быть написан на болгарском языке. Проблема в том, что он восстанавливает и отображает только текст, который не написан на болгарском языке.

Я попытался вставить текст двумя способами:

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

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

Ни один из них работал. Я googling, и кажется, что он должен работать с первого взгляда (хотя неудобно, он должен работать), но текст, написанный таким образом, не отображается в моем 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 код на кириллице:

Cyrillic comes correctly into 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

Пробуем кодировку символов UTF-8 –

+3

Вам не хватает [font-extensions] (http://stackoverflow.com/documentation/jasper-reports/5773/font-extensions) ?, см. Также этот http: // stackoverflow. com/questions/34041619/jasper-reports-pdf-doesnt-export-cyrillic-values ​​ –

+0

Я сейчас смотрю – madtyn

ответ

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 

И в режиме конструктора я редактировал поле, шрифт «Arial Unicode MS »и проверили« Pdf embedded »с Pdf-кодированием« Identity-H ».