uahgi2/unsafe/libharu.rkt

87 lines
No EOL
2.5 KiB
Racket

#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))
)