JasperReports - Unicode

Olá a todos =]

Estou tendo uma duvida relacionada a como adicionar Unicode ao PDF exportado do Jasper. No view do proprio Jasper eu consigo usar unicode, por exemplo “\u2663” no viewer do jasper vira um nipe de ‘paus’, do baralho. Para isto acontecer, editei isto no XML:

<?xml version="1.0" encoding="UTF-8"?>

No codigo onde chamo o Jasper:


parameters.put("teste", "wololo");
                
                // Grava Código de Autenticação
                relatorio.mtGravaCodigoAutenticacaoDocumento(this.getConexaoBD(), aluno, vidaAcademica, (String)parameters.get("codigoAutenticacao"), 3, "-");
                
                // lista contendo 1 elemento, a classe alimentada
                String arqJasper = "report1.jasper";
                if(graduacao) {
                    arqJasper = "report1.jasper";
                }
                String caminho = this.getClass().getResource("").getPath().toString() + "/jasper/" + arqJasper;
                JasperPrint rel = JasperFillManager.fillReport(caminho, parameters, this.getConexaoBD());
                
                HashMap fontes = new HashMap();
                
                
                HashMap fontMap = new HashMap();
                FontKey key = new FontKey("Arial", false, false); 
                PdfFont font = new PdfFont("C:/windows/Fonts/ARIAL.TTF", com.lowagie.text.pdf.BaseFont.IDENTITY_H ,true);                  
                fontMap.put(key,font);     

                //
                ByteArrayOutputStream byteReport = new ByteArrayOutputStream();
                JRPdfExporter exporter = new JRPdfExporter();
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, rel);
                exporter.setParameter(JRPdfExporterParameter.CHARACTER_ENCODING, "UTF-8");
                exporter.setParameter(JRPdfExporterParameter.FONT_MAP, fontMap);
                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, byteReport);
                exporter.exportReport();
                //
                byte[] bytes = byteReport.toByteArray();
                this.getResponse().setContentType("application/pdf");
                this.getResponse().setContentLength(bytes.length);
                ServletOutputStream outputStream = this.getResponse().getOutputStream();
                outputStream.write(bytes, 0, bytes.length);
                outputStream.flush();
                outputStream.close();

O problema que ocorre é o seguinte: No iReport, se eu dou preview, no view do proprio Jasper eu vejo o nipe de paus certinho. Se eu uso em uma parte de uma string, ele fica negrito, possui as tags basicas do html.
Agora, visualizando como PDF, eu consigo ver o resultado das tags HTML, porém o nipe de paus nao.

Se eu executo o relatório via Java ultilizando o codigo acima, eu consigo visualizar o nipe de paus corretamente no PDF, porém as tags HTML nao aparecem, o texto não se formata. Eu precisaria de um modo que o PDF leia tanto as tags HTML basicas como bold, italico, br etc, quanto ler também os /u dos codigos unicode. Alguem sabe uma solução para isto ?

PS: Estou usando Arial, uma fonte WINDOWS para ler o unicode. Gostaria de saber se existe alguma fonte que faça o mesmo e tenha em Linux também.

Obrigado pela atenção, agradeço des de já pela pasciencia.

[]´s Gabriel. 8)

Qual a versão do JasperReports que você está usando?

Você está anexando apenas a “ARIAL.TTF”, esta fonte representa o Arial apenas no formato normal (sem negrito, e sem italico).
Você deve anexar as fontes que você usa, no caso, você precisa do TTF com a fonte Arial Bold.

Essa maneira que você está anexando a fonte no relatório não se usa mais acho que desde as versões 3.5.x.
A maneira correta é criar um jar com todas as fontes que você está utilizando, mapeadas num xml.

Por exemplo, no xml, você criará a “familia” Arial. para esta família Arial, estarão mapeadas 4 TTF diferentes:
Fonte Comum: Arial.ttf
Fonte Negrito: Arial-Bold.ttf
Fonte Itálica: Arial-Italic.ttf
Fonte Negrito e Italica: Arial-Bold-Italic.ttf

(Os nome dos ttf geralmente estao resumidos, exemplo: “arial.ttf”, “arialb.ttf”, “ariali.ttf”, “arialbi.ttf”, coloquei no exemplo acima nomes compridos apenas pra facilitar o entendimento).

