Skip to content

Commit 93d0a6e

Browse files
DVF-1990 Export Server improvement
1 parent 4ba8bb4 commit 93d0a6e

File tree

8 files changed

+113
-25
lines changed

8 files changed

+113
-25
lines changed

project.clj

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
(defproject export-server "1.1.4"
2-
:description "AnyChart export server, AnyChart Bundle version 7.9.1"
1+
(defproject export-server "1.2.0"
2+
:description "AnyChart export server, AnyChart Bundle version 7.10.0"
33
:url "https://github.com/AnyChart/export-server"
44
:license {:name "Eclipse Public License"
5-
:url "http://www.eclipse.org/legal/epl-v10.html"}
5+
:url "http://www.eclipse.org/legal/epl-v10.html"}
66
:jvm-opts ["-Dphantomjs.binary.path=/usr/local/bin/phantomjs"]
77
:dependencies [[org.clojure/clojure "1.6.0"]
88
;http
@@ -22,8 +22,19 @@
2222
[org.clojure/tools.cli "0.3.1"]
2323

2424
;rasterization
25-
[clj-pdf "1.11.17"]
26-
[tikkba "0.5.0"]
25+
[clj-pdf "2.2.0"]
26+
[tikkba "0.5.0" :exclusions [org.clojure/clojure org.clojars.pallix/batik]]
27+
[org.clojars.pallix/xerces "2.5.0"]
28+
[org.clojars.pallix/xml-apis "2.5.0"]
29+
[org.clojars.pallix/xml-apis-ext "2.5.0"]
30+
31+
[org.apache.xmlgraphics/batik-transcoder "1.8"]
32+
[org.apache.xmlgraphics/batik-xml "1.8"]
33+
[org.apache.xmlgraphics/batik-codec "1.7"]
34+
35+
;csv to xslx
36+
[dk.ative/docjure "1.10.0"]
37+
[org.clojure/data.csv "0.1.3"]
2738

2839
;JSON
2940
[cheshire "5.3.1"]

src/export_server/cmd_handlers.clj

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22
(:require [export-server.utils.rasterizator :as rasterizator])
33
(:require [clojure.java.io :as io]))
44

5+
6+
(defn- get-pdf-size [options]
7+
(if (and
8+
(contains? options :pdf-width)
9+
(contains? options :pdf-height)
10+
(not (nil? (:pdf-width options)))
11+
(not (nil? (:pdf-height options)))) [(:pdf-width options) (:pdf-height options)] (:pdf-size options)))
12+
513
(defn out [result options ext]
614
(let [output-file (if (:output-file options) (:output-file options) (str (java.util.UUID/randomUUID)))
715
output-path (:output-path options)
@@ -30,7 +38,7 @@
3038
(defn pdf [options]
3139
(let [script (if (:script options) (:script options) (slurp (:input-file options)))
3240
svg ((rasterizator/script-to-svg script true true options) :result)
33-
image (:result (rasterizator/svg-to-pdf svg (:pdf-size options) (:pdf-landscape options) (:pdf-x options) (:pdf-y options)))]
41+
image (:result (rasterizator/svg-to-pdf svg (get-pdf-size options) (:pdf-landscape options) (:pdf-x options) (:pdf-y options)))]
3442
(out image options ".pdf")))
3543

3644

src/export_server/core.clj

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,17 @@
136136
:parse-fn #(keyword %)
137137
]
138138

139-
["-x" "--pdf-x PDF-X" "Pad X"
139+
["-X" "--pdf-width PDF-WIDTH" "Pdf width"
140+
:default (:pdf-width config/defaults)
141+
:parse-fn #(Integer/parseInt %)
142+
]
143+
144+
["-Y" "--pdf-height PDF-HEIGHT" "Pdf height"
145+
:default (:pdf-width config/defaults)
146+
:parse-fn #(Integer/parseInt %)
147+
]
148+
149+
["-x" "--pdf-x PDF-X" "Pdf X"
140150
:default (:pdf-x config/defaults)
141151
:parse-fn #(Integer/parseInt %)
142152
]
@@ -181,6 +191,10 @@
181191
(POST "/jpg" [] web/jpg)
182192
(POST "/svg" [] web/svg)
183193
(POST "/pdf" [] web/pdf)
194+
(POST "/xml" [] web/xml)
195+
(POST "/json" [] web/json)
196+
(POST "/csv" [] web/csv)
197+
(POST "/xlsx" [] web/xlsx)
184198
(route/not-found "<p>Page not found.</p>"))
185199

186200
(def app (-> app-routes wrap-params))

src/export_server/utils/config.clj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,7 @@
6060
:pdf-size :a4
6161
:pdf-x 0
6262
:pdf-y 0
63+
:pdf-width nil
64+
:pdf-height nil
6365
:pdf-landscape false
6466
})

