You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/pitfall/pitfall/page.rkt

123 lines
4.0 KiB
Racket

6 years ago
#lang debug racket/base
(require
racket/class
racket/contract
sugar/unstable/class
sugar/unstable/js
sugar/unstable/dict)
(provide PDFPage)
6 years ago
(struct margin (top left bottom right) #:transparent #:mutable)
(define PDFPage
(class object%
(super-new)
6 years ago
(init-field @doc [@page-parent #false] [@options (mhash)])
(field [(@size size) (hash-ref @options 'size "letter")]
[(@layout layout) (hash-ref @options 'layout "portrait")]
[@dimensions (if (list? @size)
@size
(hash-ref page-sizes (string-upcase @size)))]
[(@width width) (list-ref @dimensions (if (equal? @layout "portrait") 0 1))]
[(@height height) (list-ref @dimensions (if (equal? @layout "portrait") 1 0))]
[@content (send @doc ref)]
[(@resources resources) (send @doc ref (mhash 'ProcSet '("PDF" "Text" "ImageB" "ImageC" "ImageI")))]
[(@margins margins)
(let ([margin-value (hash-ref @options 'margin #f)])
(if (number? margin-value)
6 years ago
(margin margin-value margin-value margin-value margin-value)
;; default to 1 inch margins
6 years ago
(hash-ref @options 'margins default-margins)))]
7 years ago
;; The page dictionary
6 years ago
[(@dictionary dictionary)
(send @doc ref
(mhash 'Type "Page"
6 years ago
'Parent @page-parent
'MediaBox (list 0 0 @width @height)
'Contents @content
'Resources @resources))])
7 years ago
6 years ago
;; Lazily create these dictionaries
(define/public (fonts)
(send @resources get-key! 'Font (make-hasheq)))
7 years ago
6 years ago
(define/public (xobjects)
(send @resources get-key! 'XObject (make-hasheq)))
7 years ago
6 years ago
(define/public (ext_gstates)
(send @resources get-key! 'ExtGState (make-hasheq)))
7 years ago
6 years ago
(define/public (patterns)
(send @resources get-key! 'Pattern (make-hasheq)))
7 years ago
6 years ago
(define/public (annotations [annot #f])
(if annot
(send @dictionary update-key! 'Annots (λ (val) (cons annot val)) null)
(send @dictionary get-key! 'Annots null)))
7 years ago
6 years ago
(define/public (maxY)
(- @height (margin-bottom @margins)))
7 years ago
6 years ago
(define/public (write chunk)
(send @content write chunk))
7 years ago
6 years ago
(define/public (end)
(send @dictionary end)
(send @resources end)
(send @content end))))
7 years ago
6 years ago
(define default-margins (margin 72 72 72 72))
7 years ago
(define page-sizes
(hash "4A0" '(4767.87 6740.79)
"2A0" '(3370.39 4767.87)
"A0" '(2383.94 3370.39)
"A1" '(1683.78 2383.94)
"A2" '(1190.55 1683.78)
"A3" '(841.89 1190.55)
"A4" '(595.28 841.89)
"A5" '(419.53 595.28)
"A6" '(297.64 419.53)
"A7" '(209.76 297.64)
"A8" '(147.40 209.76)
"A9" '(104.88 147.40)
"A10" '(73.70 104.88)
"B0" '(2834.65 4008.19)
"B1" '(2004.09 2834.65)
"B2" '(1417.32 2004.09)
"B3" '(1000.63 1417.32)
"B4" '(708.66 1000.63)
"B5" '(498.90 708.66)
"B6" '(354.33 498.90)
"B7" '(249.45 354.33)
"B8" '(175.75 249.45)
"B9" '(124.72 175.75)
"B10" '(87.87 124.72)
"C0" '(2599.37 3676.54)
"C1" '(1836.85 2599.37)
"C2" '(1298.27 1836.85)
"C3" '(918.43 1298.27)
"C4" '(649.13 918.43)
"C5" '(459.21 649.13)
"C6" '(323.15 459.21)
"C7" '(229.61 323.15)
"C8" '(161.57 229.61)
"C9" '(113.39 161.57)
"C10" '(79.37 113.39)
"RA0" '(2437.80 3458.27)
"RA1" '(1729.13 2437.80)
"RA2" '(1218.90 1729.13)
"RA3" '(864.57 1218.90)
"RA4" '(609.45 864.57)
"SRA0" '(2551.18 3628.35)
"SRA1" '(1814.17 2551.18)
"SRA2" '(1275.59 1814.17)
"SRA3" '(907.09 1275.59)
"SRA4" '(637.80 907.09)
"EXECUTIVE" '(521.86 756.00)
"FOLIO" '(612.00 936.00)
"LEGAL" '(612.00 1008.00)
"LETTER" '(612.00 792.00)
"TABLOID" '(792.00 1224.00)))