Itext PDF geeft het Myanmar Unicode-lettertype niet correct weer

stemmen
4

Itext 5 wordt niet correct weergegeven in het gegenereerde pdf-bestand voor Myanmar Unicode-lettertypes.

Tekstversie : 5.5.13.1

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

Werkelijk resultaat

enter

Google Drive Link voor gegenereerde PDF.

Mijn teststring is vergelijkbaar met The quick brown fox jump over the lazy dog in het Engels. Het bevat de meeste Myanmar alfabetten.

Java-programma dat ik gebruikt heb voor het product boven 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 teksten zijn correct (u kunt kopiëren en plakken in een tekstverwerker zoals Notepad en het resultaat zien) maar verkeerd weergegeven in een pdf-bestand.

Wat moet ik doen om Myanmar Unicode Font correct weer te geven door itext-pdf-5 te gebruiken ?

Nu gebruik ik een vuile manier om de lettertypes leesbaar te maken. Ik heb alle unicode strings omgezet naar Zawgyi Font (Dit is een ander Myanmar lettertype en we moeten dit nooit gebruiken.) en in pdf omgezet. Dit is geen goede oplossing en we kunnen niet beloven dat alle unicodes correct zijn geconverteerd naar Zawgyi-One lettertypes en ik wil geen unicode teksten omzetten naar niet-standaard teksten. Daarom wil ik deze manier niet gebruiken.

De vraag is gesteld op 15/05/2020 om 10:08
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

(Volledige openheid: ik werk voor iText Software)

iText 5 ondersteunt geen goede Unicode-gebaseerde verwerking van het Myanmar-schrijfsysteem. Hoewel iText 5 een specifieke implementatie heeft voor Arabisch, verhinderen de inherente beperkingen van haar lettertype-infrastructuur de ondersteuning van lettertype-eigenschappen die nodig zijn voor verschillende andere schrijfsystemen.

iText 7 verbetert dit met een nieuwe lettertype-implementatie en een optionele module (pdfCalligraph, niet open source) om verschillende schrijfsystemen te ondersteunen. Myanmar wordt echter (nog) niet ondersteund.

De bijbehorende iText 7-code ziet er zo uit:

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

Ongeacht of pdfCalligraph gebruikt wordt of niet, de weergave is nog steeds verkeerd:

Wrong Myanmar rendering

Als een commerciële licentie voor u een optie is, dient u deze functieaanvraag in. Extra schrijfsystemen worden nog steeds actief toegevoegd. Zo niet, dan ben ik bang dat dit niet mogelijk is met iText en zult u een andere oplossing moeten vinden.

antwoordde op 25/05/2020 om 23:56
bron van user

stemmen
0

Ik werd ook geconfronteerd met hetzelfde probleem. Maar ik gebruikte thymeleaf met iText. Ik gebruik het ttf lettertype pakket van de taal (niet unicode) en gebruik de converter om unicode om te zetten naar mijn taal en deze als normale string in de PDF te bevestigen. het werkt als een charme. als je de mogelijkheid hebt om thymeleaf te gebruiken, probeer dan deze aanpak.

onder CSS te plaatsen in de style-tag.

@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 code om pdf te genereren.

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();
antwoordde op 25/05/2020 om 15:04
bron van user

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