src/export_server/utils/params_validator.clj

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@
99
(def ^{:private true} boolean-re #"(?i)^(true|false|0|1)$")
1010
(def ^{:private true} ratio-re #"(?i)([0-9]+\.[0-9]+)")
1111

12-
(def ^{:private true} rasterization-data-fields-validations {"data" v/required})
12+
13+
(def ^{:private true} data-fields-validations {"data" v/required})
1314

1415
(def ^{:private true} image-fields-validations
1516
{"width" [[v/matches pixel-re :message "Width must be a number or pixel string"]]
1617
"height" [[v/matches pixel-re :message "Height must be a number or pixel string"]]
17-
"forceTransparentWhite" [[v/matches boolean-re :message "Height must be a boolean or one of the numbers: 0, 1"]]
18+
"forceTransparentWhite" [[v/matches boolean-re :message "Height must be a boolean or one of the numbers: 0, 1"]]
1819
"force-transparent-white" [[v/matches boolean-re :message "Height must be a boolean or one of the numbers: 0, 1"]]
1920
"quality" [[v/matches ratio-re :message "Quality must be in range: 0.1 - 1."]]
2021
})
2122

2223
(defn- available-pdf-size? [size]
2324
(if (nil? size)
2425
true
25-
(contains? available-pdf-sizes (keyword size)))
26-
)
26+
(contains? available-pdf-sizes (keyword size))))
2727

2828
(def ^{:private true} pdf-fields-validations
2929
{"pdfSize" [[available-pdf-size? :message (str "pdfSize must be one of the values:" (clojure.string/join ", " (map name (keys available-pdf-sizes))))]]
@@ -35,8 +35,9 @@
3535
"landscape" [[v/matches boolean-re :message "Landscape must be a boolean or one of the numbers: 0, 1"]]
3636
})
3737

38-
(def ^{:private true} image-params-validations (merge rasterization-data-fields-validations image-fields-validations))
39-
(def ^{:private true} pdf-params-validations (merge rasterization-data-fields-validations pdf-fields-validations))
38+
39+
(def ^{:private true} image-params-validations (merge data-fields-validations image-fields-validations))
40+
(def ^{:private true} pdf-params-validations (merge data-fields-validations pdf-fields-validations))
4041

4142

4243
(defn validate-image-params [params]
@@ -52,6 +53,9 @@
5253
(not (or (contains? params "responseType") (contains? params "response-type"))) [[(str "response-type must be one of the values: " (clojure.string/join ", " (map name available-rasterization-response-types)))]]
5354
:else (bouncer/validate params pdf-params-validations)))
5455

56+
57+
(defn validate-save-data-params [params] (bouncer/validate params data-fields-validations))
58+
5559
(defn valid-result? [result] (nil? (get result 0)))
5660

5761
(defn get-error-message [result] (clojure.string/join "," (get result 0)))

