Itext PDF düzgün görüntülenmiyor Myanmar Unicode Yazı Tipi

oy
4

Itext 5, Myanmar Unicode yazı tipleri için oluşturulan pdf dosyasında düzgün görüntülenmiyor.

Itext sürümü : 5.5.13.1

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

Gerçek Sonuç :

resim

Oluşturulan PDF için Google Drive Bağlantısı .

Test dizim İngilizce "Tembel köpeğin üzerinde hızlı kahverengi tilki atlama" ile benzer. Myanmar alfabelerinin çoğunu içerir.

Pdf'in üstünde ürün için kullandığım Java programı

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

Çıkış metinleri doğrudur (Not Defteri gibi bir metin düzenleyicisine kopyalayıp yapıştırabilir ve sonucu görebilirsiniz) ancak pdf dosyasında yanlış görüntülenebilir.

İtext-pdf-5 kullanarak Myanmar Unicode Yazı tipini doğru görüntülemek için ne yapmalıyım?

Şimdi yazı tiplerini okunabilir görmek için kirli bir yol kullanıyorum. Tüm unicode dizelerini "Zawgyi Yazı Tipi" ne dönüştürdüm (Bu başka bir Myanmar yazı tipi ve asla kullanmamalıyız .) Ve pdf içine gömülü. Bu iyi bir çözüm değildir ve tüm unicodeslerin Zawgyi-One yazı tipi dizesine doğru dönüştürüldüğüne söz veremeyiz ve unicode metinleri standart olmayan metinlere dönüştürmek istemiyorum. Bu yüzden bu şekilde kullanmak istemiyorum.

Oluştur 15/05/2020 saat 10:08
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

(Tam açıklama: iText Yazılımı için çalışıyorum.)

iText 5, Myanmar yazma sisteminin düzgün Unicode tabanlı işlemesini desteklemez. İText 5'in Arapça için belirli bir uygulaması olmasına rağmen, yazı tipi altyapısının doğasında var olan sınırlamalar, diğer çeşitli yazı sistemleri için gerekli olan yazı tipi özellikleri için desteği önler.

iText 7, farklı yazı sistemlerini desteklemek için yeni bir yazı tipi uygulaması ve isteğe bağlı bir modül (pdfCalligraph, açık kaynak değil) ile bunu geliştirir. Ancak, Myanmar (henüz) desteklenmemektedir.

Karşılık gelen iText 7 kodu şuna benzer:

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'ın kullanılıp kullanılmadığından bağımsız olarak, oluşturma işlemi hala yanlıştır:

Yanlış Myanmar görüntüleme

Ticari lisans sizin için bir seçenekse, lütfen bu özellik isteğini gönderin. Ek yazı sistemleri hala aktif olarak eklenmektedir. Değilse, korkarım bu iText ile mümkün olmayacak ve başka bir çözüm bulmanız gerekecek.

Cevap 25/05/2020 saat 23:56
kaynak kullanıcı

oy
0

Aynı problemle de karşılaştım. Ama iText ile kekik kullandım. Dilin ttf yazı tipi paketini (unicode değil) kullanıyorum ve dönüştürücüyü unicode'u dilime dönüştürmek ve normal dize olarak PDF'ye eklemek için kullanıyorum. mucizevi şekilde çalışır. kekik kullanma olasılığınız varsa, bu yaklaşımı deneyin.

stil etiketinin içine CSS'nin altına yerleştirin.

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

Pdf oluşturmak için Java kodu.

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();
Cevap 25/05/2020 saat 15:04
kaynak kullanıcı

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