O PDF do texto não exibe corretamente a fonte Myanmar Unicode Font

votos
4

Itext 5 não são exibidos corretamente no arquivo pdf gerado para fontes Myanmar Unicode.

Versão Itext : 5.5.13.1

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

Resultado real

enter

Google Drive Link para PDF gerado.

Meu teste é similar com The quick brown fox jump over the lazy dog em inglês. Ele contém a maioria dos alfabetos de Myanmar.

Programa Java que eu usava para produto acima do 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();

Os textos douput estão corretos (você pode copiar e colar em um editor de texto como o Bloco de Notas e ver o resultado), mas a exibição em arquivo pdf está errada.

O que devo fazer para exibir corretamente a fonte Myanmar Unicode usando itext-pdf-5 ?

Agora estou a usar uma maneira suja de ver as fontes legíveis. Converti todas as cordas unicode para Zawgyi Font (Esta é outra fonte de Myanmar e nunca devemos usá-la.) e incorporei-a no pdf. Esta não é uma boa solução e não podemos prometer que todos os unicodes são convertidos corretamente para Zawgyi-One e eu não quero converter textos unicode para textos não-padrão. É por isso que eu não quero usar desta maneira.

Publicado 15/05/2020 em 10:08
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

(Divulgação completa: Eu trabalho para o iText Software)

o iText 5 não suporta o processamento apropriado baseado em Unicode do sistema de escrita de Myanmar. Embora o iText 5 tenha uma implementação específica para o idioma árabe, as limitações inerentes à sua infra-estrutura de fontes impedem o suporte a características de fontes que são necessárias para vários outros sistemas de escrita.

o iText 7 melhora isso com uma nova implementação de fontes e um módulo opcional (pdfCalligraph, não open source) para suportar diferentes sistemas de escrita. No entanto, Myanmar não é (ainda) suportado.

O código correspondente do iText 7 se parece com isto:

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

Independentemente do pdfCalligraph ser usado ou não, a renderização ainda está errada:

Wrong Myanmar rendering

Se uma licença comercial é uma opção para você, por favor, envie este pedido de recurso. Sistemas de escrita adicionais ainda são ativamente adicionados. Caso contrário, receio que isto não será possível com o iText e você terá que encontrar outra solução.

Respondeu 25/05/2020 em 23:56
fonte usuário

votos
0

Eu também enfrentei o mesmo problema. Mas eu usei o thymeleaf com o iText. Eu uso o pacote de fontes ttf da linguagem (não unicode) e uso o conversor para converter unicode para a minha linguagem e anexá-lo no PDF como string normal. funciona como um encanto. se você tem a possibilidade de usar o thymeleaf, tente esta abordagem.

coloque abaixo do CSS dentro da etiqueta de estilo.

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

Código Java para gerar 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();
Respondeu 25/05/2020 em 15:04
fonte usuário

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