よろずや

CL-PDF で日本語

Common Lisp 用の PDF 作成ライブラリ CL-PDF は zlib があれば,圧縮もしてくれ る高機能なライブラリです.日本語フォントは使えないのですが,どーしても日本語 が使いたくなっので,手書き PDF 入門 を読んだり dvipdfm が出力した PDF を参考 に無理矢理日本語フォントを使うよーにしてみました.サンプル↓

image/clpdf.png

AcrobatReader で表示

Font 周り以外は cl-pdf の附属のサンプルのままです.

(defun example1 (&optional (file #P"/tmp/ex1.pdf"))
  (pdf:with-document ()
    (pdf:with-page ()
      (pdf:with-outline-level ("Example" (pdf:register-page-reference))
      	(let ((gothic (pdf:get-font "GothicBBB-Medium-H"))
	      (mincho (pdf:get-font "Ryumin-Light-H")))
 	  (pdf:in-text-mode
 	   (pdf:set-font mincho 36.0)
 	   (pdf:move-text 100 800)
 	   (pdf:draw-jtext "例題 その壱(明朝体)"))
	  (pdf:in-text-mode
	   (pdf:set-font gothic 36.0)
	   (pdf:move-text 100 700)
	   (pdf:draw-jtext "例題 その壱(ゴシック体)"))
	  (pdf:translate 230 500)
	  (loop repeat 101
	    for i = 0.67 then (* i 1.045)
	    do (pdf:in-text-mode
		(pdf:set-font gothic i)
		(pdf:move-text (* i 3) 0)
		(pdf:draw-jtext "回転〜"))
	    (pdf:rotate 18)))))
    (pdf:write-document file)))

しかし相変わらずのなんちゃって日本語化です.日本語フォントはハードコーディン グなので,使えるのは Ryumin-Light-H, GothicBBB-Medium-H のみ.誰かちゃんと日 本語対応させてくないかな〜.Ghostscript の設定とか読んでくれると嬉しいんです が.

しかも,CL-PDF 1.1.1 へのパッチでは今回のバージョン(1.1 系列)の目玉機能であ る kerning を OFF にしてます…ビルド通らなかったんで….

標準では日本語の文字コードは EUC を仮定していますが,pdf.lisp の

;; for Japanse font support (/90ms-RKSJ-{H,V} : Shift-JIS, {H,V} : JIS, EUC-{H,V} : euc-jp)
;;(defvar *default-japanese-encoding* "/90ms-RKSJ-H")
(defvar *default-japanese-encoding* "/EUC-H")

を変更すればほかの文字コードでも ひょっとしたら 大丈夫かもしれません.試してませんが.

CL-PDF 1.1.1 + 日本語パッチ導入ガイド

$ tar xzf cl-pdf-1.1.1.tar.gz

で tar 玉を展開したあと,日本語パッチをあてましょう.

$ patch <cl-pdf-1.1.1-jp.patch

あとは config.lisp を自分の環境に合わせて編集.UFFI + zlib が推奨らしいです. UFFI + libz がなければ処理系依存の zlib バインド(contrib ディレクトリ内にあ る zlib-cmucl.lisp とか),それも無い場合は compress-streams を nil にすれば 良いみたいです.サイズが気になるなら出来上がった PDF を圧縮すれば良いわけで 特に問題は無いはず.

afm-files-directories の設定時には注意が必要です.CL-PDF ではデフェオルトの フォントは Helvetica ですが,これが /usr/local/lib/afm/ に入ってない場合もあ ります.そこでパッチでは /usr/local/share/texmf/fonts/adobe/helvetic/ なんて のを追加していますが,実は cl-pdf を展開したディレクトリの中の afm というディ レクトリに Helvetica フォントが入ってる事が後で判明.手動で /usr/local/lib/ にコピーすりゃ良かったのか….

ビルド方法には defsystem と asdf の 2 通りがありますが,defsystem は有名なの で今回は asdf を使った例を示します.

(load (cl-package "asdf" "asdf"))
(setf asdf::*central-registry* '("home:/commonlisp/"))

;; UFFI
(load (cl-package "uffi-1.1.8" "uffi.asd"))
(when (not (find-package "UFFI"))
  (asdf:oos 'asdf:load-op :uffi))

;; CL-PDF
(load (cl-package "cl-pdf" "cl-pdf.asd"))
(when (find-package "UFFI")
  (uffi:load-foreign-library "/usr/lib/libz.so")
  (when (not (find-package "PDF"))
    (asdf:oos 'asdf:load-op :cl-pdf)))

と処理系の設定ファイル(cmucl なら ~/.cmucl-init とか)に書いておきましょう. あとは依存関係とかを勝手に判断してコンパイル,ロードが完了します.

PDF をテキストにする時の注意

PDF をテキストに変換するには xpdf に附属している pdftotext コマンドを使いま す.英語 PDF の問題は簡単ですが,日本語 PDF の場合はエンコーディングを指定し てやらねばなりません.

% pdftotext -enc EUC-JP hoge.pdf