El texto PDF no se muestra correctamente Fuente Unicode de Myanmar

votos
44

El texto 5 no se muestra correctamente en el archivo pdf generado para las fuentes Unicode de Myanmar.

Versión Itext : 5.5.13.1

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

Resultado real

enter

Google Drive Link para el PDF generado.

Mi cadena de prueba es similar con El rápido zorro marrón salta sobre el perro perezoso en inglés. Contiene la mayoría de los alfabetos de Myanmar.

El programa de Java que usé para producir el pdf de arriba

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

Los textos salidos son correctos (puedes copiar y pegar en un editor de texto como el Bloc de Notas y ver el resultado) pero se muestran mal en el archivo pdf.

¿Qué debo hacer para mostrar correctamente la Fuente Unicode Myanmar usando itext-pdf-5?

Ahora estoy usando la forma sucia de ver las fuentes legibles. Convertí todas las cadenas de unicode a Fuente Zawgyi (Esta es otra fuente de Myanmar y nunca deberíamos usarla) e incrustarlas en el pdf. Esta no es una buena solución y no podemos prometer que todos los unicódigos se conviertan correctamente a la cadena de fuentes Zawgyi-One y no quiero convertir textos de unicódigos a textos no estándar. Es por eso que no quiero usar esta forma.

Publicado el 15/05/2020 a las 10:08
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

(Divulgación completa: Trabajo para el software iText.)

iText 5 no soporta el procesamiento adecuado basado en Unicode del sistema de escritura de Myanmar. Aunque iText 5 tiene una implementación específica para el árabe, las limitaciones inherentes de su infraestructura de fuentes impiden el soporte de las características de las fuentes que se necesitan para otros sistemas de escritura.

iText 7 mejora esto con una nueva implementación de fuentes y un módulo opcional (pdfCalligraph, no de código abierto) para soportar diferentes sistemas de escritura. Sin embargo, Myanmar no está (todavía) soportado.

El código correspondiente del iText 7 se ve así:

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

Independientemente de si se utiliza pdfCalligraph o no, la representación sigue siendo incorrecta:

Wrong Myanmar rendering

Si una licencia comercial es una opción para usted, por favor envíe esta solicitud de función. Se siguen añadiendo activamente sistemas de escritura adicionales. Si no, me temo que esto no será posible con iText y tendrá que encontrar otra solución.

Respondida el 25/05/2020 a las 23:56
fuente por usuario

votos
0

También me enfrenté al mismo problema. Pero utilicé el timeleaf con el iText. Utilizo el paquete de fuentes ttf del idioma (no unicode) y uso el convertidor para convertir unicode a mi idioma y adjuntarlo al PDF como una cadena normal. Funciona de maravilla. Si tienes la posibilidad de usar thymeleaf, intenta este enfoque.

ponga debajo del CSS dentro de la 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 generar el 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();
Respondida el 25/05/2020 a las 15:04
fuente por usuario

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