web-dev-qa-db-fra.com

Itext PDF ne s'affiche pas correctement Police Unicode du Myanmar

Itext 5 ne s'affiche pas correctement dans le fichier pdf généré pour polices Unicode du Myanmar .

Version Itext : 5.5.13.1

Résultat attendu : သီဟိုဠ် မှ ဉာဏ် ကြီး ရှင် သည် အာယု ဝဎ္ ဍ န ဆေး ညွှန်း စာ ကို ဇလွန် ဈေး ဘေး ဗာ ဒံ ပင် ထက် အဓိဋ္ဌာန် လျက် ဂဃနဏ ဖတ် ခဲ့သည်။

Résultat réel :

enter image description here

Google Drive Link pour le PDF généré.

Ma chaîne de test est similaire avec "Le renard brun rapide saute par-dessus le chien paresseux" en anglais. Il contient la plupart des alphabets du Myanmar.

Programme Java que j'ai utilisé pour produire au-dessus du pdf

    String fileName = "sample.pdf";
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        Document doc = new Document();
        PdfWriter writer = PdfWriter.getInstance(doc, baos);
        writer.setCloseStream(false);

        BaseFont unicode = BaseFont.createFont("/fonts/NotoSansMyanmar-Regular.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font myanmarUniCodeFont = new Font(unicode, 11, Font.NORMAL, BaseColor.BLACK);
        Rectangle pageSize = new Rectangle(PageSize.A4);
        doc.setPageSize(pageSize);
        doc.open();
        String textStr = "သီဟိုဠ်မှ ဉာဏ်ကြီးရှင်သည်အာယုဝဎ္ဍနဆေးညွှန်းစာကို ဇလွန်ဈေးဘေးဗာဒံပင်ထက် အဓိဋ္ဌာန်လျက် ဂဃနဏဖတ်ခဲ့သည်။";
        doc.add(new Paragraph(textStr, myanmarUniCodeFont));
        doc.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

    response.setCharacterEncoding(StandardCharsets.UTF_8.name());
    response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Content-Disposition", "inline; filename=" + fileName);
    response.setContentType("application/pdf");
    response.setContentLength(baos.size());
    OutputStream os = response.getOutputStream();
    baos.writeTo(os);
    os.flush();
    os.close();
    baos.close();

Les textes de sortie sont corrects (vous pouvez copier et coller dans un éditeur de texte comme Notepad ++ et voir le résultat) mais affichage incorrect dans le fichier pdf.

Que dois-je faire pour afficher correctement la police Unicode du Myanmar en utilisant itext-pdf-5?

Maintenant, j'utilise une manière sale pour voir les polices lisibles. J'ai converti toutes les chaînes Unicode en "Zawgyi Font" (Ceci est une autre police du Myanmar et nous ne devrions jamais l'utiliser .) et je les ai incorporées au pdf. Ce n'est pas une bonne solution et nous ne pouvons pas promettre que tous les unicodes sont correctement convertis en chaîne de police Zawgyi-One et je ne veux pas convertir les textes Unicode en textes non standard. C'est pourquoi je ne veux pas utiliser de cette façon.

Édité à propos de la police ZawGyi avec Itext

Certains textes ne s'affichent pas non plus correctement avec itext. Par exemple: သိန္နီ၊ ဂွ

5
Cataclysm

J'ai également rencontré le même problème. Mais j'ai utilisé thymeleaf avec iText. J'utilise le package de polices ttf de la langue (pas unicode) et j'utilise le convertisseur pour convertir unicode en ma langue et l'attacher dans le PDF comme une chaîne normale. Cela fonctionne comme un charme. Si vous avoir la possibilité d'utiliser thymeleaf, essayez cette approche.

mettre sous CSS dans la balise de style.

@font-face {
    font-family: 'myfont-family';
    src: url('/fonts/myfont.ttf');
    -fs-pdf-font-embed: embed;
    -fs-pdf-font-encoding: Identity-H;
}

.mylanguage{
    font-family: 'myfontfamily';
}

<p class="mylanguage">your converted font text</p>

Code Java pour générer des pdf.

context.setVariable("myvariable", myvariable);
String html = templateEngine.process("mypdf", context);
html = templateEngine.process("mythymeleaf", context);
String fileName = "myfile.pdf";
PDFEncryption pdfEncryption  = new PDFEncryption();
String password = "0000";
pdfEncryption.setUserPassword(password.getBytes());

ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.setPDFEncryption(pdfEncryption);
renderer.createPDF(outputStream);
outputStream.flush();
outputStream.close();

Voici le lien pour ce tutoriel complet sur cette approche avec un code source fonctionnel. https://medium.com/@natsucoder/create-pdf-in-different-language-fonts-using-spring-boot-thymeleaf-itext-cba7f8612c61

0
Natsu