Itext 5は ミャンマーUnicodeフォント に対して生成されたPDFファイルで正しく表示されません。
itextバージョン:5.5.13.1
期待結果:သီဟိုဠ်မှဉာဏ်ကြီးရှင်သည်အာယုဝဎ္ဍနဆေးညွှန်းစာကိုဇလွန်ဈေးဘေးဗာဒံပင်ထက်အဓိဋ္ဌာန်လျက်ဂဃနဏဖတ်ခဲ့သည်。
実際の結果:
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で正しくレンダリングされません。例:သိန္နီ、 ဂွ
私も同じ問題に直面しました。しかし、私は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