Il testo PDF non viene visualizzato correttamente Myanmar Unicode Font

voti
4

Il testo 5 non viene visualizzato correttamente nel file pdf generato per i font Unicode di Myanmar.

Versione testo : 5.5.13.1

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

Risultato effettivo

enter

Google Drive Link per il PDF generato.

La mia stringa di test è simile a The quick brown fox jump over the lazy dog in inglese. Contiene la maggior parte degli alfabeti del Myanmar.

Programma Java che ho usato per produrre sopra il 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();

I testi in uscita sono corretti (è possibile copiare e incollare in un editor di testo come Notepad e vedere il risultato) ma la visualizzazione è errata nel file pdf.

Cosa devo fare per visualizzare correttamente il font Unicode di Myanmar utilizzando il filext-pdf-5?

Ora sto usando il modo sporco per vedere i font leggibili. Ho convertito tutte le stringhe unicode in Zawgyi Font (questo è un altro font del Myanmar e non dovremmo mai usarlo) e l'ho incorporato in pdf. Questa non è una buona soluzione e non possiamo promettere che tutti gli unicodici siano correttamente convertiti in una stringa di caratteri Zawgyi-One e non voglio convertire testi unicodici in testi non standard. Ecco perché non voglio usare questo metodo.

È pubblicato 15/05/2020 alle 10:08
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

(Per completezza: lavoro per iText Software)

iText 5 non supporta l'elaborazione corretta basata su Unicode del sistema di scrittura del Myanmar. Sebbene iText 5 abbia un'implementazione specifica per l'arabo, le limitazioni intrinseche della sua infrastruttura di font impediscono il supporto per le caratteristiche dei font che sono necessarie per vari altri sistemi di scrittura.

iText 7 migliora questo aspetto con una nuova implementazione dei font e un modulo opzionale (pdfCalligraph, non open source) per supportare diversi sistemi di scrittura. Tuttavia, il Myanmar non è (ancora) supportato.

Il codice iText 7 corrispondente assomiglia a questo:

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

Indipendentemente dal fatto che si utilizzi o meno pdfCalligraph, il rendering è comunque sbagliato:

Wrong Myanmar rendering

Se una licenza commerciale è un'opzione per voi, si prega di inviare questa richiesta di funzionalità. Ulteriori sistemi di scrittura sono ancora attivamente aggiunti. In caso contrario, temo che questo non sarà possibile con iText e dovrete trovare un'altra soluzione.

Risposto il 25/05/2020 a 23:56
fonte dall'utente

voti
0

Anch'io ho affrontato lo stesso problema. Ma ho usato Thymeleaf con il testo. Uso il pacchetto di font ttf della lingua (non unicode) e uso il convertitore per convertire l'unicode nella mia lingua e allegarlo al PDF come una normale stringa. funziona come un ciondolo. se hai la possibilità di usare thymeleaf, prova questo approccio.

mettere sotto CSS all'interno del tag di stile.

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

Codice Java per generare il 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();
Risposto il 25/05/2020 a 15:04
fonte dall'utente

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