2013-07-15 25 views
5

Sto tentando di utilizzare caratteri personalizzati nel report jasper. Myanmar3 è il carattere standard di Myanmar. Tutto ok, ma ReportTitle deve essere Myanmar Font con Myanmar3. Google utilizzare anche Myanmar3 per le impostazioni internazionali Myanmar.Codifica caratteri di Jasper Report in PDF

Quando si esporta il report come file html. Può visualizzare il titolo del report, bene. Ma il file esportato PDF non può essere visualizzato in modo errato.

Nel browser.

enter image description here

in PDF

enter image description here

public void report() throws Exception { 
    List<SalesReport> saleReports = salesReportService.findSalesReport(new SalesReportCriteria()); 
    InputStream inputStream = new FileInputStream("report-template/saleReportTemplate.jrxml"); 
    String outputFilePdf = "D:/temp/BasicReport.pdf"; 
    String outputFileHtml = "D:/temp/BasicReport.html"; 
    Map paramMap = new HashMap(); 
    paramMap.put("ReportTitle", "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038"); 
    paramMap.put("TableDataSource", new JRBeanCollectionDataSource(saleReports)); 
    JasperDesign jasperDesign = JRXmlLoader.load(inputStream); 
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, paramMap, new JRBeanCollectionDataSource(saleReports)); 
    JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilePdf); 
    JasperExportManager.exportReportToHtmlFile(jasperPrint, outputFileHtml); 
} 

saleReportTemplate.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="TableReport" pageWidth="842" pageHeight="595" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="802" 
       leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" isFloatColumnFooter="true" whenResourceMissingType="Empty" uuid="a255c602-4ff1-4db8-ab72-65b5c3ff9bdd"> 

    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <style name="Myanmar3" isDefault="true" fontName="Myanmar3" fontSize="10" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"/> 
    <style name="Table"> 
     <box leftPadding="0"> 
      <pen lineWidth="1.0" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="TableHeader" mode="Opaque" backcolor="#808080"/> 
    <style name="TableFooter" mode="Opaque" backcolor="#C0C0C0"/> 
    <subDataset name="TableData" uuid="41cd3dac-2d22-41b9-9872-8fdb465d0f85"> 
     <field ... for table generation/> 
    </subDataset> 
    <parameter name="TableDataSource" class="net.sf.jasperreports.engine.JRDataSource"/> 
    <parameter name="ReportTitle" class="java.lang.String" isForPrompting="false"/> 
    <title> 
     <band height="153"> 
      <textField isBlankWhenNull="true"> 
       <reportElement uuid="b44cb7c1-f7d5-467c-8982-b95f65dcb849" x="106" y="0" width="573" height="59"/> 
       <textElement textAlignment="Center" verticalAlignment="Middle"> 
        <font size="22" isBold="true" isPdfEmbedded="true"/> 
       </textElement> 
       <textFieldExpression><![CDATA[$P{ReportTitle}]]></textFieldExpression> 
      </textField> 
      <componentElement> 
       -->other tag for table.... 
      </componentElement> 
     </band> 
    </title> 
</jasperReport> 

ho già aggiungo MYANMAR3.TTF di file e configurare in jasperreports-fonts-5.1.0.jar per myanmar3 carattere.

jasperreports_extension.properties

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory 
net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml 
net.sf.jasperreports.extension.simple.font.families.myanmar3=net/sf/jasperreports/fonts/fonts.xml 

font.xml

...other default config. 

<fontFamily name="Myanmar3"> 
    <normal>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</normal> 
    <bold>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</bold> 
    <italic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</italic> 
    <boldItalic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</boldItalic> 
    <pdfEncoding>Identity-H</pdfEncoding> 
    <pdfEmbedded>true</pdfEmbedded> 
</fontFamily> 

Ho testato tante configurazione di riferimento ed esempio. Ma non c'è alcun effetto sul file .

