author  rgbecker 
Wed, 25 Oct 2000 08:57:46 +0000  
changeset 494  54257447cfe9 
parent 484  cc20a344973c 
child 500  58d712fef651 
permissions  rwxrxrx 
494  1 
#copyright ReportLab Inc. 2000 
2 
#see license.txt for license details 

3 
#history http://cvs.sourceforge.net/cgibin/cvsweb.cgi/reportlab/pdfbase/pdfdoc.py?cvsroot=reportlab 

4 
#$Header: /tmp/reportlab/reportlab/pdfbase/pdfdoc.py,v 1.30 2000/10/25 08:57:45 rgbecker Exp $ 

5 
__version__=''' $Id: pdfdoc.py,v 1.30 2000/10/25 08:57:45 rgbecker Exp $ ''' 

16  6 
__doc__=""" 
0  7 
PDFgen is a library to generate PDF files containing text and graphics. It is the 
8 
foundation for a complete reporting solution in Python. 

9 

10 
The module pdfdoc.py handles the 'outer structure' of PDF documents, ensuring that 

11 
all objects are properly crossreferenced and indexed to the nearest byte. The 

12 
'inner structure'  the page descriptions  are presumed to be generated before 

13 
each page is saved. 

14 
pdfgen.py calls this and provides a 'canvas' object to handle page marking operators. 

15 
piddlePDF calls pdfgen and offers a highlevel interface. 

16 

17 
20001013 gmcm Packagize 

18 
""" 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

19 
"""extremely anally retentive structured version of pdfdoc""" 
0  20 

181
62d7a443cbc4
Added font encoding support and changed default encoding to WinAnsi
andy_robinson
parents:
175
diff
changeset

21 
DEFAULT_ENCODING = 'WinAnsiEncoding' #hack here for a system wide change 
62d7a443cbc4
Added font encoding support and changed default encoding to WinAnsi
andy_robinson
parents:
175
diff
changeset

22 
ALLOWED_ENCODINGS = ('WinAnsiEncoding', 'MacRomanEncoding') 
0  23 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

24 
PDFError = 'PDFError' 
0  25 

26 
StandardEnglishFonts = [ 

27 
'Courier', 'CourierBold', 'CourierOblique', 'CourierBoldOblique', 

28 
'Helvetica', 'HelveticaBold', 'HelveticaOblique', 

29 
'HelveticaBoldOblique', 

30 
'TimesRoman', 'TimesBold', 'TimesItalic', 'TimesBoldItalic', 

31 
'Symbol','ZapfDingbats'] 

32 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

33 
# set this flag to get more vertical whitespace (and larger files) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

34 
LongFormat = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

35 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

36 
# XXXX stream filters need to be added 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

37 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

38 
# __InternalName__ is a special attribute that can only be set by the Document arbitrator 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

39 
__InternalName__ = "__InternalName__" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

40 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

41 
# __RefOnly__ marks reference only elements that must be formatted on top level 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

42 
__RefOnly__ = "__RefOnly__" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

43 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

44 
# __Comment__ provides a (one line) comment to inline with an object ref, if present 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

45 
# if it is more than one line then percentize it... 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

46 
__Comment__ = "__Comment__" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

47 
DoComments = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

48 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

49 
# name for standard font dictionary 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

50 
BasicFonts = "BasicFonts" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

51 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

52 
# name for the pages object 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

53 
Pages = "Pages" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

54 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

55 
### generic utilities 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

56 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

57 
import string, types 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

58 
from reportlab.pdfbase import pdfutils 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

59 
from reportlab.pdfbase.pdfutils import LINEEND # this constant needed in both 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

60 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

61 
# for % substitutions 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

62 
LINEENDDICT = {"LINEEND": LINEEND, "PERCENT": "%"} 
0  63 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

64 
def markfilename(filename): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

65 
# with the Mac, we need to tag the file in a special 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

66 
#way so the system knows it is a PDF file. 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

67 
#This supplied by Joe Strout 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

68 
import os 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

69 
if os.name == 'mac': 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

70 
import macfs 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

71 
try: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

72 
macfs.FSSpec(filename).SetCreatorType('CARO','PDF ') 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

73 
except: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

74 
pass 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

75 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

76 
def format(element, document, toplevel=0): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

77 
"""Indirection step for formatting. 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

78 
Ensures that document parameters alter behaviour 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

79 
of formatting for all elements. 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

80 
""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

81 
from types import InstanceType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

82 
if type(element) is InstanceType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

83 
if not toplevel and hasattr(element, __RefOnly__): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

84 
# the object cannot be a component at non top level. 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

85 
# make a reference to it and return it's format 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

86 
R = document.Reference(element) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

87 
return R.format(document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

88 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

89 
try: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

90 
fmt = element.format 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

91 
except: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

92 
raise AttributeError, "%s has no format operation" % element 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

93 
f = fmt(document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

94 
if DoComments and hasattr(element, __Comment__): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

95 
f = "%s%s%s%s" % ("% ", element.__Comment__, LINEEND, f) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

96 
return f 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

97 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

98 
return str(element) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

99 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

100 
def indent(s, IND=LINEEND+" "): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

101 
return string.replace(s, LINEEND, IND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

102 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

103 
### the global document structure manager 
0  104 

105 
class PDFDocument: 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

106 
objectcounter = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

107 
inObject = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

108 
# set this to define filters 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

109 
defaultStreamFilters = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

110 
pageCounter = 1 
483
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

111 
def __init__(self, encoding=DEFAULT_ENCODING, dummyoutline=0): 
484  112 
#self.defaultStreamFilters = [PDFBase85Encode, PDFZCompress] # for testing! 
113 
#self.defaultStreamFilters = [PDFZCompress] # for testing! 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

114 
self.encoding = encoding 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

115 
# mapping of internal identifier ("Page001") to PDF objectnumber and generation number (34, 0) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

116 
self.idToObjectNumberAndVersion = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

117 
# mapping of internal identifier ("Page001") to PDF object (PDFPage instance) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

118 
self.idToObject = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

119 
# internal id to file location 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

120 
self.idToOffset = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

121 
# number to id 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

122 
self.numberToId = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

123 
cat = self.Catalog = self._catalog = PDFCatalog() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

124 
pages = self.Pages = PDFPages() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

125 
cat.Pages = pages 
483
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

126 
if dummyoutline: 
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

127 
outlines = PDFOutlines0() 
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

128 
else: 
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

129 
outlines = PDFOutlines() 
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

130 
self.Outlines = self.outline = outlines 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

131 
cat.Outlines = outlines 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

132 
self.info = self.Info = PDFInfo() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

133 
self.Reference(self.Catalog) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

134 
self.Reference(self.Info) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

135 
# make std fonts (this could be made optional 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

136 
self.fontMapping = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

137 
MakeStandardEnglishFontObjects(self, encoding) 
0  138 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

139 
def SaveToFile(self, filename, canvas): 
483
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

140 
# prepare outline 
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

141 
outline = self.outline 
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

142 
outline.prepare(self, canvas) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

143 
from types import StringType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

144 
if type(filename) is StringType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

145 
myfile = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

146 
f = open(filename, "wb") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

147 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

148 
myfile = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

149 
f = filename # IT BETTER BE A FILELIKE OBJECT! 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

150 
txt = self.format() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

151 
f.write(txt) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

152 
if myfile: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

153 
f.close() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

154 
markfilename(filename) # do platform specific file junk 
0  155 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

156 
def inPage(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

157 
"""specify the current object as a page (enables reference binding and other page features)""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

