Itext-PDF wird nicht korrekt angezeigt Myanmar Unicode-Schrift

stimmen
4

Itext 5 wird bei generierten pdf-Dateien für Myanmar Unicode-Schriften nicht korrekt angezeigt.

Itext-Version : 5.5.13.1

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

Tatsächliches Ergebnis

enter

Google Drive Link für generierte PDF.

Mein Test-String ist ähnlich wie Der schnelle braune Fuchs springt über den faulen Hund auf Englisch. Sie enthält die meisten Alphabete von Myanmar.

Java-Programm, das ich für das obige Produkt verwendet habe 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();

Die ausgegebenen Texte sind korrekt (Sie können sie kopieren und in ein Texteditor wie Notepad einfügen und das Ergebnis sehen), aber die PDF-Datei wird falsch angezeigt.

Was muss ich tun, um die Myanmar Unicode-Schriftart korrekt anzuzeigen, wenn ich itext-pdf-5 verwende ?

Jetzt verwende ich eine schmutzige Methode, um die Schriften lesbar zu machen. Ich habe alle Unicode-Zeichenketten in Zawgyi Font (Dies ist eine andere Myanmar-Schriftart und wir sollten diese niemals verwenden. Dies ist keine gute Lösung, und wir können nicht versprechen, dass alle Unicode-Zeichenketten korrekt in die Schriftart Zawgyi-One konvertiert werden, und ich möchte keine Unicode-Texte in Nicht-Standard-Texte konvertieren. Deshalb möchte ich diesen Weg nicht benutzen.

Veröffentlicht am 15/05/2020 um 10:08
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

(Vollständige Offenlegung: Ich arbeite für iText Software)

iText 5 unterstützt keine korrekte Unicode-basierte Verarbeitung des myanmarischen Schriftsystems. Obwohl iText 5 eine spezifische Implementierung für Arabisch hat, verhindern die inhärenten Beschränkungen seiner Schriftinfrastruktur die Unterstützung von Schriftfunktionen, die für verschiedene andere Schriftsysteme benötigt werden.

iText 7 verbessert dies mit einer neuen Font-Implementierung und einem optionalen Modul (pdfCalligraph, nicht Open Source) zur Unterstützung verschiedener Schriftsysteme. Myanmar wird jedoch (noch) nicht unterstützt.

Der entsprechende iText 7-Code sieht wie folgt aus:

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

Unabhängig davon, ob pdfCalligraph verwendet wird oder nicht, ist die Darstellung immer noch falsch:

Wrong Myanmar rendering

Wenn eine kommerzielle Lizenz für Sie eine Option ist, reichen Sie bitte diesen Feature-Antrag ein. Weitere Schreibsysteme werden noch aktiv hinzugefügt. Falls nicht, wird dies mit iText leider nicht möglich sein und Sie müssen eine andere Lösung finden.

Beantwortet am 25/05/2020 um 23:56
quelle vom benutzer

stimmen
0

Ich stand auch vor dem gleichen Problem. Aber ich habe Thymian mit iText verwendet. Ich verwende das ttf-Schriftartenpaket der Sprache (nicht Unicode) und benutze den Konverter, um Unicode in meine Sprache zu konvertieren und als normalen String an das PDF anzuhängen. das funktioniert wie ein Zauber. wenn Sie die Möglichkeit haben, Thymeleaf zu verwenden, versuchen Sie diesen Ansatz.

unter CSS innerhalb des style-Tags einfügen.

@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 zur Erzeugung von 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();
Beantwortet am 25/05/2020 um 15:04
quelle vom benutzer

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