Το PDF κειμένου δεν εμφανίζεται σωστά στη γραμματοσειρά Unicode Myanmar

ψήφοι
44

Το κείμενο 5 δεν εμφανίζεται σωστά στο αρχείο pdf που δημιουργήθηκε για τις γραμματοσειρές Myanmar Unicode .

Έκδοση κειμένου: 5.5.13.1

Αποτέλεσμα προσδοκίας : သီဟိုဠ် မှ ဉာဏ် ကြီး ရှင် သည် အာယု ဝဎ္ ဍ န ဆေး စာ ကို ဇလွန် ဈေး ဘေး ဗာ ဒံ ပင် ထက် အဓိဋ္ဌာန် လျက် ဂဃနဏ ဖတ် ခဲ့သည်။

Πραγματικό αποτέλεσμα :

εισάγετε

Σύνδεσμος Google Drive για δημιουργημένο PDF.

Η δοκιμαστική μου σειρά είναι παρόμοια με το "The quick brown fox jump over the lazy dog" στα Αγγλικά. Περιέχει τα περισσότερα αλφάβητα της Μιανμάρ.

Πρόγραμμα Java που συνήθιζα να κάνω προϊόντα πάνω από το 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();

Τα κείμενα Ouput είναι σωστά (μπορείτε να αντιγράψετε και να επικολλήσετε σε προγράμματα επεξεργασίας κειμένου όπως το Σημειωματάριο και να δείτε το αποτέλεσμα), αλλά εσφαλμένη εμφάνιση στο αρχείο pdf.

Τι πρέπει να κάνω για να εμφανίσω σωστά τη γραμματοσειρά Unicode Myanmar χρησιμοποιώντας itext-pdf-5;

Τώρα χρησιμοποιώ βρώμικο τρόπο για να δω τις γραμματοσειρές αναγνώσιμες. Μετέτρεψα όλες τις συμβολοσειρές unicode σε "Zawgyi Font" (Αυτή είναι μια άλλη γραμματοσειρά της Μιανμάρ και δεν πρέπει ποτέ να τη χρησιμοποιούμε .) Και ενσωματώθηκε σε pdf. Αυτή δεν είναι καλή λύση και δεν μπορούμε να υποσχεθούμε ότι όλα τα unicodes μετατρέπονται σωστά σε συμβολοσειρά γραμματοσειράς Zawgyi-One και δεν θέλω να μετατρέψω κείμενα unicode σε μη τυπικά κείμενα. Γι 'αυτό δεν θέλω να χρησιμοποιήσω αυτόν τον τρόπο.

Δημοσιεύθηκε 15/05/2020 στις 10:08
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

(Πλήρης αποκάλυψη: Εργάζομαι για το λογισμικό iText.)

Το iText 5 δεν υποστηρίζει σωστή επεξεργασία με βάση το Unicode του συστήματος γραφής της Μιανμάρ. Παρόλο που το iText 5 έχει συγκεκριμένη εφαρμογή για τα Αραβικά, οι εγγενείς περιορισμοί της γραμματοσειράς του αποτρέπουν την υποστήριξη για λειτουργίες γραμματοσειρών που απαιτούνται για διάφορα άλλα συστήματα γραφής.

Το iText 7 βελτιώνεται σε αυτό με μια νέα εφαρμογή γραμματοσειράς και μια προαιρετική ενότητα (pdfCalligraph, όχι open source) για την υποστήριξη διαφορετικών συστημάτων γραφής. Ωστόσο, η Μιανμάρ δεν υποστηρίζεται (ακόμη).

Ο αντίστοιχος κώδικας iText 7 μοιάζει με αυτό:

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

Ανεξάρτητα από το αν το pdfCalligraph χρησιμοποιείται ή όχι, η απόδοση εξακολουθεί να είναι λάθος:

Λάθος απόδοση της Μιανμάρ

Εάν μια εμπορική άδεια είναι μια επιλογή για εσάς, υποβάλετε αυτό το αίτημα λειτουργίας. Πρόσθετα συστήματα γραφής εξακολουθούν να προστίθενται ενεργά. Εάν όχι, φοβάμαι ότι αυτό δεν θα είναι δυνατό με το iText και θα πρέπει να βρείτε μια άλλη λύση.

Απαντήθηκε 25/05/2020 στις 23:56
πηγή χρήστη

ψήφοι
0

Αντιμετώπισα επίσης το ίδιο πρόβλημα. Αλλά χρησιμοποίησα θυμάρι με το iText. Χρησιμοποιώ το πακέτο γραμματοσειρών ttf της γλώσσας (όχι unicode) και χρησιμοποιώ τον μετατροπέα για να μετατρέψω το unicode στη γλώσσα μου και να το επισυνάψω στο PDF ως κανονική συμβολοσειρά. Λειτουργεί άψογα. εάν έχετε τη δυνατότητα να χρησιμοποιήσετε θυμάρι, δοκιμάστε αυτήν την προσέγγιση.

Βάλτε κάτω από το CSS μέσα στην ετικέτα στυλ.

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

Κωδικός Java για τη δημιουργία 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();
Απαντήθηκε 25/05/2020 στις 15:04
πηγή χρήστη

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