From f3868f9d7be48f24a1505cd596f5b73ae733e916 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Tue, 16 Jul 2024 17:13:02 +0200 Subject: Add PDF cover creation system --- Makefile.scm | 29 +++++++++++++++++++++++++++-- utils/cover/cover.scm | 28 +++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/Makefile.scm b/Makefile.scm index 6a40e43..72565b4 100644 --- a/Makefile.scm +++ b/Makefile.scm @@ -4,6 +4,7 @@ exec chibi-scheme -A utils/ $0 $@ |# (import (chibi) (chibi json) + (chibi string) (only (chibi filesystem) directory-files create-directory* @@ -11,7 +12,6 @@ exec chibi-scheme -A utils/ $0 $@ (chibi process) (only (chibi pathname) path-strip-directory path-extension make-path) ;(chibi app) - (only (chibi string) string-prefix? string-trim-right string-join) (prefix (chibi io) io:) (utils cover cover) (srfi 1) @@ -180,6 +180,20 @@ exec chibi-scheme -A utils/ $0 $@ files) "Error in ebook creation"))) +(define (get-print-box svg-file) + "SVG covers have a rectangle `meta-content-box` prepared to serve as the + printing bounding box. Its position is the (x0,y0) and (width,height) is + (x1,y1). This function extracts that information." + (string-join + (string-split + (process->string-or-fail + `("inkscape" + ,svg-file + "-I" "meta-content-box" + "-XYWH") + "Error: impossible to extract cover printing bounding box") + #\newline) + ":")) (define (make-cover lang output input) (let* ((outpath (make-path output lang)) (files (directory-sources lang input)) @@ -197,7 +211,18 @@ exec chibi-scheme -A utils/ $0 $@ "--export-filename" ,(make-path outpath "cover.pdf") "--export-type=pdf" ,svg-file)) - "Error in cover creation"))) + "Error in PDF cover creation") + + (process->string-or-fail + (append + `("inkscape" + ,svg-file + "--export-filename" ,(make-path outpath "cover.png") + "--export-type=png" + "--export-background=white" + "--export-background-opacity=1.0" + "--export-area" ,(get-print-box svg-file))) + "Error in PNG cover creation"))) (define (build-lang lang output input) (pandoc-web lang output input) diff --git a/utils/cover/cover.scm b/utils/cover/cover.scm index 915f42a..65769a5 100644 --- a/utils/cover/cover.scm +++ b/utils/cover/cover.scm @@ -140,8 +140,12 @@ (style (string-append " + #meta-content-box{ + stroke: none; + fill: none; + } .margin-mark { - stroke-width: 0.1; + stroke-width: 0.1mm; stroke-linecap: butt; stroke: red; } @@ -245,6 +249,8 @@ ;; CUTTING MARKS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ,(map (lambda (posx posy rot) + (let* ((margin (- margin 0.1)) + (len (* 0.6 margin))) `(g (@ (id ,(string-append "marks-" (num posx) "-" @@ -253,15 +259,15 @@ (line (@ (x1 ,(+ posx)) (y1 ,(+ posy margin)) - (x2 ,(+ posx (* 0.6 margin))) + (x2 ,(+ posx len)) (y2 ,(+ posy margin)) (class "margin-mark"))) (line (@ (x1 ,(+ posx margin)) (y1 ,(+ posy)) (x2 ,(+ posx margin)) - (y2 ,(+ posy (* 0.6 margin))) - (class "margin-mark"))))) + (y2 ,(+ posy len)) + (class "margin-mark")))))) (list 0 0 width width) (list 0 height 0 height) @@ -272,7 +278,19 @@ (num height) ")"))) - ;; BACK SIDE + ; NOTE: + ; This element simulates the offset and size of the full page inside + ; the svg file. + ; inkscape cover.svg -I meta-content-box -XYWH + ; will return the bounding box of the printable part of the file in + ; X0\nY0\nX1\nY1 format + (rect (@ (id "meta-content-box") + (x ,margin) + (y ,margin) + (width ,(- width margin)) + (height ,(- height margin)))) + + ;; BACK SIDE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; TITLE + BOOK SUMMARY -- cgit v1.2.3