Fatemi sapere, se avete qualche suggerimento e fornire.

+0

Hai controllato il tipo di carattere in generato * PDF *? È davvero * Myanmar3 *? –

+0

@AlexK, Sì bro, controllo le proprietà del PDF. Nella codifica di Font è "Myanmar3". – CycDemo

+0

@AlexK, invierò la schermata breve? – CycDemo

risposta

0

Riesci a sapere che motore di rendering del testo utilizza Jasper-report?

Il carattere "Myanmar3" fa affidamento su susu OpenType Funzioni per generare le sequenze di caratteri corrette. Ad un livello abbastanza alto, un motore di rendering del testo si basa sulle routine di livello low per gestire correttamente il disegno dei glifi all'interno del font. Cioè, al più alto livello, dai il comando di disegnare una determinata stringa di testo. Questa stringa viene scomposta in caratteri separati, che possono quindi essere riordinati o sostituiti con glifi secondo le regole OTF all'interno del carattere. Solo dopo, una stringa corretta di glifi - non più 'caratteri' - viene restituita per essere visualizzata.

Dalla descrizione e dalle schermate sembra che il tuo browser possa funzionare con questo tipo di carattere, ma i report di Jasper non possono. Questo è visibile nel tuo PDF: la tua stringa di input viene decomposta correttamente (o forse lo stai fornendo in forma scomposta) in glifi separati, ma poi i glifi di base non vengono rimpiazzati in glifi composti dal motore di rendering del testo. Da qui i cerchi tratteggiati sotto alcuni dei tuoi personaggi; questi sono solo segnaposti e non sono mai stati pensati per essere disegnati.

Impossibile determinare il punto preciso di guasto. Il carattere "Myanmar3" contiene tutte le informazioni necessarie nei sottotitoli clig e liga e questi due non sono nulla di speciale.Tuttavia, il tag dello script è mymr - forse il motore di rendering del testo non è a conoscenza delle funzionalità specifiche dello script. Un'altra possibilità è che non è in grado di interpretare i codici funzione in quanto sembrano esserci molte complicate stringhe di contesto concatenate.

Non credo che sia possibile modificare manualmente il motore di rendering del testo per Jasper-rapporti? È possibile inoltrare questo problema di livello minimo ai suoi sviluppatori.

3

Questo è un problema di iText (versione testata 5.5.4) e il tipo di carattere ttf, itext non supporta legature, vedi commento

Dal Jasper-report sta usando iText come la sua biblioteca per rendere il pdf c'è niente che puoi fare nella relazione jasper per risolvere questo problema.

codice di esempio utilizzando solo iText renderà stessa uscita come diaspro segnalare

public class FontTest { 

    /** The resulting PDF file. */ 
    public static final String RESULT = "pdf/fontTest.pdf"; 
    /** Test text. */ 
    public static final String TEST = "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038"; 

    public void createPdf(String filename) throws IOException, DocumentException { 
     Document document = new Document(); 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename)); 
     document.open(); 
     BaseFont bf = BaseFont.createFont(
      "lib/myanmar3.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     Font font = new Font(bf, 20); 
     ColumnText column = new ColumnText(writer.getDirectContent()); 
     column.setSimpleColumn(36, 730, 569, 36); 
     column.addElement(new Paragraph(TEST, font)); 
     column.go(); 
     document.close(); 
    } 

    public static void main(String[] args) throws IOException, DocumentException { 
     new FontTest().createPdf(RESULT); 
    } 
} 

Ho inviato un follow-up question in sezione per capire perché itext non può rendere correttamente font.

Questo il commento di @Bruno Lowagie (sviluppatore originale di iText) è

"Il comportamento che si vede è causato dal fatto che iText non supporta legature. È necessario uno dei prossimi , versioni inedite di iText. Rilasceremo versioni beta l'anno prossimo ma solo per i clienti. "

+0

Grazie per la tua spiegazione. – CycDemo

Problemi correlati