Skip to content

Commit

Permalink
add basic support for hooking into DocListener events
Browse files Browse the repository at this point in the history
  • Loading branch information
gered committed Mar 29, 2017
1 parent 418b34b commit 20e477e
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions src/clj/clj_pdf/core.clj
Expand Up @@ -961,6 +961,70 @@
(int 0)
(int 0))))))))))

(defn- has-event? [k events]
(if-let [fns (get events k)]
(if (sequential? fns)
(not (empty? fns)))))

(defn- raise-event [k events & args]
(if-let [fns (get events k)]
(if (sequential? fns)
(doseq [f fns]
(if (fn? f)
(apply f args)
(throw (Exception. (str "non-function value found in doc events list for event: " k)))))
(throw (Exception. (str "doc event " k " not a sequence of functions"))))))

(defn- set-doc-listener [doc events]
(.addDocListener
doc
(reify cljpdf.text.DocListener
; DocListener methods
(open [_]
(raise-event :open events doc))
(close [_]
(raise-event :close events doc))
(newPage [_]
(raise-event :new-page events doc)
true)
(setPageSize [_ pageSize]
(raise-event :set-page-size events doc pageSize)
; return value doesn't appear to be used in itext anywhere
true)
(setMargins [_ marginLeft marginRight marginTop marginBottom]
(raise-event :set-margins events doc marginLeft marginRight marginTop marginBottom)
; return value doesn't appear to be used in itext anywhere
true)
(setMarginMirroring [_ marginMirroring]
(raise-event :set-margin-mirroring events doc marginMirroring)
; return value doesn't appear to be used in itext anywhere
true)
(setMarginMirroringTopBottom [_ marginMirroringTopBottom]
(raise-event :set-margin-mirroring-top-bottom events doc marginMirroringTopBottom)
; return value doesn't appear to be used in itext anywhere
true)
(setPageCount [_ pageN]
(raise-event :set-page-count events doc pageN))
(resetPageCount [_]
(raise-event :reset-page-count events doc))
(setHeader [_ header]
(raise-event :set-header events doc header))
(resetHeader [_]
(raise-event :reset-header events doc))
(setFooter [_ footer]
(raise-event :set-footer events doc footer))
(resetFooter [_]
(raise-event :reset-footer events doc))

; ElementListener methods
(add [_ element]
(if (has-event? :add events)
(raise-event :add events doc element)
; return value IS used in Document.add()
; default return of false is safe to ensure no unwanted behaviour
false))
)))

(defn- setup-doc [{:keys [left-margin
right-margin
top-margin
Expand All @@ -978,6 +1042,7 @@
font-style
orientation
page-events
doc-events
watermark] :as meta}
out]

Expand All @@ -999,6 +1064,8 @@
(merge {:align :right :start-page 1} footer)))
header-first-page? (if letterhead false true)]

(set-doc-listener doc doc-events)

;;header and footer must be set before the doc is opened, or itext will not put them on the first page!
;;if we have to print total pages or add a watermark, then the document has to be post processed
(let [output-stream-to-use (if (page-events? meta) temp-stream output-stream)
Expand Down

0 comments on commit 20e477e

Please sign in to comment.