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.
124 lines
3.1 KiB
CoffeeScript
124 lines
3.1 KiB
CoffeeScript
7 years ago
|
###
|
||
|
PDFPage - represents a single page in the PDF document
|
||
|
By Devon Govett
|
||
|
###
|
||
|
|
||
|
class PDFPage
|
||
|
constructor: (@document, options = {}) ->
|
||
|
@size = options.size or 'letter'
|
||
|
@layout = options.layout or 'portrait'
|
||
|
|
||
|
# process margins
|
||
|
if typeof options.margin is 'number'
|
||
|
@margins =
|
||
|
top: options.margin
|
||
|
left: options.margin
|
||
|
bottom: options.margin
|
||
|
right: options.margin
|
||
|
|
||
|
# default to 1 inch margins
|
||
|
else
|
||
|
@margins = options.margins or DEFAULT_MARGINS
|
||
|
|
||
|
# calculate page dimensions
|
||
|
dimensions = if Array.isArray(@size) then @size else SIZES[@size.toUpperCase()]
|
||
|
@width = dimensions[if @layout is 'portrait' then 0 else 1]
|
||
|
@height = dimensions[if @layout is 'portrait' then 1 else 0]
|
||
|
|
||
|
@content = @document.ref()
|
||
|
|
||
|
# Initialize the Font, XObject, and ExtGState dictionaries
|
||
|
@resources = @document.ref
|
||
|
ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI']
|
||
|
|
||
|
# Lazily create these dictionaries
|
||
|
Object.defineProperties this,
|
||
|
fonts:
|
||
|
get: => @resources.data.Font ?= {}
|
||
|
xobjects:
|
||
|
get: => @resources.data.XObject ?= {}
|
||
|
ext_gstates:
|
||
|
get: => @resources.data.ExtGState ?= {}
|
||
|
patterns:
|
||
|
get: => @resources.data.Pattern ?= {}
|
||
|
annotations:
|
||
|
get: => @dictionary.data.Annots ?= []
|
||
|
|
||
|
# The page dictionary
|
||
|
@dictionary = @document.ref
|
||
|
Type: 'Page'
|
||
|
Parent: @document._root.data.Pages
|
||
|
MediaBox: [0, 0, @width, @height]
|
||
|
Contents: @content
|
||
|
Resources: @resources
|
||
|
|
||
|
maxY: ->
|
||
|
@height - @margins.bottom
|
||
|
|
||
|
write: (chunk) ->
|
||
|
@content.write chunk
|
||
|
|
||
|
end: ->
|
||
|
@dictionary.end()
|
||
|
@resources.end()
|
||
|
@content.end()
|
||
|
|
||
|
DEFAULT_MARGINS =
|
||
|
top: 72
|
||
|
left: 72
|
||
|
bottom: 72
|
||
|
right: 72
|
||
|
|
||
|
SIZES =
|
||
|
'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]
|
||
|
|
||
|
module.exports = PDFPage
|