summaryrefslogtreecommitdiff
path: root/go-poppler/document.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/document.go
genesi
Diffstat (limited to 'go-poppler/document.go')
-rw-r--r--go-poppler/document.go161
1 files changed, 161 insertions, 0 deletions
diff --git a/go-poppler/document.go b/go-poppler/document.go
new file mode 100644
index 0000000..58365ca
--- /dev/null
+++ b/go-poppler/document.go
@@ -0,0 +1,161 @@
+package poppler
+
+// #cgo pkg-config: poppler-glib
+// #include <poppler.h>
+// #include <stdlib.h>
+// #include <glib.h>
+// #include <unistd.h>
+import "C"
+
+import (
+ "errors"
+ "unsafe"
+ "path/filepath"
+)
+
+type Document struct {
+ doc poppDoc
+ openedPages []*Page
+}
+
+type DocumentInfo struct {
+ PdfVersion string `json:"pdf_version,omitempty"`
+ Title string `json:"title,omitempty"`
+ Author string `json:"author,omitempty"`
+ Subject string `json:"subject,omitempty"`
+ KeyWords string `json:"keywords,omitempty"`
+ Creator string `json:"creator,omitempty"`
+ Producer string `json:"producer,omitempty"`
+ Metadata string `json:"metadata,omitempty"`
+ CreationDate int `json:"creation_date,omitempty"`
+ ModificationDate int `json:"modification_date,omitempty"`
+ Pages int `json:"pages_number,omitempty"`
+ IsLinearized bool `json:"is_linearized,omitempty"`
+}
+
+func (d *Document) Info() DocumentInfo {
+ return DocumentInfo{
+ PdfVersion: toString(C.poppler_document_get_pdf_version_string(d.doc)),
+ Title: toString(C.poppler_document_get_title(d.doc)),
+ Author: toString(C.poppler_document_get_author(d.doc)),
+ Subject: toString(C.poppler_document_get_subject(d.doc)),
+ KeyWords: toString(C.poppler_document_get_keywords(d.doc)),
+ Creator: toString(C.poppler_document_get_creator(d.doc)),
+ Producer: toString(C.poppler_document_get_producer(d.doc)),
+ Metadata: toString(C.poppler_document_get_metadata(d.doc)),
+ CreationDate: int(C.poppler_document_get_creation_date(d.doc)),
+ ModificationDate: int(C.poppler_document_get_modification_date(d.doc)),
+ Pages: int(C.poppler_document_get_n_pages(d.doc)),
+ IsLinearized: toBool(C.poppler_document_is_linearized(d.doc)),
+ }
+}
+
+func (d *Document) GetNPages() int {
+ return int(C.poppler_document_get_n_pages(d.doc))
+}
+
+func (d *Document) GetPage(i int) (page *Page) {
+ p := C.poppler_document_get_page(d.doc, C.int(i))
+
+ page = &Page{
+ p: p,
+ openedAnnots: nil,
+ }
+ d.openedPages = append(d.openedPages, page)
+
+ return page
+}
+
+func (d *Document) HasAttachments() bool {
+ return toBool(C.poppler_document_has_attachments(d.doc))
+}
+
+func (d *Document) GetNAttachments() int {
+ return int(C.poppler_document_get_n_attachments(d.doc))
+}
+
+func (d *Document) Close() {
+
+ for i := 0; i < len(d.openedPages); i++ {
+ d.openedPages[i].Close()
+ }
+ d.openedPages = []*Page{}
+
+ C.g_object_unref(C.gpointer(d.doc))
+}
+
+
+func (d *Document) NewAnnot(t AnnotType, r Rectangle, q []Quad) (Annot, error) {
+ am := C.poppler_annot_mapping_new();
+
+ annot := Annot {
+ am: am,
+ }
+
+ pRect := rectangleToPopplerRectangle(r)
+
+ pQuad := quadsToGArray(q)
+ defer C.g_array_free(pQuad, 1)
+
+
+ switch (t){
+ case AnnotHighlight:
+ am.annot = C.poppler_annot_text_markup_new_highlight(d.doc, &pRect, pQuad)
+ case AnnotUnderline:
+ am.annot = C.poppler_annot_text_markup_new_underline(d.doc, &pRect, pQuad)
+ case AnnotSquiggly:
+ am.annot = C.poppler_annot_text_markup_new_squiggly(d.doc, &pRect, pQuad)
+ case AnnotStrikeOut:
+ am.annot = C.poppler_annot_text_markup_new_strikeout(d.doc, &pRect, pQuad)
+ default:
+ C.poppler_annot_mapping_free(am)
+ return annot, errors.New("invalid type for new annotation")
+ }
+
+
+ if am.annot == nil {
+ C.poppler_annot_mapping_free(am)
+ return annot, errors.New("failed to create annotation")
+ }
+
+ /* Can't get real annot mapping area as done in
+ * poppler_page_get_annot_mapping() since page is
+ * needed for page->page->getCropBox() and
+ * page->page->getRotate()
+ *
+ * as a placeholder we just use the annot rect
+ */
+ annot.am.area = pRect
+
+ return annot, nil
+}
+
+func (d *Document) Save(filename string) (saved bool, err error) {
+ filename, err = filepath.Abs(filename)
+ if err != nil {
+ return false, err
+ }
+
+ var e *C.GError
+ cFilename := (*C.gchar)(C.CString(filename))
+ defer C.free(unsafe.Pointer(cFilename))
+
+ cUri := C.g_filename_to_uri(cFilename, nil, nil)
+ cBool := C.poppler_document_save (d.doc, cUri, &e);
+ if e != nil {
+ err = errors.New(C.GoString((*C.char)(e.message)))
+ return false, err
+ }
+
+ if cBool == C.TRUE {
+ return true, nil
+ }
+
+ return false, nil
+}
+
+/*
+func (d *Document) GetAttachments() []Attachment {
+ return
+}
+*/