src/export_server/utils/rasterizator.clj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
(:import (org.openqa.selenium WebDriverException)
33
(org.openqa.selenium.phantomjs PhantomJSDriver)
44
(org.openqa.selenium.remote DesiredCapabilities)
5-
(java.io ByteArrayOutputStream)
65
(org.apache.batik.transcoder.image JPEGTranscoder)
76
(org.apache.batik.transcoder.image PNGTranscoder)
87
(org.apache.batik.transcoder TranscoderInput)
98
(org.apache.batik.transcoder TranscoderOutput)
109
(org.apache.batik.transcoder SVGAbstractTranscoder)
11-
(java.lang Float)
1210
(java.io StringReader)
11+
(java.io ByteArrayOutputStream)
12+
(java.lang Float)
1313
)
1414
(:require [clojure.data.codec.base64 :as b64]
1515
[tikkba.transcoder :as transcoder]
@@ -103,7 +103,6 @@
103103
transcoder-input (new TranscoderInput string-reader)
104104
transcoder-output (new TranscoderOutput out)
105105
transcoder (new JPEGTranscoder)]
106-
107106
(.addTranscodingHint transcoder JPEGTranscoder/KEY_QUALITY (float quality))
108107
(.addTranscodingHint transcoder JPEGTranscoder/KEY_WIDTH (float widht))
109108
(.addTranscodingHint transcoder JPEGTranscoder/KEY_HEIGHT (float height))

src/export_server/utils/responce.clj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
".svg" "image/svg+xml"
3232
".pdf" "application/pdf"
3333
".png" "image/png"
34+
".xml" "application/xml"
35+
".json" "application/json"
36+
".csv" "text/csv"
37+
".xls" "application/vnd.ms-excel"
38+
".xlsx" "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
3439
".jpg" "image/jpeg"))
3540
(header "Content-Length" (.length file))
3641
(header "Last-Modified" (format-date (last-modified-date file)))

src/export_server/web_handlers.clj

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
(ns export-server.web-handlers
22
(:require [cheshire.core :refer :all]
33
[compojure.core :refer :all]
4+
[dk.ative.docjure.spreadsheet :as spreadheet]
5+
[clojure.data.csv :as csv-parser]
46
[export-server.utils.responce :refer :all]
57
[export-server.utils.rasterizator :as rastr]
68
[export-server.utils.params-validator :as params-validator]
79
[export-server.utils.config :as config]
8-
[export-server.utils.rasterizator :as rast]))
10+
[export-server.utils.rasterizator :as rast])
11+
(:import (org.apache.commons.io.output ByteArrayOutputStream)))
912

1013

1114
;=======================================================================================================================
1215
; Params to png/jpg/pdf
1316
;=======================================================================================================================
14-
(defn get-number-unit [map key] (Integer/parseInt (first(re-find #"([-+]?[0-9]+)" (map key)))))
17+
(defn get-number-unit [map key] (Integer/parseInt (first (re-find #"([-+]?[0-9]+)" (map key)))))
1518

1619
(def allow-script-executing (atom true))
1720

@@ -21,6 +24,7 @@
2124

2225
(defn get-pdf-size [params]
2326
(cond
27+
(and (contains? params "pdf-width") (contains? params "pdf-height")) [(get-number-unit params "pdf-width") (get-number-unit params "pdf-height")]
2428
(contains? params "pdf-size") (params "pdf-size")
2529
(contains? params "pdfSize") (params "pdfSize")
2630
:else (:pdf-size config/defaults)))
@@ -123,6 +127,9 @@
123127
:else {:ok false :result "Unknown data type"})))
124128

125129

130+
(defn- get-file-name [params] (if (and (contains? params "file-name") (string? (params "file-name"))) (params "file-name") "anychart"))
131+
132+
126133
;=======================================================================================================================
127134
; Handlers
128135
;=======================================================================================================================
@@ -135,11 +142,10 @@
135142
(if (to-png-result :ok)
136143
(if (= response-type "base64")
137144
(json-success (rast/to-base64 (to-png-result :result)))
138-
(file-success (to-png-result :result) "anychart" ".png"))
145+
(file-success (to-png-result :result) (get-file-name params) ".png"))
139146
(json-error (to-png-result :result))))
140-
(json-error (params-validator/get-error-message validation-result)))
141-
)
142-
)
147+
(json-error (params-validator/get-error-message validation-result)))))
148+
143149

