Itext PDF ne s'affiche pas correctement Myanmar Unicode Font

voix
44

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

Version Itext : 5.5.13.1

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

Résultat réel

enter

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

Ma chaîne de test est similaire à The quick brown fox jump over the lazy dog en anglais. Elle contient la plupart des alphabets du Myanmar.

Le programme Java que j'ai utilisé pour produire le PDF ci-dessus

    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 en sortie sont corrects (vous pouvez copier et coller dans un éditeur de texte comme Notepad et voir le résultat) mais ne s'affichent pas correctement au format pdf.

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

Maintenant, j'utilise des moyens détestables pour rendre les polices lisibles. J'ai converti toutes les chaînes unicode en Zawgyi Font (c'est une autre police du Myanmar et nous ne devrions jamais l'utiliser.) et je l'ai intégrée dans le pdf. Ce n'est pas une bonne solution et nous ne pouvons pas promettre que toutes les chaînes unicode sont correctement converties en Zawgyi-One Font et je ne veux pas convertir les textes unicode en textes non standard. C'est pourquoi je ne veux pas utiliser cette méthode.

Créé 15/05/2020 à 10:08
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

(Divulgation complète : je travaille pour iText Software)

iText 5 ne prend pas en charge le traitement approprié basé sur Unicode du système d'écriture du Myanmar. Bien que iText 5 ait une implémentation spécifique pour l'arabe, les limites inhérentes à son infrastructure de polices empêchent la prise en charge des caractéristiques des polices qui sont nécessaires pour divers autres systèmes d'écriture.

iText 7 améliore cela avec une nouvelle implémentation de police et un module optionnel (pdfCalligraph, non open source) pour supporter différents systèmes d'écriture. Cependant, le Myanmar n'est pas (encore) pris en charge.

Le code iText 7 correspondant ressemble à ceci :

PdfWriter writer = new PdfWriter(baos);
PdfDocument pdfdoc = new PdfDocument(writer);
Document doc = new Document(pdfdoc);

PdfFont f = PdfFontFactory.createFont("/fonts/NotoSansMyanmar-Regular.ttf",
    PdfEncodings.IDENTITY_H, true);

String textStr =
    "သီဟိုဠ်မှ ဉာဏ်ကြီးရှင်သည်အာယုဝဎ္ဍနဆေးညွှန်းစာကို ဇလွန်ဈေးဘေးဗာဒံပင်ထက် အဓိဋ္ဌာန်လျက် ဂဃနဏဖတ်ခဲ့သည်။";
// Explicit writing system
//doc.add(new Paragraph(textStr).setFont(f).setFontScript(Character.UnicodeScript.MYANMAR));
// Rely on autodetection
doc.add(new Paragraph(textStr).setFont(f));
doc.close();

Que l'on utilise ou non pdfCalligraph, le rendu est toujours erroné :

Wrong Myanmar rendering

Si une licence commerciale est une option pour vous, veuillez soumettre cette demande de fonctionnalité. D'autres systèmes d'écriture sont encore en cours d'ajout. Sinon, je crains que cela ne soit pas possible avec iText et que vous deviez trouver une autre solution.

Créé 25/05/2020 à 23:56
source utilisateur

voix
0

J'ai également été confronté au même problème. Mais j'ai utilisé le thymleaf avec iText. J'utilise le paquet de polices ttf de la langue (pas unicode) et j'utilise le convertisseur pour convertir l'unicode dans ma langue et l'attacher dans le PDF comme une chaîne normale. cela fonctionne à merveille. si vous avez la possibilité d'utiliser thymeleaf, essayez cette approche.

mettez le CSS ci-dessous 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();
Créé 25/05/2020 à 15:04
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more