#lang debug racket/base (require racket/dict racket/match "reference.rkt" sugar/unstable/dict "core.rkt") (provide (all-defined-out)) (define (current-page doc) (match (pdf-pages doc) [(? pair? ps) (car ps)] [_ (raise-argument-error 'current-page "pdf with pages in it" doc)])) (define (add-content doc data) (page-write (current-page doc) data)) (struct $page (page-parent width height content resources ref) #:transparent #:mutable) (define (make-page #:parent [page-parent #false] #:width [width 612.0] #:height [height 792.0]) (define content (make-ref)) (define resources (make-ref (mhash 'ProcSet '(PDF Text ImageB ImageC ImageI)))) (define page-ref (make-ref (mhasheq 'Type 'Page 'Parent page-parent 'MediaBox (list 0 0 width height) 'Contents content 'Resources resources))) ($page page-parent width height content resources page-ref)) (define (page-fonts p) (dict-ref! ($page-resources p) 'Font (make-hasheq))) (define (page-xobjects p) (dict-ref! ($page-resources p) 'XObject (make-hasheq))) (define (page-ext_gstates p) (dict-ref! ($page-resources p) 'ExtGState (make-hasheq))) (define (page-patterns p) (dict-ref! ($page-resources p) 'Pattern (make-hasheq))) (define (page-annotations p [annot #f]) (if annot (dict-update! ($page-ref p) 'Annots (λ (val) (cons annot val)) null) (dict-ref! ($page-ref p) 'Annots null))) (define (page-write p chunk) (ref-write ($page-content p) chunk)) (define (page-end p) (ref-end ($page-ref p)) (ref-end ($page-resources p)) (ref-end ($page-content p))) (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)))