Itext PDF некорректно отображает шрифт Юникод Мьянма

голоса
4

Itext 5 некорректно отображается в сгенерированном pdf файле для шрифтов Юникод Мьянмы.

Текстовая версия : 5.5.13.1

Результат ожидания : သီဟိုဠ်မှ ဉာဏ်ကြီးရှင်သည်အာယုဝဎ္ဍနဆေးညွှန်းစာကို ဇလွန်ဈေးဘေးဗာဒံပင်ထက် အဓိဋ်လျက် ဂဃနဏဖတ်ခာန့သည်။

Фактический результат

enter

Ссылка на диск Google для сгенерированного PDF-файла.

Моя тестовая строка похожа на Быстрый коричневый лис перепрыгивает через ленивую собаку на английском языке. Она содержит большинство алфавитов Мьянмы.

Java программа, которую я использовал для продукта выше 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-тексты корректны (вы можете скопировать и вставить их в текстовые редакторы, такие как Блокнот, и увидеть результат), но неправильно отображаются в pdf-файле.

Что нужно сделать, чтобы правильно отобразить шрифт Юникод Мьянмы с помощью itext-pdf-5 ?

Теперь я использую грязный способ, чтобы увидеть шрифты читаемыми. Я преобразовал все строки юникода в Zawgyi Font (Это еще один шрифт Мьянмы, и мы никогда не должны его использовать) и вставил его в pdf. Это плохое решение, и мы не можем обещать, что все юникоды будут корректно конвертированы в строку шрифта Zawgyi-One, и я не хочу конвертировать тексты в юникод в нестандартные тексты. Вот почему я не хочу использовать этот способ.

Задан 15/05/2020 в 10:08
источник пользователем
На других языках...                            


2 ответов

голоса
0

(Полное раскрытие: я работаю на iText Software.)

iText 5 не поддерживает надлежащую обработку на основе Юникода системы письма Мьянмы. Хотя iText 5 имеет специальную реализацию для арабского языка, присущие ему ограничения шрифтовой инфраструктуры препятствуют поддержке функций шрифта, которые необходимы для различных других систем письменности.

iText 7 совершенствуется благодаря новой реализации шрифта и дополнительному модулю (pdfCalligraph, а не открытому исходному коду) для поддержки различных систем письма. Однако Мьянма (пока) не поддерживается.

Соответствующий код iText 7 выглядит следующим образом:

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 или нет, рендеринг всё равно неверен:

Wrong Myanmar rendering

Если у вас есть возможность получить коммерческую лицензию, пожалуйста, отправьте запрос на эту функцию. Дополнительные системы письма все еще активно добавляются. Если нет, то, боюсь, с iText это будет невозможно, и вам придется искать другое решение.

Ответил 25/05/2020 в 23:56
источник пользователем

голоса
0

Я также столкнулся с той же проблемой. Но я использовал тимьян с iText. Я использую пакет шрифтов ttf языка (не юникод) и с помощью конвертера конвертирую юникод в мой язык и прикрепляю его в PDF как обычную строку. он работает как шарм. если у вас есть возможность использовать thymeleaf, попробуйте этот подход.

поместите ниже CSS внутри тега стилей.

@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 код для генерации 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();
Ответил 25/05/2020 в 15:04
источник пользователем

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