#lang racket/base (require ffi/unsafe) (define libhpdf (ffi-lib "../3rdparty/libhpdf")) (define pdf-new-raw (get-ffi-obj "HPDF_New" libhpdf (_fun _int _int -> _pointer))) (define pdf-save-raw (get-ffi-obj "HPDF_SaveToFile" libhpdf (_fun _pointer _string/utf-8 -> _int))) (define pdf-free-raw (get-ffi-obj "HPDF_Free" libhpdf (_fun _pointer -> _void))) (define add-page-raw (get-ffi-obj "HPDF_AddPage" libhpdf (_fun _pointer -> _pointer))) (define load-ttf-raw (get-ffi-obj "HPDF_LoadTTFontFromFile" libhpdf (_fun _pointer _string/utf-8 _bool -> _string))) (define use-utf-encodingd-raw (get-ffi-obj "HPDF_UseUTFEncodings" libhpdf (_fun _pointer -> _int))) (define set-current-encoder-raw (get-ffi-obj "HPDF_SetCurrentEncoder" libhpdf (_fun _pointer _string -> _pointer))) (define get-font-raw (get-ffi-obj "HPDF_GetFont" libhpdf (_fun _pointer _string _string/utf-8 -> _pointer))) (define set-font-size-raw (get-ffi-obj "HPDF_Page_SetFontAndSize" libhpdf (_fun _pointer _pointer _float -> _pointer))) (define page-begin-text-raw (get-ffi-obj "HPDF_Page_BeginText" libhpdf (_fun _pointer -> _pointer))) (define page-text-out-raw (get-ffi-obj "HPDF_Page_TextOut" libhpdf (_fun _pointer _float _float _string/utf-8 -> _pointer))) (define page-end-text-raw (get-ffi-obj "HPDF_Page_EndText" libhpdf (_fun _pointer -> _pointer))) (define (new-pdf) (pdf-new-raw 0 0)) (define (save-pdf pdf path) (pdf-save-raw pdf path)) (define (new-page pdf) (add-page-raw pdf)) (define (free-pdf p) (pdf-free-raw p)) (define (new-ttf-font p font) (define ttf-loaded (load-ttf-raw p font #t)) (get-font-raw p ttf-loaded "UTF-8")) (define (use-utf8 p) (use-utf-encodingd-raw p) (set-current-encoder-raw p "UTF-8")) (define (set-font-size page font size) (set-font-size-raw page font size)) (define (put-text page x y text) (page-begin-text-raw page) (page-text-out-raw page x y text) (page-end-text-raw page) ) (provide new-pdf save-pdf new-page free-pdf new-ttf-font use-utf8 set-font-size put-text) (module+ test (require rackunit) ; 以下是測試區 (define doc (new-pdf)) (define pg (new-page doc)) (use-utf8 doc) (define ian-sui (new-ttf-font doc "/home/yoxem/.local/share/fonts/Iansui-Regular.ttf")) (set-font-size pg ian-sui 15.0) (put-text pg 140.0 150.0 "天地人123abc") (save-pdf doc "/tmp/a.pdf") (void? (free-pdf doc)) )