158 
if self.inObject is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

159 
if self.inObject=="page": return 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

160 
raise ValueError, "can't go in page already in object %s" % self.inObject 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

161 
self.inObject = "page" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

162 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

163 
def inForm(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

164 
"""specify that we are in a form xobject (disable page features, etc)""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

165 
if self.inObject not in ["form", None]: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

166 
raise ValueError, "can't go in form already in object %s" % self.inObject 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

167 
self.inObject = "form" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

168 
# don't need to do anything else, I think... 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

169 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

170 
def getInternalFontName(self, psfontname): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

171 
fm = self.fontMapping 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

172 
if fm.has_key(psfontname): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

173 
return fm[psfontname] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

174 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

175 
raise PDFError, "Font %s not available in document" % repr(psfontname) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

176 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

177 
def thisPageName(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

178 
return "Page"+repr(self.pageCounter) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

179 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

180 
def thisPageRef(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

181 
return PDFObjectReference(self.thisPageName()) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

182 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

183 
def addPage(self, page): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

184 
name = self.thisPageName() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

185 
self.Reference(page, name) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

186 
self.Pages.addPage(page) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

187 
self.pageCounter = self.pageCounter+1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

188 
self.inObject = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

189 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

190 
def formName(self, externalname): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

191 
return "FormXob.%s" % externalname 
0  192 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

193 
def addForm(self, name, form): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

194 
"""add a Form XObject.""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

195 
# XXX should check that name is a legal PDF name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

196 
if self.inObject != "form": 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

197 
self.inForm() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

198 
self.Reference(form, self.formName(name)) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

199 
self.inObject = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

200 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

201 
def annotationName(self, externalname): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

202 
return "Annot.%s"%externalname 
0  203 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

204 
def addAnnotation(self, name, annotation): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

205 
self.Reference(annotation, self.annotationName(name)) 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

206 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

207 
def refAnnotation(self, name): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

208 
internalname = self.annotationName(name) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

209 
return PDFObjectReference(internalname) 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

210 

0  211 
def setTitle(self, title): 
212 
"embeds in PDF file" 

213 
self.info.title = title 

214 

215 
def setAuthor(self, author): 

216 
"embedded in PDF file" 

217 
self.info.author = author 

218 

219 
def setSubject(self, subject): 

220 
"embeds in PDF file" 

221 
self.info.subject = subject 

222 

223 
def getAvailableFonts(self): 

224 
fontnames = self.fontMapping.keys() 

225 
fontnames.sort() 

226 
return fontnames 

227 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

228 
def format(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

229 
# register the Catalog/INfo and then format the objects one by one until exhausted 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

230 
# (possible infinite loop if there is a bug that continually makes new objects/refs...) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

231 
cat = self.Catalog 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

232 
info = self.Info 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

233 
self.Reference(self.Catalog) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

234 
self.Reference(self.Info) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

235 
# make std fonts (this could be made optional 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

236 
counter = 0 # start at first object (object 1 after preincrement) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

237 
ids = [] # the collection of object ids in object number order 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

238 
numbertoid = self.numberToId 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

239 
idToNV = self.idToObjectNumberAndVersion 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

240 
idToOb = self.idToObject 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

241 
idToOf = self.idToOffset 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

242 
### note that new entries may be "appended" DURING FORMATTING 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

243 
done = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

244 
File = PDFFile() # output collector 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

245 
while done is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

246 
counter = counter+1 # do next object... 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

247 
if numbertoid.has_key(counter): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

248 
id = numbertoid[counter] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

249 
#printidToOb 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

250 
obj = idToOb[id] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

251 
IO = PDFIndirectObject(id, obj) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

252 
IOf = IO.format(self) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

253 
# add a comment to the PDF output 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

254 
if DoComments: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

255 
File.add("%% %s %s %s" % (repr(id), repr(repr(obj)[:50]), LINEEND)) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

256 
offset = File.add(IOf) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

257 
idToOf[id] = offset 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

258 
ids.append(id) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

259 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

260 
done = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

261 
# sanity checks (must happen AFTER formatting) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

262 
lno = len(numbertoid) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

263 
if counter1!=lno: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

264 
raise ValueError, "counter %s doesn't match number to id dictionary %s" %(counter, lno) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

265 
# now add the xref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

266 
xref = PDFCrossReferenceTable() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

267 
xref.addsection(0, ids) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

268 
xreff = xref.format(self) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

269 
xrefoffset = File.add(xreff) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

270 
# now add the trailer 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

271 
trailer = PDFTrailer( 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

272 
startxref = xrefoffset, 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

273 
Size = lno, 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

274 
Root = self.Reference(cat), 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

275 
Info = self.Reference(info) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

276 
) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

277 
trailerf = trailer.format(self) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

278 
File.add(trailerf) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

279 
# return string format for pdf file 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

280 
return File.format(self) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

281 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

282 
def hasForm(self, name): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

283 
"""test for existence of named form""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

284 
internalname = self.formName(name) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

285 
try: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

286 
test = self.idToObject[internalname] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

287 
except: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

288 
return 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

289 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

290 
return internalname 
0  291 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

292 
def xobjDict(self, formnames): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

293 
"""construct an xobject dict (for inclusion in a resource dict, usually) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

294 
from a list of form names (images not yet supported)""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

295 
D = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

296 
for name in formnames: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

297 
internalname = self.formName(name) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

298 
reference = PDFObjectReference(internalname) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

299 
D[internalname] = reference 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

300 
#print "xobjDict D", D 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

301 
return PDFDictionary(D) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

302 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

303 
def Reference(self, object, name=None): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

304 
### note references may "grow" during the final formatting pass: don't use d.keys()! 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

305 
# don't make references to other references, or non instances 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

306 
from types import InstanceType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

307 
#print"object type is ", type(object) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

308 
tob = type(object) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

309 
if (tob is not InstanceType) or (tob is InstanceType and object.__class__ is PDFObjectReference): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

310 
return object 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

311 
idToObject = self.idToObject 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

312 
if hasattr(object, __InternalName__): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

313 
# already registered 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

314 
intname = object.__InternalName__ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

315 
if name is not None and name!=intname: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

316 
raise ValueError, "attempt to reregister object %s with new name %s" % ( 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

317 
repr(intname), repr(name)) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

318 
if not idToObject.has_key(intname): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

319 
raise ValueError, "object named but not registered" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

320 
return PDFObjectReference(intname) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

321 
# otherwise register the new object 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

322 
objectcounter = self.objectcounter = self.objectcounter+1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

323 
if name is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

324 
name = "R"+repr(objectcounter) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

325 
if idToObject.has_key(name): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

326 
raise ValueError, "redefining named object: "+repr(name) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

327 
object.__InternalName__ = name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

328 
self.idToObjectNumberAndVersion[name] = (objectcounter, 0) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

329 
self.numberToId[objectcounter] = name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

330 
idToObject[name] = object 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

331 
return PDFObjectReference(name) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

332 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

333 
### chapter 4 Objects 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

334 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

335 
PDFtrue = "true" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

336 
PDFfalse = "false" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

337 
PDFnull = "null" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

338 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

339 
def PDFnumber(n): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

340 
return n 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

341 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

342 
def PDFString(str): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

343 
# might need to change this to class for encryption 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

344 
return "(%s)" % pdfutils._escape(str) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

345 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

346 
def PDFName(data): 
484  347 
# might need to change this to class for encryption 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

348 
# first convert the name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

349 
ldata = list(data) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

350 
index = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

351 
for thischar in data: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

352 
if 0x21<=ord(thischar)<=0x7e and thischar not in "%()<>{}[]#": 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

353 
pass # no problemo 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

354 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

355 
hexord = hex(ord(thischar))[2:] # forget the 0x thing... 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

356 
ldata[index] = "#"+hexord 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

357 
index = index+1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

358 
data = string.join(ldata, "") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

359 
return "/%s" % data 
0  360 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

361 
class PDFDictionary: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

362 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

363 
multiline = LongFormat 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

364 
def __init__(self, dict=None): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

365 
"""dict should be namestring to value eg "a": 122 NOT pdfname to value NOT "/a":122""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

366 
if dict is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

367 
self.dict = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

368 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

369 
self.dict = dict.copy() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

370 
def __setitem__(self, name, value): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

371 
self.dict[name] = value 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

372 
def Reference(name, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

373 
ob = self.dict[name] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

374 
self.dict[name] = document.Reference(ob) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

375 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

376 
dict = self.dict 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

377 
keys = dict.keys() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

378 
keys.sort() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

379 
L = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

380 
a = L.append 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

381 
for k in keys: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

382 
v = dict[k] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

383 
fv = format(v, document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

384 
fk = format(PDFName(k), document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

385 
a(fk) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

386 
a(" "+fv) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

387 
#L = map(str, L) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

388 
if self.multiline: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

389 
Lj = string.join(L, LINEEND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

390 
Lj = indent(Lj) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

391 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

392 
Lj = L 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

393 
# break up every 6 elements anyway 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

394 
for i in range(6, len(Lj), 6): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

395 
Lj.insert(i,LINEEND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

396 
Lj = string.join(L, " ") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

397 
return "<< %s >>" % Lj 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

398 

484  399 
# stream filters are objects to support round trip and 
400 
# possibly in the future also support parameters 

401 
class PDFStreamFilterZCompress: 

402 
pdfname = "FlateDecode" 

403 
def encode(self, text): 

404 
try: 

405 
from zlib import compress 

406 
except: 

407 
raise ImportError, "cannot zcompress zlib unavailable" 

408 
return compress(text) 

409 
def decode(self, encoded): 

410 
try: 

411 
from zlib import decompress 

412 
except: 

413 
raise ImportError, "cannot zcompress zlib unavailable" 

414 
return decompress(encoded) 

415 

416 
# need only one of these, unless we implement parameters later 

417 
PDFZCompress = PDFStreamFilterZCompress() 

418 

419 
class PDFStreamFilterBase85Encode: 

420 
pdfname = "ASCII85Decode" 

421 
def encode(self, text): 

422 
from pdfutils import _AsciiBase85Encode, _wrap 

423 
return _wrap(_AsciiBase85Encode(text)) 

424 
def decode(self, text): 

425 
from pdfutils import _AsciiBase85Decode 

426 
return _AsciiBase85Decode(text) 

427 

428 
# need only one of these too 

429 
PDFBase85Encode = PDFStreamFilterBase85Encode() 

430 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

431 
STREAMFMT = ("%(dictionary)s%(LINEEND)s" # dictionary 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

432 
"stream" # stream keyword 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

433 
"%(LINEEND)s" # a line end (could be just a \n) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

434 
"%(content)s" # the content, with no lineend 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

435 
"endstream%(LINEEND)s" # the endstream keyword 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

436 
) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

437 
class PDFStream: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

438 
'''set dictionary elements explicitly stream.dictionary[name]=value''' 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

439 
### compression stuff not implemented yet 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

440 
__RefOnly__ = 1 # must be at top level 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

441 
def __init__(self, dictionary=None, content=None): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

442 
if dictionary is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

443 
dictionary = PDFDictionary() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

444 
self.dictionary = dictionary 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

445 
self.content = content 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

446 
self.filters = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

447 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

448 
dictionary = self.dictionary 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

449 
content = self.content 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

450 
filters = self.filters 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

451 
if self.content is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

452 
raise ValueError, "stream content not set" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

453 
if filters is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

454 
filters = document.defaultStreamFilters 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

455 
if filters is not None: 
484  456 
# apply filters in reverse order listed 
457 
rf = list(filters) 

458 
rf.reverse() 

459 
fnames = [] 

460 
for f in rf: 

461 
#print "*****************content:"; print repr(content[:200]) 

462 
#print "*****************filter", f.pdfname 

463 
content = f.encode(content) 

464 
fnames.insert(0, PDFName(f.pdfname)) 

465 
#print "*****************finally:"; print content[:200] 

466 
#print "****** FILTERS", fnames 

467 
#stop 

468 
dictionary["Filter"] = PDFArray(fnames) 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

469 
fc = format(content, document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

470 
#print "type(content)", type(content) 
484  471 
#if fc!=content: burp 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

472 
# set dictionary length parameter 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

473 
dictionary["Length"] = len(content) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

474 
fd = format(dictionary, document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

475 
sdict = LINEENDDICT.copy() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

476 
sdict["dictionary"] = fd 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

477 
sdict["content"] = fc 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

478 
return STREAMFMT % sdict 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

479 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

480 
def teststream(content=None): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

481 
#content = "" # test 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

482 
if content is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

483 
content = teststreamcontent 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

484 
content = string.strip(content) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

485 
content = string.replace(content, "\n", LINEEND) + LINEEND 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

486 
S = PDFStream() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

487 
S.content = content 
484  488 
S.filters = [PDFBase85Encode, PDFZCompress] 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

489 
# nothing else needed... 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

490 
S.__Comment__ = "test stream" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

491 
return S 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

492 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

493 
teststreamcontent = """ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

494 
1 0 0 1 0 0 cm BT /F9 12 Tf 14.4 TL ET 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

495 
1.00 0.00 1.00 rg 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

496 
n 72.00 72.00 432.00 648.00 re B* 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

497 
""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

498 
class PDFArray: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

499 
multiline = LongFormat 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

500 
def __init__(self, sequence): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

501 
self.sequence = list(sequence) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

502 
def References(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

503 
"""make all objects in sequence references""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

504 
self.sequence = map(document.Reference, self.sequence) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

505 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

506 
#ssequence = map(str, self.sequence) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

507 
sequence = self.sequence 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

508 
fsequence = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

509 
for elt in sequence: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

510 
felt = format(elt, document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

511 
fsequence.append(felt) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

512 
if self.multiline: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

513 
Lj = string.join(fsequence, LINEEND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

514 
Lj = indent(Lj) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

515 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

516 
# break up every 10 elements anyway 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

517 
Lj = fsequence 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

518 
breakline = LINEEND+" " 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

519 
for i in range(10, len(Lj), 10): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

520 
Lj.insert(i,breakline) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

521 
Lj = string.join(Lj) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

522 
return "[ %s ]" % Lj 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

523 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

524 
INDIRECTOBFMT = ("%(n)s %(v)s obj%(LINEEND)s" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

525 
"%(content)s" "%(LINEEND)s" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

526 
"endobj" "%(LINEEND)s") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

527 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

528 
class PDFIndirectObject: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

529 
__RefOnly__ = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

530 
def __init__(self, name, content): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

531 
self.name = name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

532 
self.content = content 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

533 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

534 
name = self.name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

535 
(n, v) = document.idToObjectNumberAndVersion[name] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

536 
content = self.content 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

537 
fcontent = format(content, document, toplevel=1) # yes this is at top level 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

538 
sdict = LINEENDDICT.copy() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

539 
sdict["n"] = n 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

540 
sdict["v"] = v 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

541 
sdict["content"] = fcontent 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

542 
return INDIRECTOBFMT % sdict 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

543 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

544 
class PDFObjectReference: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

545 
def __init__(self, name): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

546 
self.name = name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

547 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

548 
name = self.name 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

549 
(n, v) = document.idToObjectNumberAndVersion[name] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

550 
return "%s %s R" % (n,v) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

551 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

552 
### chapter 5 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

553 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

554 
PDFHeader = ("%PDF1.3"+LINEEND+"%ÃÃ¬Â¶Â¾ "+LINEEND) 
0  555 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

556 
class PDFFile: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

557 
### just accumulates strings: keeps track of current offset 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

558 
def __init__(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

559 
self.strings = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

560 
self.offset = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

561 
self.add(PDFHeader) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

562 
def add(self, s): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

563 
"""should be constructed as late as possible, return position where placed""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

564 
result = self.offset 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

565 
self.offset = result+len(s) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

566 
self.strings.append(s) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

567 
return result 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

568 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

569 
return string.join(self.strings, "") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

570 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

571 
XREFFMT = '%0.10d %0.5d n' 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

572 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

573 
class PDFCrossReferenceSubsection: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

574 
def __init__(self, firstentrynumber, idsequence): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

575 
self.firstentrynumber = firstentrynumber 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

576 
self.idsequence = idsequence 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

577 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

578 
"""id sequence should represent contiguous object nums else error. free numbers not supported (yet)""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

579 
firstentrynumber = self.firstentrynumber 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

580 
idsequence = self.idsequence 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

581 
entries = list(idsequence) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

582 
nentries = len(idsequence) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

583 
# special case: object number 0 is always free 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

584 
taken = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

585 
if firstentrynumber==0: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

586 
taken[0] = "standard free entry" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

587 
nentries = nentries+1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

588 
entries.insert(0, "0000000000 65535 f") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

589 
idToNV = document.idToObjectNumberAndVersion 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

590 
idToOffset = document.idToOffset 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

591 
lastentrynumber = firstentrynumber+nentries1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

592 
for id in idsequence: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

593 
(num, version) = idToNV[id] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

594 
if taken.has_key(num): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

595 
raise ValueError, "object number collision %s %s %s" % (num, repr(id), repr(taken[id])) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

596 
if num>lastentrynumber or num<firstentrynumber: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

597 
raise ValueError, "object number %s not in range %s..%s" % (num, firstentrynumber, lastentrynumber) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

598 
# compute position in list 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

599 
rnum = numfirstentrynumber 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

600 
taken[num] = id 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

601 
offset = idToOffset[id] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

602 
entries[num] = XREFFMT % (offset, version) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

603 
# now add the initial line 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

604 
firstline = "%s %s" % (firstentrynumber, nentries) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

605 
entries.insert(0, firstline) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

606 
# make sure it ends with a LINEEND 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

607 
entries.append("") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

608 
if LINEEND=="\n" or LINEEND=="\r": 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

609 
reflineend = " "+LINEEND # as per spec 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

610 
elif LINEEND=="\r\n": 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

611 
reflineend = LINEEND 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

612 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

613 
raise ValueError, "bad end of line! %s" % repr(LINEEND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

614 
return string.join(entries, LINEEND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

615 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

616 
class PDFCrossReferenceTable: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

617 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

618 
def __init__(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

619 
self.sections = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

620 
def addsection(self, firstentry, ids): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

621 
section = PDFCrossReferenceSubsection(firstentry, ids) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

622 
self.sections.append(section) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

623 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

624 
sections = self.sections 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

625 
if not sections: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

626 
raise ValueError, "no crossref sections" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

627 
L = ["xref"+LINEEND] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

628 
for s in self.sections: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

629 
fs = format(s, document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

630 
L.append(fs) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

631 
return string.join(L, "") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

632 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

633 
TRAILERFMT = ("trailer%(LINEEND)s" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

634 
"%(dict)s%(LINEEND)s" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

635 
"startxref%(LINEEND)s" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

636 
"%(startxref)s%(LINEEND)s" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

637 
"%(PERCENT)s%(PERCENT)sEOF") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

638 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

639 
class PDFTrailer: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

640 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

641 
def __init__(self, startxref, Size=None, Prev=None, Root=None, Info=None, ID=None, Encrypt=None): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

642 
self.startxref = startxref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

643 
if Size is None or Root is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

644 
raise ValueError, "Size and Root keys required" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

645 
dict = self.dict = PDFDictionary() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

646 
for (n,v) in [("Size", Size), ("Prev", Prev), ("Root", Root), 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

647 
("Info", Info), ("Id", ID), ("Encrypt", Encrypt)]: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

648 
if v is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

649 
dict[n] = v 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

650 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

651 
fdict = format(self.dict, document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

652 
D = LINEENDDICT.copy() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

653 
D["dict"] = fdict 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

654 
D["startxref"] = self.startxref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

655 
return TRAILERFMT % D 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

656 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

657 
#### XXXX skipping incremental update, 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

658 
#### encryption 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

659 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

660 
#### chapter 6, doc structure 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

661 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

662 
class PDFCatalog: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

663 
__Comment__ = "Document Root" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

664 
__RefOnly__ = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

665 
# to override, set as attributes 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

666 
__Defaults__ = {"Type": PDFName("Catalog"), 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

667 
"PageMode": PDFName("UseNone"), 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

668 
} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

669 
__NoDefault__ = string.split(""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

670 
Dests Outlines Pages Threads AcroForm Names OpenActions PageMode URI 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

671 
ViewerPreferences PageLabels PageLayout JavaScript StructTreeRoot SpiderInfo""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

672 
) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

673 
__Refs__ = __NoDefault__ # make these all into references, if present 
0  674 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

675 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

676 
self.check_format(document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

677 
defaults = self.__Defaults__ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

678 
Refs = self.__Refs__ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

679 
D = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

680 
for k in defaults.keys(): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

681 
default = defaults[k] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

682 
v = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

683 
if hasattr(self, k) and getattr(self,k) is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

684 
v = getattr(self, k) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

685 
elif default is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

686 
v = default 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

687 
if v is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

688 
D[k] = v 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

689 
for k in self.__NoDefault__: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

690 
if hasattr(self, k): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

691 
v = getattr(self,k) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

692 
if v is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

693 
D[k] = v 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

694 
# force objects to be references where required 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

695 
for k in Refs: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

696 
if D.has_key(k): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

697 
#print"k is", k, "value", D[k] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

698 
D[k] = document.Reference(D[k]) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

699 
dict = PDFDictionary(D) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

700 
return format(dict, document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

701 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

702 
def showOutline(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

703 
self.PageMode = PDFName("UseOutlines") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

704 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

705 
def showFullScreen(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

706 
self.PageMode = PDFName("FullScreen") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

707 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

708 
def check_format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

709 
"""for use in subclasses""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

710 
pass 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

711 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

712 
# not yet implementing 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

713 
# ViewerPreferences, PageLabelDictionaries, 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

714 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

715 
class PDFPages(PDFCatalog): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

716 
"""PAGES TREE WITH ONE INTERNAL NODE, FOR "BALANCING" CHANGE IMPLEMENATION""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

717 
__Comment__ = "page tree" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

718 
__RefOnly__ = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

719 
# note: could implement page attribute inheritance... 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

720 
__Defaults__ = {"Type": PDFName("Pages"), 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

721 
} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

722 
__NoDefault__ = string.split("Kids Count Parent") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

723 
__Refs__ = ["Parent"] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

724 
def __init__(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

725 
self.pages = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

726 
def __getitem__(self, item): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

727 
return self.pages[item] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

728 
def addPage(self, page): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

729 
self.pages.append(page) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

730 
def check_format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

731 
# convert all pages to page references 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

732 
pages = self.pages 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

733 
kids = PDFArray(self.pages) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

734 
# make sure all pages are references 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

735 
kids.References(document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

736 
self.Kids = kids 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

737 
self.Count = len(pages) 
0  738 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

739 
class PDFPage(PDFCatalog): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

740 
__Comment__ = "Page dictionary" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

741 
# all PDF attributes can be set explicitly 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

742 
# if this flag is set, the "usual" behavior will be suppressed 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

743 
Override_default_compilation = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

744 
__RefOnly__ = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

745 
__Defaults__ = {"Type": PDFName("Page"), 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

746 
# "Parent": PDFObjectReference(Pages), # no! use document.Pages 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

747 
} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

748 
__NoDefault__ = string.split(""" Parent 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

749 
MediaBox Resources Contents CropBox Rotate Thumb Annots B Dur Hid Trans AA 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

750 
PieceInfo LastModified SeparationInfo ArtBox TrimBox BleedBox ID PZ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

751 
""") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

752 
__Refs__ = string.split(""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

753 
Contents Parent ID 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

754 
""") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

755 
pagewidth = 595 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

756 
pageheight = 842 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

757 
stream = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

758 
hasImages = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

759 
compression = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

760 
XObjects = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

761 
# transitionstring? 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

762 
# xobjects? 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

763 
# annotations 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

764 
def __init__(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

765 
# set all nodefaults to None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

766 
for name in self.__NoDefault__: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

767 
setattr(self, name, None) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

768 
def setCompression(self, onoff): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

769 
self.compression = onoff 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

770 
def setStream(self, code): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

771 
if self.Override_default_compilation: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

772 
raise ValueError, "overridden! must set stream explicitly" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

773 
from types import ListType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

774 
if type(code) is ListType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

775 
code = string.join(code, LINEEND)+LINEEND 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

776 
self.stream = code 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

777 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

778 
def check_format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

779 
# set up parameters unless usual behaviour is suppressed 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

780 
if self.Override_default_compilation: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

781 
return 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

782 
self.MediaBox = self.MediaBox or PDFArray([0, 0, self.pagewidth, self.pageheight]) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

783 
if not self.Annots: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

784 
self.Annots = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

785 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

786 
#print self.Annots 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

787 
#raise ValueError, "annotations not reimplemented yet" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

788 
if type(self.Annots) is not types.InstanceType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

789 
self.Annots = PDFArray(self.Annots) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

790 
if not self.Contents: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

791 
stream = self.stream 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

792 
if not stream: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

793 
self.Contents = teststream() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

794 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

795 
S = PDFStream() 
484  796 
if self.compression: 
797 
S.filters = [PDFZCompress, PDFBase85Encode] 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

798 
S.content = stream 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

799 
S.__Comment__ = "page stream" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

800 
self.Contents = S 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

801 
if not self.Resources: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

802 
resources = PDFResourceDictionary() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

803 
# fonts! 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

804 
resources.basicFonts() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

805 
if self.hasImages: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

806 
resources.allProcs() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

807 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

808 
resources.basicProcs() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

809 
if self.XObjects: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

810 
#print "XObjects", self.XObjects.dict 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

811 
resources.XObject = self.XObjects 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

812 
self.Resources = resources 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

813 
if not self.Parent: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

814 
pages = document.Pages 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

815 
self.Parent = document.Reference(pages) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

816 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

817 
def testpage(document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

818 
P = PDFPage() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

819 
P.Contents = teststream() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

820 
pages = document.Pages 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

821 
P.Parent = document.Reference(pages) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

822 
P.MediaBox = PDFArray([0, 0, 595, 841]) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

823 
resources = PDFResourceDictionary() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

824 
resources.allProcs() # enable all procsets 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

825 
resources.basicFonts() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

826 
P.Resources = resources 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

827 
pages.addPage(P) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

828 

483
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

829 
#### DUMMY OUTLINES IMPLEMENTATION FOR testing 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

830 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

831 
DUMMYOUTLINE = """ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

832 
<< 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

833 
/Count 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

834 
0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

835 
/Type 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

836 
/Outlines 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

837 
>>""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

838 

483
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

839 
class PDFOutlines0: 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

840 
__Comment__ = "TEST OUTLINE!" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

841 
text = string.replace(DUMMYOUTLINE, "\n", LINEEND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

842 
__RefOnly__ = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

843 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

844 
return self.text 
483
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

845 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

846 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

847 
class OutlineEntryObject: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

848 
"an entry in an outline" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

849 
Title = Dest = Parent = Prev = Next = First = Last = Count = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

850 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

851 
D = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

852 
D["Title"] = PDFString(self.Title) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

853 
D["Parent"] = self.Parent 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

854 
D["Dest"] = self.Dest 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

855 
for n in ("Prev", "Next", "First", "Last", "Count"): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

856 
v = getattr(self, n) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

857 
if v is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

858 
D[n] = v 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

859 
PD = PDFDictionary(D) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

860 
return PD.format(document) 
0  861 

862 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

863 
class PDFOutlines: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

864 
"""takes a recursive list of outline destinations 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

865 
like 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

866 
out = PDFOutline1() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

867 
out.setNames(canvas, # requires canvas for name resolution 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

868 
"chapter1dest", 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

869 
("chapter2dest", 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

870 
["chapter2section1dest", 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

871 
"chapter2section2dest", 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

872 
"chapter2conclusiondest"] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

873 
), # end of chapter2 description 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

874 
"chapter3dest", 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

875 
("chapter4dest", ["c4s1", "c4s2"]) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

876 
) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

877 
Higher layers may build this structure incrementally. KISS at base level. 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

878 
""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

879 
# first attempt, many possible features missing. 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

880 
#no init for now 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

881 
mydestinations = ready = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

882 
counter = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

883 
currentlevel = 1 # ie, no levels yet 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

884 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

885 
def __init__(self): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

886 
self.destinationnamestotitles = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

887 
self.destinationstotitles = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

888 
self.levelstack = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

889 
self.buildtree = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

890 
self.closedict = {} # dictionary of "closed" destinations in the outline 
0  891 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

892 
def addOutlineEntry(self, destinationname, level=0, title=None, closed=None): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

893 
"""destinationname of None means "close the tree" """ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

894 
from types import IntType, TupleType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

895 
if destinationname is None and level!=0: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

896 
raise ValueError, "close tree must have level of 0" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

897 
if type(level) is not IntType: raise ValueError, "level must be integer, got %s" % type(level) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

898 
if level<0: raise ValueError, "negative levels not allowed" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

899 
if title is None: title = destinationname 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

900 
currentlevel = self.currentlevel 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

901 
stack = self.levelstack 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

902 
tree = self.buildtree 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

903 
# adjust currentlevel and stack to match level 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

904 
if level>currentlevel: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

905 
if level>currentlevel+1: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

906 
raise ValueError, "can't jump from outline level %s to level %s, need intermediates" %(currentlevel, level) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

907 
level = currentlevel = currentlevel+1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

908 
stack.append([]) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

909 
while level<currentlevel: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

910 
# pop off levels to match 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

911 
current = stack[1] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

912 
del stack[1] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

913 
previous = stack[1] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

914 
lastinprevious = previous[1] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

915 
if type(lastinprevious) is TupleType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

916 
(name, sectionlist) = lastinprevious 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

917 
raise ValueError, "cannot reset existing sections: " + repr(lastinprevious) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

918 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

919 
name = lastinprevious 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

920 
sectionlist = current 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

921 
previous[1] = (name, sectionlist) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

922 
#sectionlist.append(current) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

923 
currentlevel = currentlevel1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

924 
if destinationname is None: return 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

925 
stack[1].append(destinationname) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

926 
self.destinationnamestotitles[destinationname] = title 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

927 
if closed: self.closedict[destinationname] = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

928 
self.currentlevel = level 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

929 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

930 
def setDestinations(self, destinationtree): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

931 
self.mydestinations = destinationtree 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

932 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

933 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

934 
D = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

935 
D["Type"] = PDFName("Outlines") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

936 
c = self.count 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

937 
D["Count"] = c 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

938 
if c!=0: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

939 
D["First"] = self.first 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

940 
D["Last"] = self.last 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

941 
PD = PDFDictionary(D) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

942 
return PD.format(document) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

943 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

944 
def setNames(self, canvas, *nametree): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

945 
desttree = self.translateNames(canvas, nametree) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

946 
self.setDestinations(desttree) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

947 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

948 
def setNameList(self, canvas, nametree): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

949 
"Explicit list so I don't need to do apply(...) in the caller" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

950 
desttree = self.translateNames(canvas, nametree) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

951 
self.setDestinations(desttree) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

952 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

953 
def translateNames(self, canvas, object): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

954 
"recursively translate tree of names into tree of destinations" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

955 
from types import StringType, ListType, TupleType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

956 
Ot = type(object) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

957 
destinationnamestotitles = self.destinationnamestotitles 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

958 
destinationstotitles = self.destinationstotitles 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

959 
closedict = self.closedict 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

960 
if Ot is StringType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

961 
destination = canvas._bookmarkReference(object) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

962 
title = object 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

963 
if destinationnamestotitles.has_key(object): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

964 
title = destinationnamestotitles[object] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

965 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

966 
destinationnamestotitles[title] = title 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

967 
destinationstotitles[destination] = title 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

968 
if closedict.has_key(object): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

969 
closedict[destination] = 1 # mark destination closed 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

970 
return {object: canvas._bookmarkReference(object)} # name>ref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

971 
if Ot is ListType or Ot is TupleType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

972 
L = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

973 
for o in object: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

974 
L.append(self.translateNames(canvas, o)) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

975 
if Ot is TupleType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

976 
return tuple(L) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

977 
return L 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

978 
raise "in outline, destination name must be string: got a %s" % Ot 
0  979 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

980 
def prepare(self, document, canvas): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

981 
"""prepare all data structures required for save operation (create related objects)""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

982 
if self.mydestinations is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

983 
if self.levelstack: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

984 
self.addOutlineEntry(None) # close the tree 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

985 
destnames = self.levelstack[0] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

986 
#from pprint import pprint; pprint(destnames); stop 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

987 
self.mydestinations = self.translateNames(canvas, destnames) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

988 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

989 
self.first = self.last = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

990 
self.count = 0 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

991 
self.ready = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

992 
return 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

993 
#self.first = document.objectReference("Outline.First") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

994 
#self.last = document.objectReference("Outline.Last") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

995 
# XXXX this needs to be generalized for closed entries! 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

996 
self.count = count(self.mydestinations, self.closedict) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

997 
(self.first, self.last) = self.maketree(document, self.mydestinations, toplevel=1) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

998 
self.ready = 1 
0  999 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1000 
def maketree(self, document, destinationtree, Parent=None, toplevel=0): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1001 
from types import ListType, TupleType, DictType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1002 
tdestinationtree = type(destinationtree) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1003 
if toplevel: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1004 
levelname = "Outline" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1005 
Parent = document.Reference(document.Outlines) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1006 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1007 
self.count = self.count+1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1008 
levelname = "Outline.%s" % self.count 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1009 
if Parent is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1010 
raise ValueError, "nontop level outline elt parent must be specified" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1011 
if tdestinationtree is not ListType and tdestinationtree is not TupleType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1012 
raise ValueError, "destinationtree must be list or tuple, got %s" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1013 
nelts = len(destinationtree) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1014 
lastindex = nelts1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1015 
lastelt = firstref = lastref = None 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1016 
destinationnamestotitles = self.destinationnamestotitles 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1017 
closedict = self.closedict 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1018 
for index in range(nelts): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1019 
eltobj = OutlineEntryObject() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1020 
eltobj.Parent = Parent 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1021 
eltname = "%s.%s" % (levelname, index) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1022 
eltref = document.Reference(eltobj, eltname) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1023 
#document.add(eltname, eltobj) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1024 
if lastelt is not None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1025 
lastelt.Next = eltref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1026 
eltobj.Prev = lastref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1027 
if firstref is None: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1028 
firstref = eltref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1029 
lastref = eltref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1030 
lastelt = eltobj # advance eltobj 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1031 
lastref = eltref 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1032 
elt = destinationtree[index] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1033 
te = type(elt) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1034 
if te is DictType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1035 
# simple leaf {name: dest} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1036 
leafdict = elt 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1037 
elif te is TupleType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1038 
# leaf with subsections: ({name: ref}, subsections) XXXX should clean up (see count(...)) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1039 
try: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1040 
(leafdict, subsections) = elt 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1041 
except: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1042 
raise ValueError, "destination tree elt tuple should have two elts, got %s" % len(elt) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1043 
eltobj.Count = count(subsections, closedict) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1044 
(eltobj.First, eltobj.Last) = self.maketree(document, subsections, eltref) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1045 
else: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1046 
raise ValueError, "destination tree elt should be dict or tuple, got %s" % te 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1047 
try: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1048 
[(Title, Dest)] = leafdict.items() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1049 
except: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1050 
raise ValueError, "bad outline leaf dictionary, should have one entry "+str(elt) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1051 
eltobj.Title = destinationnamestotitles[Title] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1052 
eltobj.Dest = Dest 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1053 
if te is TupleType and closedict.has_key(Dest): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1054 
# closed subsection, count should be negative 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1055 
eltobj.Count = eltobj.Count 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1056 
return (firstref, lastref) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1057 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1058 
def count(tree, closedict=None): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1059 
"""utility for outline: recursively count leaves in a tuple/list tree""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1060 
from operator import add 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1061 
from types import TupleType, ListType 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1062 
tt = type(tree) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1063 
if tt is TupleType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1064 
# leaf with subsections XXXX should clean up this structural usage 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1065 
(leafdict, subsections) = tree 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1066 
[(Title, Dest)] = leafdict.items() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1067 
if closedict and closedict.has_key(Dest): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1068 
return 1 # closed tree element 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1069 
if tt is TupleType or tt is ListType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1070 
#return reduce(add, map(count, tree)) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1071 
counts = [] 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1072 
for e in tree: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1073 
counts.append(count(e, closedict)) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1074 
return reduce(add, counts) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1075 
return 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1076 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1077 

0  1078 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1079 
#### dummy info 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1080 
DUMMYINFO = """ 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1081 
<</Title (testing) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1082 
/Author (arw) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1083 
/CreationDate (D:20001012220652) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1084 
/Producer (ReportLab http://www.reportlab.com) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1085 
/Subject (this file generated by an alpha test module) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1086 
>> 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1087 
""" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1088 
class PDFInfo0: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1089 
__Comment__ = "TEST INFO STRUCTURE" 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1090 
text = string.replace(DUMMYINFO, "\n", LINEEND) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1091 
__RefOnly__ = 1 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1092 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1093 
return self.text 
0  1094 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1095 
class PDFInfo: 
0  1096 
"""PDF documents can have basic information embedded, viewable from 
1097 
File  Document Info in Acrobat Reader. If this is wrong, you get 

1098 
Postscript errors while printing, even though it does not print.""" 

1099 
def __init__(self): 

1100 
self.title = "untitled" 

1101 
self.author = "anonymous" 

1102 
self.subject = "unspecified" 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1103 
#now = time.localtime(time.time()) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1104 
#self.datestr = '%04d%02d%02d%02d%02d%02d' % tuple(now[0:6]) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1105 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1106 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1107 
D = {} 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1108 
D["Title"] = PDFString(self.title) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1109 
D["Author"] = PDFString(self.author) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1110 
D["CreationDate"] = PDFDate() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1111 
D["Producer"] = PDFString("ReporLab http://www.reportlab.com") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1112 
D["Subject"] = PDFString(self.subject) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1113 
PD = PDFDictionary(D) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1114 
return PD.format(document) 
0  1115 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1116 
# skipping thumbnails, etc 
0  1117 

1118 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1119 
class Annotation: 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1120 
"""superclass for all annotations.""" 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1121 
defaults = [("Type", PDFName("Annot"),)] 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1122 
required = ("Type", "Rect", "Contents", "Subtype") 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1123 
permitted = required+( 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1124 
"Border", "C", "T", "M", "F", "H", "BS", "AA", "AS", "Popup", "P") 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1125 
def cvtdict(self, d): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1126 
"""transform dict args from python form to pdf string rep as needed""" 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1127 
Rect = d["Rect"] 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1128 
if type(Rect) is not types.StringType: 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1129 
d["Rect"] = PDFArray(Rect) 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1130 
d["Contents"] = PDFString(d["Contents"]) 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1131 
return d 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1132 
def AnnotationDict(self, **kw): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1133 
d = {} 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1134 
for (name,val) in self.defaults: 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1135 
d[name] = val 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1136 
d.update(kw) 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1137 
for name in self.required: 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1138 
if not d.has_key(name): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1139 
raise ValueError, "keyword argument %s missing" % name 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1140 
d = self.cvtdict(d) 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1141 
permitted = self.permitted 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1142 
for name in d.keys(): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1143 
if name not in permitted: 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1144 
raise ValueError, "bad annotation dictionary name %s" % name 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1145 
return PDFDictionary(d) 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1146 
def Dict(self): 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1147 
raise ValueError, "DictString undefined for virtual superclass Annotation, must overload" 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1148 
# but usually 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1149 
#return self.AnnotationDict(self, Rect=(a,b,c,d)) or whatever 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1150 
def format(self, document): 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1151 
D = self.Dict() 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1152 
return D.format(document) 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1153 

e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1154 
class TextAnnotation(Annotation): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1155 
permitted = Annotation.permitted + ( 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1156 
"Open", "Name", "AP") 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1157 
def __init__(self, Rect, Contents, **kw): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1158 
self.Rect = Rect 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1159 
self.Contents = Contents 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1160 
self.otherkw = kw 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1161 
def Dict(self): 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1162 
d = {} 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1163 
d.update(self.otherkw) 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1164 
d["Rect"] = self.Rect 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1165 
d["Contents"] = self.Contents 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1166 
d["Subtype"] = "/Text" 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1167 
return apply(self.AnnotationDict, (), d) 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1168 

e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1169 
class LinkAnnotation(Annotation): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1170 

e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1171 
permitted = Annotation.permitted + ( 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1172 
"Dest", "A", "PA") 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1173 
def __init__(self, Rect, Contents, Destination, Border="[0 0 1]", **kw): 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1174 
self.Border = Border 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1175 
self.Rect = Rect 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1176 
self.Contents = Contents 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1177 
self.Destination = Destination 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1178 
self.otherkw = kw 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1179 

e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1180 
def dummyDictString(self): # old, testing 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1181 
return """ 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1182 
<< /Type /Annot /Subtype /Link /Rect [71 717 190 734] /Border [16 16 1] 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1183 
/Dest [23 0 R /Fit] >> 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1184 
""" 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1185 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1186 
def Dict(self): 
53
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1187 
d = {} 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1188 
d.update(self.otherkw) 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1189 
d["Border"] = self.Border 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1190 
d["Rect"] = self.Rect 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1191 
d["Contents"] = self.Contents 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1192 
d["Subtype"] = "/Link" 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1193 
d["Dest"] = self.Destination 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1194 
return apply(self.AnnotationDict, (), d) 
e624c027a5d6
Added forms, destinations, linkages and other features
aaron_watters
parents:
47
diff
changeset

1195 

481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1196 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1197 
# skipping names tree 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1198 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1199 
# skipping actions 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1200 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1201 
# skipping names trees 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1202 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1203 
# skipping to chapter 7 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1204 

136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1205 
class PDFRectangle: 
