2019年09月21日

LuaHPDF:日本語の PDF 文書を作る

 「Lua で PDF 作成:LuaHPDF」のつづき。日本語を含む PDF 文書を作るには、次の関数を使う。

  • hpdf.UseJPFonts(): 日本語の「MS明朝」「MSゴシック」「MSP明朝」「MSPゴシック」の4つのフォントを使えるようにする。
  • hpdf.UseJPEncodings(): 日本語の「90ms-RKSJ-H」「90ms-RKSJ-V」「90msp-RKSJ-H」「EUC-H」「EUC-V」エンコーディングを使えるようにする。
package.cpath = "./?.dylib;" .. package.cpath
--  "mysampleあいうえお" をシフトJISで表記
local s = "mysample30603062306430663068"
hpdf = require "hpdf"
local pdf = hpdf.New()
local page = hpdf.AddPage(pdf)
local height = hpdf.Page_GetHeight(page)
local width = hpdf.Page_GetWidth(page)
hpdf.UseJPEncodings(pdf)
hpdf.UseJPFonts(pdf)
local font = hpdf.GetFont(pdf, "MS-Gothic", "90ms-RKSJ-H")
hpdf.Page_SetFontAndSize(page, font, 24)
hpdf.Page_BeginText(page)
hpdf.Page_TextOut(page, 60, height - 60, s)
hpdf.Page_EndText(page)
hpdf.SaveToFile(pdf, "jp_from_haru.pdf")
hpdf.Free(pdf)

 できました。

20190921-1.png

 Windows 以外の環境だと「MS……」というフォントは標準搭載ではない。私の環境では、Mac でも Microsoft Office が入れてあるので、「MS……」が後からインストールされている。「MS……」が入っていない環境ではどう見えるか。VirtualBox に Debian を入れて、チェックしてみた。表示しているのは、ファイルビューアーの Evince。小文字の m のスペーシングがおかしい。

20190921-2.png

 代替フォントで何が使われているかは、「プロパティ」で見ることができる。DroidSansFallback だそうです。

20190921-3.png

 埋め込みなしで「MS……」を指定して PDF を作成するのは、「使う人がほぼ必ず『MS……』フォントをインストールしている」という環境では実用的と言える。だけど、そもそも PDF は「どういう環境でも同じように表示できる」ことを期待して使うことが多い。ということは、haruPDF で文書を作成する場合でも、フォントを明示的に指定して、埋め込む方がいい。

 「MSゴシック」を明示して埋め込んでみた。hpdf.UseJPFonts() をやめて、代わりに hpdf.LoadTTFontFromFile() を使う。

package.cpath = "./?.dylib;" .. package.cpath
hpdf = require "hpdf"
--  "mysampleあいうえお" をシフトJISで表記
local s = "mysample30603062306430663068"
local pdf = hpdf.New()
local page = hpdf.AddPage(pdf)
local height = hpdf.Page_GetHeight(page)
local width = hpdf.Page_GetWidth(page)
hpdf.UseJPEncodings(pdf)
--hpdf.UseJPFonts(pdf)
--font_name = "MS-Gothic"
local font_name = hpdf.LoadTTFontFromFile(pdf, "/Library/Fonts/Microsoft/MS Gothic.ttf", 1)
local font = hpdf.GetFont(pdf, font_name, "90ms-RKSJ-H")
hpdf.Page_SetFontAndSize(page, font, 24)
hpdf.Page_BeginText(page)
hpdf.Page_TextOut(page, 60, height - 60, s)
hpdf.Page_EndText(page)
hpdf.SaveToFile(pdf, "../jp_from_haru2.pdf")
hpdf.Free(pdf)
print("../jp_from_haru2.pdf created")

 Debian で表示してみた。うまくいきました。

20190921-4.png

 「プロパティ」で確認する。フォントが埋め込みされている。

20190921-5.png

 残念ながら、Mac に標準でインストールされている日本語フォントは、うまく埋め込みできなかった。ヒラギノ系も Osaka も "Unsupported ttf format." というエラーが出る。ヒラギノ系は OpenType なのでしょうがないとしても、TrueType の Osaka は読めて欲しかった。

Posted at 2019年09月21日 16:50:07
email.png