144150
(defn jpg [request]
145151
(let [params (request :form-params)
@@ -150,10 +156,11 @@
150156
(if (to-jpg-result :ok)
151157
(if (= response-type "base64")
152158
(json-success (rast/to-base64 (to-jpg-result :result)))
153-
(file-success (to-jpg-result :result) "anychart" ".jpg"))
159+
(file-success (to-jpg-result :result) (get-file-name params) ".jpg"))
154160
(json-error (to-jpg-result :result))))
155161
(json-error (params-validator/get-error-message validation-result)))))
156162

163+
157164
(defn pdf [request]
158165
(let [params (request :form-params)
159166
validation-result (params-validator/validate-pdf-params params)]
@@ -163,11 +170,12 @@
163170
(if (to-pdf-result :ok)
164171
(if (= response-type "base64")
165172
(json-success {:result (rast/to-base64 (to-pdf-result :result))})
166-
(file-success (to-pdf-result :result) "anychart" ".pdf"))
173+
(file-success (to-pdf-result :result) (get-file-name params) ".pdf"))
167174
(json-error (to-pdf-result :result)))
168175
)
169176
(json-error (params-validator/get-error-message validation-result)))))
170177

178+
171179
(defn svg [request]
172180
(let [params (request :form-params)
173181
validation-result (params-validator/validate-image-params params)]
@@ -177,8 +185,45 @@
177185
(if (to-svg-result :ok)
178186
(if (= response-type "base64")
179187
(json-success (rast/to-base64 (.getBytes (to-svg-result :result))))
180-
(file-success (.getBytes (to-svg-result :result)) "anychart" ".svg"))
188+
(file-success (.getBytes (to-svg-result :result)) (get-file-name params) ".svg"))
181189
(json-error (to-svg-result :result)))
182190
)
183191
(json-error (params-validator/get-error-message validation-result)))))
184192

193+
194+
(defn xml [request]
195+
(let [params (request :form-params)
196+
validation-result (params-validator/validate-save-data-params params)]
197+
(if (params-validator/valid-result? validation-result)
198+
(file-success (.getBytes (params "data")) (get-file-name params) ".xml")
199+
(json-error (params-validator/get-error-message validation-result)))))
200+
201+
202+
(defn json [request]
203+
(let [params (request :form-params)
204+
validation-result (params-validator/validate-save-data-params params)]
205+
(if (params-validator/valid-result? validation-result)
206+
(file-success (.getBytes (params "data")) (get-file-name params) ".json")
207+
(json-error (params-validator/get-error-message validation-result)))))
208+
209+
210+
(defn csv [request]
211+
(let [params (request :form-params)
212+
validation-result (params-validator/validate-save-data-params params)]
213+
(if (params-validator/valid-result? validation-result)
214+
(file-success (.getBytes (params "data")) (get-file-name params) ".csv")
215+
(json-error (params-validator/get-error-message validation-result)))))
216+
217+
218+
(defn xlsx [request]
219+
(let [params (request :form-params)
220+
file-name (get-file-name params)
221+
validation-result (params-validator/validate-save-data-params params)]
222+
(if (params-validator/valid-result? validation-result)
223+
(let [csv (csv-parser/read-csv (params "data"))
224+
wb (spreadheet/create-workbook file-name csv)
225+
output (new ByteArrayOutputStream)]
226+
(spreadheet/save-workbook! output wb)
227+
(file-success (.toByteArray output) file-name ".xlsx"))
228+
(json-error (params-validator/get-error-message validation-result)))))
229+

0 commit comments

Comments
 (0)