clj-htmltopdf/src/clj_htmltopdf/core.clj

62 lines
1.7 KiB
Clojure
Raw Normal View History

2017-04-01 14:58:23 -04:00
(ns clj-htmltopdf.core
(:require
[clojure.java.io :as io]
[hiccup.page :as h]
[clj-htmltopdf.options :as o])
2017-04-01 14:58:23 -04:00
(:import
[java.io OutputStream]
[com.openhtmltopdf DOMBuilder]
[com.openhtmltopdf.pdfboxout PdfRendererBuilder]
[com.openhtmltopdf.util XRLog]
[org.jsoup Jsoup]
2017-04-02 12:52:01 -04:00
[org.jsoup.nodes Document]))
2017-04-01 14:58:23 -04:00
2017-04-02 12:52:01 -04:00
(defn- read-html-string
^String [in]
2017-04-02 12:24:58 -04:00
(cond
(string? in) in
(sequential? in) (h/html5 {} in)
:else (with-open [r (io/reader in)]
(slurp r))))
2017-04-01 14:58:23 -04:00
(defn- ->output-stream
2017-04-02 12:52:01 -04:00
^OutputStream [out]
2017-04-02 12:24:58 -04:00
(if (instance? OutputStream out)
out
(io/output-stream out)))
2017-04-01 14:58:23 -04:00
2017-04-02 12:52:01 -04:00
(defn configure-logging!
[options]
(if (:logging? options)
(do
(if-let [logger (:logger options)]
(XRLog/setLoggerImpl logger))
(XRLog/setLoggingEnabled true))
; NOTE: a bug in how Open HTML to PDF's XRLog class initializes itself will always result
; in an initial little bit of logging output regardless of when we set this to false.
(XRLog/setLoggingEnabled false)))
(defn prepare-html
[in options]
(let [html (read-html-string in)
html-doc (Jsoup/parse html)]
(o/inject-options-into-html! html-doc options)
html-doc))
(defn write-pdf!
[^Document html-doc ^String base-uri out]
(let [builder (PdfRendererBuilder.)
os (->output-stream out)]
(.withW3cDocument builder (DOMBuilder/jsoup2DOM html-doc) base-uri)
(with-open [os os]
(.toStream builder os)
(.run builder)
os)))
2017-04-01 15:23:02 -04:00
2017-04-01 14:58:23 -04:00
(defn ->pdf
[in out & [options]]
(let [options (merge o/default-options options)
2017-04-02 12:52:01 -04:00
html-doc (prepare-html in options)]
(configure-logging! options)
(write-pdf! html-doc (o/->base-uri options) out)))