PDF Itext nu afișează corect fontul Unicode Myanmar

voturi
4

Itext 5 nu se afișează corect la fișierul pdf generat pentru fonturile Myanmar Unicode .

Versiunea text: 5.5.13.1

Rezultatul așteptării : သီဟိုဠ် မှ ဉာဏ် ကြီး ရှင် သည် အာယု ဝဎ္ ဍ န ဆေး ညွှန်း စာ ကို ဇလွန် ဈေး ဘေး ဗာ ဂဃနဏ ဖတ် ခဲ့သည် ခဲ့သည်။

Rezultatul actual :

introduceți

Link Google Drive pentru PDF generat.

Șirul meu de testare este similar cu „The quick brown fox jump over the lenes dog” în engleză. Conține majoritatea alfabetelor din Myanmar.

Programul Java pe care l-am folosit mai sus în 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();

Textele Ouput sunt corecte (puteți copia și lipi într-un editor de text precum Notepad și vedeți rezultatul), dar afișarea greșită la fișierul pdf.

Ce ar trebui să fac pentru a afișa fontul Unicode Myanmar corect folosind itext-pdf-5?

Acum folosesc o metodă murdară pentru a vedea citirea fonturilor. Am convertit toate șirurile Unicode în „Font Zawgyi” (acesta este un alt font Myanmar și nu ar trebui să folosim niciodată acest lucru .) Și încorporat în pdf. Aceasta nu este o soluție bună și nu putem promite că toate unicodurile sunt convertite corect în șir de caractere Zawgyi-One și nu vreau să convertesc texte unicode în texte non-standard. De aceea nu vreau să folosesc acest mod.

Întrebat 15/05/2020 la 10:08
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

(Dezvăluire completă: lucrez pentru iText Software.)

iText 5 nu acceptă procesarea corectă bazată pe Unicode a sistemului de scriere Myanmar. Deși iText 5 are o implementare specifică pentru limba arabă, limitările inerente ale infrastructurii sale de fonturi împiedică sprijinul pentru caracteristicile de font care sunt necesare pentru alte sisteme de scriere.

iText 7 îmbunătățește acest lucru cu o nouă implementare a fontului și un modul opțional (pdfCalligraph, nu open source) pentru a susține diferite sisteme de scriere. Cu toate acestea, Myanmar nu este (încă) acceptat.

Codul iText 7 corespunzător arată astfel:

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();

Indiferent dacă este folosit sau nu pdfCalligraph, redarea este greșită:

Redarea greșită a Myanmarului

Dacă o licență comercială este o opțiune pentru dvs., vă rugăm să trimiteți această solicitare de caracteristici. Sisteme de scriere suplimentare sunt încă adăugate activ. Dacă nu, mă tem că acest lucru nu va fi posibil cu iText și va trebui să găsiți o altă soluție.

Publicat 25/05/2020 la 23:56
sursa de către utilizator

voturi
0

M-am confruntat și eu cu aceeași problemă. Dar am folosit timeleaf cu iText. Folosesc pachetul de caractere ttf al limbii (nu unicode) și folosesc convertorul pentru a converti unicodul în limba mea și îl atașez la PDF ca șir normal. funcționează ca un farmec. dacă aveți posibilitatea să utilizați timeleaf, încercați această abordare.

puneți mai jos CSS în interiorul etichetei de stil.

@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>

Cod Java pentru a genera 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();
Publicat 25/05/2020 la 15:04
sursa de către utilizator

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