🎉 Export shapes to pdf

This commit is contained in:
Andrés Moya 2021-07-02 13:19:04 +02:00 committed by Alonso Torres
parent e9945235ed
commit 1ee14a76f4
8 changed files with 146 additions and 19 deletions

View file

@ -71,6 +71,20 @@
:type (name type)
:omitBackground omit-background?})))
(defn pdf
([page] (pdf page nil))
([page {:keys [viewport omit-background? prefer-css-page-size?]
:or {viewport {}
omit-background? true
prefer-css-page-size? true}}]
(let [viewport (d/merge default-viewport viewport)]
(.pdf ^js page #js {:width (:width viewport)
:height (:height viewport)
:scale (:scale viewport)
:omitBackground omit-background?
:printBackground (not omit-background?)
:preferCSSPageSize prefer-css-page-size?}))))
(defn eval!
[frame f]
(.evaluate ^js frame f))

View file

@ -10,6 +10,7 @@
[app.common.spec :as us]
[app.renderer.bitmap :as rb]
[app.renderer.svg :as rs]
[app.renderer.pdf :as rp]
[app.zipfile :as zip]
[cljs.spec.alpha :as s]
[cuerdas.core :as str]
@ -89,7 +90,8 @@
(case (:type params)
:png (rb/render params)
:jpeg (rb/render params)
:svg (rs/render params)))
:svg (rs/render params)
:pdf (rp/render params)))
(defn- find-filename-candidate
[params used]
@ -101,7 +103,8 @@
(case (:type params)
:png ".png"
:jpeg ".jpg"
:svg ".svg"))]
:svg ".svg"
:pdf ".pdf"))]
(if (contains? used candidate)
(recur (inc index))
candidate))))

View file

@ -0,0 +1,79 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns app.renderer.pdf
"A pdf renderer."
(:require
[app.browser :as bw]
[app.common.exceptions :as ex :include-macros true]
[app.common.spec :as us]
[app.config :as cf]
[cljs.spec.alpha :as s]
[lambdaisland.uri :as u]
[lambdaisland.glogi :as log]
[promesa.core :as p]))
(defn create-cookie
[uri token]
(let [domain (str (:host uri)
(when (:port uri)
(str ":" (:port uri))))]
{:domain domain
:key "auth-token"
:value token}))
(defn pdf-from-object
[browser {:keys [file-id page-id object-id token scale type]}]
(letfn [(handle [page]
(let [path (str "/render-object/" file-id "/" page-id "/" object-id)
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/")
(assoc :fragment path))
cookie (create-cookie uri token)]
(pdf-from page (str uri) cookie)))
(pdf-from [page uri cookie]
(log/info :uri uri)
(let [options {:cookie cookie}]
(p/do!
(bw/configure-page! page options)
(bw/navigate! page uri)
(bw/wait-for page "#screenshot")
(bw/pdf page))))]
(bw/exec! browser handle)))
(s/def ::name ::us/string)
(s/def ::suffix ::us/string)
(s/def ::page-id ::us/uuid)
(s/def ::file-id ::us/uuid)
(s/def ::object-id ::us/uuid)
(s/def ::scale ::us/number)
(s/def ::token ::us/string)
(s/def ::filename ::us/string)
(s/def ::render-params
(s/keys :req-un [::name ::suffix ::object-id ::page-id ::scale ::token ::file-id]
:opt-un [::filename]))
(defn render
[params]
(us/assert ::render-params params)
(let [browser @bw/instance]
(when-not browser
(ex/raise :type :internal
:code :browser-not-ready
:hint "browser cluster is not initialized yet"))
(p/let [content (pdf-from-object browser params)]
{:content content
:filename (or (:filename params)
(str (:name params)
(:suffix params "")
".pdf"))
:length (alength content)
:mime-type "application/pdf"})))