pdf

  1. pdf
    1. description
    2. author
    3. requirements
    4. examples

description

An egg for PDF generation

author

Marc Battyani and Bruce Butterfield

requirements

None

examples

(require-library pdf)
(import (prefix pdf pdf:))
(define-constant pi 3.14159) ; Maybe use mathh egg?

(define-syntax dotimes
  (syntax-rules ()
    ((_ (index maxval) body ...)
     (do ((index 0 (+ index 1)))
       ((= index maxval))
       body ...))))

(define (ex1)
  (pdf:with-document-to-file "ex1.pdf"
   (let ((helvetica (pdf:build-font "Helvetica"))
         (courier (pdf:build-font "Courier")))
     (pdf:with-page
      (pdf:in-text-mode
       (pdf:set-font (pdf:font-name helvetica) 36)
       (pdf:move-text 100 750)
       (pdf:draw-text "scm-pdf: Example 1"))
      (pdf:in-text-mode
       (dotimes (i 25)
                    (pdf:set-font (pdf:font-name helvetica) (* i 1.5))
                    (pdf:move-text (+ i 5) (+ i 10))
                    (pdf:draw-text "Helvetica")))
      (pdf:in-text-mode
       (dotimes (i 25)
                    (pdf:set-font (pdf:font-name courier) (* i 1.5))
                    (pdf:move-text (+ i 5) (- 50 (+ i 10)))
                    (pdf:draw-text "Courier")))))))

(define (ex2)
  (pdf:with-document-to-file "ex2.pdf"
   (let ((helvetica (pdf:build-font "Helvetica")))
     (pdf:with-page
      (pdf:in-text-mode
       (pdf:set-font (pdf:font-name helvetica) 36)
       (pdf:move-text 100 750)
       (pdf:draw-text "scm-pdf: Example 2"))
      (pdf:translate 230 500)
      (do ((j 0 (+ j 1))
           (i 0.67 (* i 1.045)))
        ((= j 101))
        (pdf:in-text-mode
         (pdf:set-font (pdf:font-name helvetica) i)
         (pdf:move-text (* i 3) 0)
         (pdf:draw-text "rotation"))
        (pdf:rotate 18)))
     (pdf:with-page
      (pdf:in-text-mode
       (pdf:set-font (pdf:font-name helvetica) 40)
       (pdf:move-text 230 500)
       (pdf:draw-text "That's All, Folks!"))))))

(define (ex3)
  (pdf:with-document-to-file "ex3.pdf"
   (let ((helvetica (pdf:build-font "Helvetica")))
     (pdf:with-page (800 1000)
      (pdf:in-text-mode
       (pdf:set-font (pdf:font-name helvetica) 36.0)
       (pdf:move-text 100 900)
       (pdf:draw-text "scm-pdf: Example 3"))
      (pdf:move-to (+ 10 (random 500))(+ 10 (random 400)))
      (pdf:set-gray-fill 0.5)
      (dotimes (i 50)
               (pdf:line-to (+ 50 (random 500)) (+ 50 (random 400))))
      (pdf:close-even-odd-fill-and-stroke)
      (pdf:move-to (+ 50 (random 500))(+ 400 (random 400)))
      (pdf:set-rgb-fill 0.5 0.5 0.8)
      (pdf:set-rgb-stroke 0.9 0.5 0.1)
      (dotimes (i 50)
               (pdf:bezier2-to (+ 50 (random 500)) (+ 400 (random 400))
                           (+ 50 (random 500)) (+ 400 (random 400))))
      (pdf:close-even-odd-fill-and-stroke)))))

(define (ex4)
  (pdf:with-document-to-file "ex4.pdf"
   (let ((helvetica (pdf:build-font "Helvetica")))
     (pdf:with-page
       (pdf:in-text-mode
        (pdf:set-font (pdf:font-name helvetica) 36.0)
        (pdf:move-text 100 750)
        (pdf:draw-text "scm-pdf: Example 4"))
       (pdf:set-rgb-stroke 0.1 0.1 0.1)
       (pdf:set-rgb-fill 0.8 0.8 0.8)
       (let ((x 50) (y 600))
         (dotimes (i 2)
                  (pdf:rectangle x y 500 140 10)
                  (pdf:close-fill-and-stroke)
                  (set! y (- y 180))))
       (pdf:translate 50 670)
       (let ((x 50) (y 0))
         (do ((i 0 (+ i 1))
              (j 8 (* j 1.05)))
           ((= i 4))
           (pdf:set-rgb-fill (* 0.1 j) (* 0.01 j) (* 0.02 j))
           (pdf:circle x y (* 4 j))
           (pdf:close-fill-and-stroke)
           (pdf:ellipse (+ x 250) y (* 5 j) (* 4 j))
           (pdf:close-fill-and-stroke)
           (set! x (+ x 50))))
       
       (pdf:translate 0 -180)
       (pdf:regular-polygon 150 0 50 7 8)
       (pdf:close-fill-and-stroke)
       (pdf:star 350 0 50 30 6 5)
       (pdf:close-fill-and-stroke)
       
       (pdf:set-rgb-fill 0.8 0.6 0.2)
       (pdf:regular-polygon 150 0 30 5 4)
       (pdf:close-fill-and-stroke)
       (pdf:star 350 0 40 20 4 6)
       (pdf:close-fill-and-stroke)
       
       (pdf:set-rgb-fill 0.4 0.8 0.7)
       (pdf:regular-polygon 150 0 15 3 3)
       (pdf:close-fill-and-stroke)
       (pdf:star 350 0 35 10 12 1)
       (pdf:close-fill-and-stroke)
       
       (pdf:set-line-width 0.5)
       (do ((r 2 (+ r 2)))
         ((= r 100))
         (pdf:set-rgb-stroke (* 0.01 (random 100))
                             (* 0.01 (random 100))
                             (* 0.01 (random 100)))
         (pdf:arc 250 -230 r (* pi 0.001 (random 2000))
                             (* pi 0.001 (random 2000)))
         (pdf:stroke))))))


(ex1)
(ex2)
(ex3)
(ex4)