summaryrefslogtreecommitdiff
path: root/go-poppler/poppler.go
diff options
context:
space:
mode:
authorF.O. <scrotadamus@insiberia.net>2025-02-16 17:56:08 +0100
committerF.O. <scrotadamus@insiberia.net>2025-02-16 17:56:57 +0100
commit17fb6add26291b31f7020e3551a7c8487130a747 (patch)
treed4559a7339ed181393ff921909e6ce05b7c2cf18 /go-poppler/poppler.go
genesi
Diffstat (limited to 'go-poppler/poppler.go')
-rw-r--r--go-poppler/poppler.go58
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())
+}