diff options
author | F.O. <scrotadamus@insiberia.net> | 2025-02-16 17:56:08 +0100 |
---|---|---|
committer | F.O. <scrotadamus@insiberia.net> | 2025-02-16 17:56:57 +0100 |
commit | 17fb6add26291b31f7020e3551a7c8487130a747 (patch) | |
tree | d4559a7339ed181393ff921909e6ce05b7c2cf18 /go-poppler/poppler.go |
genesi
Diffstat (limited to 'go-poppler/poppler.go')
-rw-r--r-- | go-poppler/poppler.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/go-poppler/poppler.go b/go-poppler/poppler.go new file mode 100644 index 0000000..eaa53c4 --- /dev/null +++ b/go-poppler/poppler.go @@ -0,0 +1,58 @@ +package poppler + +// #cgo pkg-config: poppler-glib +// #include <poppler.h> +// #include <stdlib.h> +// #include <glib.h> +// #include <unistd.h> +import "C" + +import ( + "errors" + "path/filepath" + "unsafe" +) + +type poppDoc *C.struct__PopplerDocument + +func Open(filename string) (doc *Document, err error) { + filename, err = filepath.Abs(filename) + if err != nil { + return + } + var e *C.GError + cfilename := (*C.gchar)(C.CString(filename)) + defer C.free(unsafe.Pointer(cfilename)) + fn := C.g_filename_to_uri(cfilename, nil, nil) + var d poppDoc + d = C.poppler_document_new_from_file((*C.char)(fn), nil, &e) + if e != nil { + err = errors.New(C.GoString((*C.char)(e.message))) + } + doc = &Document{ + doc: d, + openedPages: []*Page{}, + } + return +} + +func Load(data []byte) (doc *Document, err error) { + var e *C.GError + var d poppDoc + + b := C.g_bytes_new((C.gconstpointer)(unsafe.Pointer(&data[0])), (C.ulong)(len(data))) + defer C.g_bytes_unref(b) + + d = C.poppler_document_new_from_bytes(b, nil, &e) + if e != nil { + err = errors.New(C.GoString((*C.char)(e.message))) + } + doc = &Document{ + doc: d, + } + return +} + +func Version() string { + return C.GoString(C.poppler_get_version()) +} |