web-dev-qa-db-ja.com

Itext PDF正しく表示されないミャンマーUnicodeフォント

Itext 5は ミャンマーUnicodeフォント に対して生成されたPDFファイルで正しく表示されません。

itextバージョン:5.5.13.1

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

実際の結果

enter image description here

Googleドライブリンク 生成されたPDFの場合。

私のテスト文字列は、英語の「怠惰な犬を飛び越えた茶色のキツネ」と似ています。ミャンマーのアルファベットのほとんどが含まれています。

Pdfの上の製品に使用したJavaプログラム

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

出力テキストは正しい(Notepad ++などのテキストエディターにコピーアンドペーストして結果を確認できます)が、pdfファイルでの表示が間違っています。

Itext-pdf-5を使用してミャンマーのUnicodeフォントを正しく表示するにはどうすればよいですか?

今、私は汚い方法を使ってフォントを読みやすくしています。すべてのUnicode文字列を「Zawgyiフォント」に変換しました(これは別のミャンマーフォントであり、 これは絶対に使用しないでください 。)、pdfに埋め込みました。これは良い解決策ではなく、すべてのユニコードが正しくZawgyi-Oneフォント文字列に変換されるとは限りません。ユニコードテキストを非標準テキストに変換したくありません。だから私はこの方法を使いたくないのです。

Itextを使用してZawGyiフォントについて編集しました

一部のテキストもitextで正しくレンダリングされません。例:သိန္နီ、 ဂွ

5
Cataclysm

私も同じ問題に直面しました。しかし、私はiTextでthymeleafを使用しました。言語のttfフォントパッケージ(Unicodeではない)を使用し、コンバーターを使用してUnicodeを私の言語に変換し、それを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>

PDFを生成するJavaコード。

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

これは、作業ソースコードを使用したこのアプローチに関するこの完全なチュートリアルへのリンクです。 https://medium.com/@natsucoder/create-pdf-in-different-language-fonts-using-spring-boot-thymeleaf-itext-cba7f8612c61

0
Natsu