#include "hpdf.h" module Graphics.PDF.Haru where import Foreign.Ptr import Foreign.C.Types import Foreign.C.String import Foreign.Marshal.Alloc import Foreign.Marshal.Utils import System.IO.Unsafe data HPDF_Doc type Doc = Ptr HPDF_Doc data HPDF_Page type Page = Ptr HPDF_Page data HPDF_FontDef type FontDef = Ptr HPDF_FontDef type BOOL = CInt _HPDF_TRUE, _HPDF_FALSE :: BOOL _HPDF_TRUE = 1 _HPDF_FALSE = 0 withDoc :: String -> (Doc -> IO a) -> IO a withDoc fn action = do fp <- mkErrorHandlerCallback errorHandler doc <- newDoc fp nullPtr rv <- action doc withCString fn $ saveToFile doc freeDoc doc return rv withPage :: Doc -> (Page -> IO a) -> IO a withPage doc action = do pg <- addPage doc rv <- action pg setWidth pg 595 setHeight pg 842 return rv text :: Page -> X -> Y -> FontDef -> Size -> String -> IO () text pg x y font sz str = do setFontAndSize pg font sz beginText pg moveTextPos pg x y withCString str $ showText pg endText pg type FontName = String type X = CFloat type Y = CFloat type Size = CFloat loadFontEmbedded :: Doc -> String -> IO FontDef loadFontEmbedded doc fn = withCString fn $ \cstr -> do name <- loadTTFontFromFile doc cstr 1 getFont doc name nullPtr foreign import ccall "HPDF_New" newDoc :: FunPtr HPDF_Error_Handler -> Ptr () -> IO Doc foreign import ccall "HPDF_AddPage" addPage :: Doc -> IO Page foreign import ccall "HPDF_LoadTTFontFromFile" loadTTFontFromFile :: Doc -> CString -> BOOL -> IO CString foreign import ccall "HPDF_GetFont" getFont :: Doc -> CString -> CString -> IO FontDef foreign import ccall "HPDF_Page_BeginText" beginText :: Page -> IO () foreign import ccall "HPDF_Page_EndText" endText :: Page -> IO () foreign import ccall "HPDF_Free" freeDoc :: Doc -> IO () foreign import ccall "HPDF_SaveToFile" saveToFile :: Doc -> CString -> IO () foreign import ccall "HPDF_Page_ShowText" showText :: Page -> CString -> IO () foreign import ccall "HPDF_Page_SetFontAndSize" setFontAndSize :: Page -> FontDef -> CFloat -> IO () foreign import ccall "HPDF_Page_SetWidth" setWidth :: Page -> X -> IO () foreign import ccall "HPDF_Page_SetHeight" setHeight :: Page -> Y -> IO () foreign import ccall "HPDF_Page_MoveTextPos" moveTextPos :: Page -> X -> Y -> IO () type HPDF_Error_Handler = CULong -> CULong -> Ptr () -> IO () errorHandler :: HPDF_Error_Handler errorHandler x y _ = print (x, y) foreign import ccall "wrapper" mkErrorHandlerCallback :: HPDF_Error_Handler -> IO (FunPtr HPDF_Error_Handler)