Dica: O próprio iReport, no menu de opções, tem um Wizard pra você mapear as fontes, e depois exportar elas pra um jar. Daí basta você colocá-lo no seu classpath.

Não sei ao certo, mas quem sabe o seu problema com o nipe de paus seja resolvido com isso…

Opa, obrigado pela resposta. Eu entendi parcialmente o que devo fazer. Se eu incluir todas estas fontes em um jar de alguma maneira, um no jasper ou um
funcionaria ?

Atualmente, uso o ireport 3.7.4, a iText 2.0.7 e a jar com versão correspondente ao ireport.

Se eu montasse esta jar, eu consigo ‘includar’ estas fontes em linux também ? Pois o ideal seria conseguir ler o unicode e html em tanto unix quanto windows. E eu procurei no ireport tal wizard para incluir fontes e nao achei =(

PS: criei uma familia, adicionando arial unicode para ler os /u, porém nao deu certo, o PDF nao le os codigos unicode. Eu consigo ler o unicode com o codigo dentro do java postado acima, porém ai fico sem ler as tags HTML.

Novamente, obrigado pela resposta. []´s Gabriel Ziden

Sim, se vc tem os ttf, e configurar pro ireport incluir as fontes no pdf, ele fará isso no linux tmb.

O Wizard esta aqui: Ferramentas >> Opções >> iReport >> Fonts

Terá uma lista das familias de fonte que você instalou no iReport. Para instalar mais, clique em Install Font.
Na tela que abrirá, escolha a "ttf" sem bold e sem italico, e avance. Na proxima tela, terão campos pra você adicionar as outras 3 ttf (negrito, italico, negrito/italico).
O PDF Encoding pode deixar como default, e marque a opção "Embed this font in the PDF document".

Instaladas as fontes desejadas, voce pode marcá-las e escolher a opção "Export as extension", isso exportará as familias que voce selecionou para um arquivo jar, com tudo configurado, basta vc colocar no seu classpath.

Dica: Configure os textos do seu relatório apenas com essas familias que você instalou, assim seu relatório ficará igual em qualquer sistema que você gerar (windows/linux/etc), pois você esta usando apenas fontes das quais possui os ttf.

Obrigado denovo Daniel. Eu criei 2 familias de fontes, uma para Arial e uma para Arial Unicode, marquei para ‘embar’ no PDF, mas quando mando criar o JAR ele cria um arquivo que não é um JAR de fato, tanto que quando dou ‘add jar’ no classpath ele nao acha o tal JAR. Mesmo assim, só de adicionar a familia da unicode nas fontes e usa-la no relatório, quando gero o PDF os codigos unicode nao aparecem corretamente =( Alguma ideia cara ?

Novamente, obrigado pela resposta.
[]´s Gabriel

É um jar sim. Acontece que ele não coloca o “.jar” se vc não escreve na hora de salvar o arquivo… É só vc mesmo colocar o .jar

Outra coisa, quando eu preciso colocar tag html em algum texto, eu coloco a propriedade “markup” como “html” ao invés de “styled”…

Se isso nao der certo, começo a ficar sem alternativas… rsrs

Obrigado a atenção cara.
Consegui criar o .jar com a ArialUnicode, e adicionei ela no classpath, embed in PDF marcado, mas quando abro o PDF pelo View os unicodes não aparecem la =( Pela propria visualização do VIEW os unicodes aparecem, porém no PDF ainda nada. =/

Obrigado pela atenção. []´s Gabriel

Ao invés de colocar o unicode, tenta o seguinte, coloca a representação dele em html:

decimal: & # 9827; (tudo junto)
Hexadecimal: & #x2663; (tudo junto)
Nomeado: & clubs; (tudo junto)
Fonte: http://www.fileformat.info/info/unicode/char/2663/index.htm

Qualquer um desses aí…
e muda a propriedade do campo “PDF Encoding” para “Identity-H” (essa propriedade está depreciada, mas foi a única forma que consegui fazer funcionar…)

E coloca o markup em styled ou html.

Acredito que não seja a melhor maneira, pelo pdf encoding estar depreciado, mas enfim… aqui funcionou só assim…
Se descobrir outra maneira, posta aí… =]