author  robin 
Tue, 16 Jul 2013 13:53:40 +0100  
changeset 3716  37624134ca40 
parent 3715  d30e432b8a2f 
child 4067  712e1822ca31 
permissions  rwxrxrx 
3617  1 
#Copyright ReportLab Europe Ltd. 20002012 
494  2 
#see license.txt for license details 
2332  3 
#history http://www.reportlab.co.uk/cgibin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfbase/pdfdoc.py 
4 
__version__=''' $Id$ ''' 

1577  5 
__doc__=""" 
0  6 
The module pdfdoc.py handles the 'outer structure' of PDF documents, ensuring that 
1577  7 
all objects are properly crossreferenced and indexed to the nearest byte. The 
8 
'inner structure'  the page descriptions  are presumed to be generated before 

0  9 
each page is saved. 
10 
pdfgen.py calls this and provides a 'canvas' object to handle page marking operators. 

11 
piddlePDF calls pdfgen and offers a highlevel interface. 

12 

873  13 
The classes within this generally mirror structures in the PDF file 
14 
and are not part of any public interface. Instead, canvas and font 

15 
classes are made available elsewhere for users to manipulate. 

0  16 
""" 
2575  17 
import string, types, binascii, codecs 
873  18 
from reportlab.pdfbase import pdfutils 
2067  19 
from reportlab.pdfbase.pdfutils import LINEEND # this constant needed in both 
873  20 
from reportlab import rl_config 
3687  21 
from reportlab.lib.utils import import_zlib, open_for_read, fp_str, _digester, makeFileName 
2595  22 
from reportlab.pdfbase import pdfmetrics 
2993  23 
try: 
24 
from hashlib import md5 

25 
except ImportError: 

26 
from md5 import md5 

873  27 

1653
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

28 
from sys import platform 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

29 
try: 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

30 
from sys import version_info 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

31 
except: # pre2.0 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

32 
# may be inaccurate but will at least 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

33 
#work in anything which seeks to format 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

34 
# version_info into a string 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

35 
version_info = (1,5,2,'unknown',0) 
87b869faf50f
Fixed 1.5breakage (we imported sys.version_info which did not exist then)
andy_robinson
parents:
1635
diff
changeset

36 

1622  37 
if platform[:4] == 'java' and version_info[:2] == (2, 1): 
1677
1450177dd19e
Exterminated all tab characters and added a test to make sure
andy_robinson
parents:
1653
diff
changeset

38 
# workaround for list()bug in Jython 2.1 (should be fixed in 2.2) 
1622  39 
def list(sequence): 
40 
def f(x): 

41 
return x 

42 
return map(f, sequence) 

43 

2737  44 
def utf8str(x): 
45 
if isinstance(x,unicode): 

46 
return x.encode('utf8') 

47 
else: 

48 
return str(x) 

49 

873  50 
class PDFError(Exception): 
51 
pass 

52 

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

53 
# set this flag to get more vertical whitespace (and larger files) 
1363
92e3fb40a784
Asian fonts now all working in major encodings, and partly documented
andy_robinson
parents:
1317
diff
changeset

54 
LongFormat = 1 
1062  55 
##if LongFormat: (doesn't work) 
56 
## pass 

57 
##else: 

58 
## LINEEND = "\n" # no wasteful carriage returns! 

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

59 

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

60 
# __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

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

62 

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

63 
# __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

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

65 

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

66 
# __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

67 
# 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

68 
__Comment__ = "__Comment__" 
1062  69 

70 
# If DoComments is set then add helpful (space wasting) comment lines to PDF files 

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

71 
DoComments = 1 
1062  72 
if not LongFormat: 
73 
DoComments = 0 

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

74 

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

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

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

77 

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

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

79 
Pages = "Pages" 
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 
### generic utilities 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

82 

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

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

84 
LINEENDDICT = {"LINEEND": LINEEND, "PERCENT": "%"} 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

85 
PDF_VERSION_DEFAULT = (1, 3) 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

86 
PDF_SUPPORT_VERSION = dict( #map keyword to min version that supports it 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

87 
transparency = (1, 4), 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

88 
) 
0  89 

2540  90 
from types import InstanceType 
91 
def format(element, document, toplevel=0, InstanceType=InstanceType): 

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

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

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

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

95 
""" 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

96 
if hasattr(element,'__PDFObject__'): 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

98 
# 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

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

101 
else: 
2541  102 
f = element.format(document) 
2273
82f026361b70
Fix bug introduced during transparency/ImageReader changes
rgbecker
parents:
2234
diff
changeset

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

104 
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

105 
return f 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

106 
elif type(element) in (float, int): 
2067  107 
#use a controlled number formatting routine 
108 
#instead of str, so Jython/Python etc do not differ 

109 
return fp_str(element) 

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

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

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

112 

1552  113 
def xObjectName(externalname): 
1560
382bbd1f20ae
revert to older internal name for backward compatibility
rgbecker
parents:
1554
diff
changeset

114 
return "FormXob.%s" % externalname 
1552  115 

1605  116 
# backwards compatibility 
117 
formName = xObjectName 

118 

1062  119 
# no encryption 
120 
class NoEncryption: 

121 
def encode(self, t): 

122 
"encode a string, stream, text" 

123 
return t 

124 
def prepare(self, document): 

125 
# get ready to do encryption 

126 
pass 

127 
def register(self, objnum, version): 

128 
# enter a new direct object 

129 
pass 

130 
def info(self): 

131 
# the representation of self in file if any (should be None or PDFDict) 

132 
return None 

133 

134 
class DummyDoc: 

135 
"used to bypass encryption when required" 

3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

136 
__PDFObject__ = True 
1062  137 
encrypt = NoEncryption() 
1577  138 

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

139 
### the global document structure manager 
0  140 
class PDFDocument: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

141 
__PDFObject__ = True 
1577  142 
# set this to define filters 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

143 
defaultStreamFilters = None 
1062  144 
encrypt = NoEncryption() # default no encryption 
1838
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

145 
def __init__(self, 
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

146 
dummyoutline=0, 
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

147 
compression=rl_config.pageCompression, 
2476
19fb0900fba1
pdfdoc.py: minor changes to simplify PDFInfoL/U in other apps
rgbecker
parents:
2378
diff
changeset

148 
invariant=rl_config.invariant, 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

149 
filename=None, 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

150 
pdfVersion=PDF_VERSION_DEFAULT, 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

151 
): 
3570
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

152 
self._ID = None 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

153 
self.objectcounter = 0 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

154 
self.shadingCounter = 0 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

155 
self.inObject = None 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

156 
self.pageCounter = 1 
1577  157 

1838
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

158 
# allow None value to be passed in to mean 'give system defaults' 
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

159 
if invariant is None: 
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

160 
self.invariant = rl_config.invariant 
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

161 
else: 
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

162 
self.invariant = invariant 
1635  163 
self.setCompression(compression) 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

164 
self._pdfVersion = pdfVersion 
1062  165 
# signature for creating PDF ID 
2993  166 
sig = self.signature = md5() 
1062  167 
sig.update("a reportlab document") 
1977  168 
if not self.invariant: 
1987
b2401bcddd6d
Finally commit changes to allow invariant pdfencryption to work properly
rgbecker
parents:
1985
diff
changeset

169 
cat = _getTimeStamp() 
b2401bcddd6d
Finally commit changes to allow invariant pdfencryption to work properly
rgbecker
parents:
1985
diff
changeset

170 
else: 
b2401bcddd6d
Finally commit changes to allow invariant pdfencryption to work properly
rgbecker
parents:
1985
diff
changeset

171 
cat = 946684800.0 
b2401bcddd6d
Finally commit changes to allow invariant pdfencryption to work properly
rgbecker
parents:
1985
diff
changeset

172 
sig.update(repr(cat)) # initialize with timestamp digest 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

173 
# 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

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

175 
# 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

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

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

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

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

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

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

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

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

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

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

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

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

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

189 
cat.Outlines = outlines 
603  190 
self.info = PDFInfo() 
1838
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

191 
self.info.invariant = self.invariant 
591  192 
#self.Reference(self.Catalog) 
193 
#self.Reference(self.Info) 

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

194 
self.fontMapping = {} 
873  195 
#make an empty font dictionary 
196 
DD = PDFDictionary({}) 

197 
DD.__Comment__ = "The standard fonts dictionary" 

2944  198 
self.Reference(DD, BasicFonts) 
1635  199 
self.delayedFonts = [] 
200 

201 
def setCompression(self, onoff): 

202 
# XXX: maybe this should also set self.defaultStreamFilters? 

203 
self.compression = onoff 

873  204 

3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

205 
def ensureMinPdfVersion(self, *keys): 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

206 
"Ensure that the pdf version is greater than or equal to that specified by the keys" 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

207 
for k in keys: 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

208 
self._pdfVersion = max(self._pdfVersion, PDF_SUPPORT_VERSION[k]) 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

209 

1062  210 
def updateSignature(self, thing): 
211 
"add information to the signature" 

212 
if self._ID: return # but not if its used already! 

2737  213 
self.signature.update(utf8str(thing)) 
1577  214 

1062  215 
def ID(self): 
1838
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

216 
"A unique fingerprint for the file (unless in invariant mode)" 
1062  217 
if self._ID: 
218 
return self._ID 

1985  219 
digest = self.signature.digest() 
220 
doc = DummyDoc() 

2595  221 
ID = PDFString(digest,enc='raw') 
1985  222 
IDs = ID.format(doc) 
223 
self._ID = "%s %% ReportLab generated PDF document  digest (http://www.reportlab.com) %s [%s %s] %s" % ( 

1838
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

224 
LINEEND, LINEEND, IDs, IDs, LINEEND) 
1062  225 
return self._ID 
0  226 

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

227 
def SaveToFile(self, filename, canvas): 
3326  228 
if hasattr(getattr(filename, "write",None),'__call__'): 
1965
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

229 
myfile = 0 
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

230 
f = filename 
3687  231 
filename = makeFileName(getattr(filename,'name','')) 
1965
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

232 
else : 
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

233 
myfile = 1 
3687  234 
filename = makeFileName(filename) 
1965
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

235 
f = open(filename, "wb") 
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

236 
f.write(self.GetPDFData(canvas)) 
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

237 
if myfile: 
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

238 
f.close() 
2010  239 
import os 
2009  240 
if os.name=='mac': 
241 
from reportlab.lib.utils import markfilename 

242 
markfilename(filename) # do platform specific file junk 

1965
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

243 
if getattr(canvas,'_verbosity',None): print 'saved', filename 
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

244 

02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

245 
def GetPDFData(self, canvas): 
1635  246 
# realize delayed fonts 
247 
for fnt in self.delayedFonts: 

248 
fnt.addObjects(self) 

1062  249 
# add info stuff to signature 
1838
f7eeee67832c
Changes to allow invariant documents when needed
andy_robinson
parents:
1799
diff
changeset

250 
self.info.invariant = self.invariant 
1062  251 
self.info.digest(self.signature) 
252 
### later: maybe add more info to sig? 

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

253 
# prepare outline 
591  254 
self.Reference(self.Catalog) 
603  255 
self.Reference(self.info) 
483
c4c3969d1e30
undid last checkin and added an option for a default outline (different fix)
aaron_watters
parents:
482
diff
changeset

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

257 
outline.prepare(self, canvas) 
1965
02ef6a007f0b
David Fraser's GetPDFData patch (to avoid unwanted StringIOs
rgbecker
parents:
1903
diff
changeset

258 
return self.format() 
1577  259 

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

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

261 
"""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

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

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

264 
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

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

266 

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

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

268 
"""specify that we are in a form xobject (disable page features, etc)""" 
742  269 
# don't need this check anymore since going in a form pushes old context at canvas level. 
270 
#if self.inObject not in ["form", None]: 

271 
# raise ValueError, "can't go in form already in object %s" % self.inObject 

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

272 
self.inObject = "form" 
1577  273 
# don't need to do anything else, I think... 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

274 

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

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

276 
fm = self.fontMapping 
3326  277 
if psfontname in fm: 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

279 
else: 
873  280 
try: 
281 
# does pdfmetrics know about it? if so, add 

282 
fontObj = pdfmetrics.getFont(psfontname) 

2678
38d18a697cd0
reportlab: Python2.5 changes + minor cosmetics and improvements
rgbecker
parents:
2666
diff
changeset

283 
if fontObj._dynamicFont: 
2915  284 
raise PDFError("getInternalFontName(%s) called for a dynamic font" % repr(psfontname)) 
1577  285 
fontObj.addObjects(self) 
873  286 
#self.addFont(fontObj) 
287 
return fm[psfontname] 

288 
except KeyError: 

2915  289 
raise PDFError("Font %s not known!" % repr(psfontname)) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

290 

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

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

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

293 

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

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

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

296 

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

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

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

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

300 
self.Pages.addPage(page) 
2919  301 
self.pageCounter += 1 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

303 

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

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

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

306 
# 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

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

308 
self.inForm() 
1552  309 
self.Reference(form, xObjectName(name)) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

311 

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

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

313 
return "Annot.%s"%externalname 
1577  314 

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

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

316 
self.Reference(annotation, self.annotationName(name)) 
1577  317 

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

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

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

320 
return PDFObjectReference(internalname) 
1577  321 

3570
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

322 
def addShading(self, shading): 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

323 
name = "Sh%d" % self.shadingCounter 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

324 
self.Reference(shading, name) 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

325 
self.shadingCounter += 1 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

326 
return name 
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

327 

3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

328 
def addColor(self,cmyk): 
3226
cd06c1172678
pdfgen,pdfbase: fix handling of CMYKColorSep spotNames with spaces etc
rgbecker
parents:
3198
diff
changeset

329 
sname = cmyk.spotName 
3588
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

330 
if not sname: 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

331 
if cmyk.cyan==0 and cmyk.magenta==0 and cmyk.yellow==0: 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

332 
sname = 'BLACK' 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

333 
elif cmyk.black==0 and cmyk.magenta==0 and cmyk.yellow==0: 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

334 
sname = 'CYAN' 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

335 
elif cmyk.cyan==0 and cmyk.black==0 and cmyk.yellow==0: 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

336 
sname = 'MAGENTA' 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

337 
elif cmyk.cyan==0 and cmyk.magenta==0 and cmyk.black==0: 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

338 
sname = 'YELLOW' 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

339 
if not sname: 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

340 
raise ValueError("CMYK colour %r used without a spotName" % cmyk) 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

341 
else: 
aed7c74d52a2
pdfdoc.py: synthesize a spot for simple CMYK or fail if no spotName in addColor
rgbecker
parents:
3570
diff
changeset

342 
cmyk = cmyk.clone(spotName = sname) 
3226
cd06c1172678
pdfgen,pdfbase: fix handling of CMYKColorSep spotNames with spaces etc
rgbecker
parents:
3198
diff
changeset

343 
name = PDFName(sname)[1:] 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

344 
if name not in self.idToObject: 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

345 
sep = PDFSeparationCMYKColor(cmyk).value() #PDFArray([/Separation /name /DeviceCMYK tint_tf]) 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

346 
self.Reference(sep,name) 
3226
cd06c1172678
pdfgen,pdfbase: fix handling of CMYKColorSep spotNames with spaces etc
rgbecker
parents:
3198
diff
changeset

347 
return name,sname 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

348 

0  349 
def setTitle(self, title): 
350 
"embeds in PDF file" 

2666  351 
if title is None: 
352 
self.info.title = '(anonymous)' 

353 
else: 

354 
self.info.title = title 

355 

0  356 
def setAuthor(self, author): 
357 
"embedded in PDF file" 

2666  358 
#allow resetting to clear it 
359 
if author is None: 

360 
self.info.author = '(anonymous)' 

361 
else: 

362 
self.info.author = author 

1577  363 

0  364 
def setSubject(self, subject): 
365 
"embeds in PDF file" 

2666  366 

367 
#allow resetting to clear it 

368 
if subject is None: 

369 
self.info.subject = '(unspecified)' 

370 
else: 

371 
self.info.subject = subject 

372 

3456  373 
def setCreator(self, creator): 
374 
"embeds in PDF file" 

375 

376 
#allow resetting to clear it 

377 
if creator is None: 

378 
self.info.creator = '(unspecified)' 

379 
else: 

380 
self.info.creator = creator 

381 

2666  382 
def setKeywords(self, keywords): 
383 
"embeds a string containing keywords in PDF file" 

384 

385 
#allow resetting to clear it but ensure it's a string 

386 
if keywords is None: 

387 
self.info.keywords = '' 

388 
else: 

389 
self.info.keywords = keywords 

390 

2595  391 
def setDateFormatter(self, dateFormatter): 
392 
self.info._dateFormatter = dateFormatter 

393 

0  394 
def getAvailableFonts(self): 
395 
fontnames = self.fontMapping.keys() 

1151
431ef9e78aae
"the 14 std fonts" should always be "available"
aaron_watters
parents:
1063
diff
changeset

396 
# the standard 14 are also always available! (even if not initialized yet) 
431ef9e78aae
"the 14 std fonts" should always be "available"
aaron_watters
parents:
1063
diff
changeset

397 
import _fontdata 
431ef9e78aae
"the 14 std fonts" should always be "available"
aaron_watters
parents:
1063
diff
changeset

398 
for name in _fontdata.standardFonts: 
431ef9e78aae
"the 14 std fonts" should always be "available"
aaron_watters
parents:
1063
diff
changeset

399 
if name not in fontnames: 
431ef9e78aae
"the 14 std fonts" should always be "available"
aaron_watters
parents:
1063
diff
changeset

400 
fontnames.append(name) 
0  401 
fontnames.sort() 
402 
return fontnames 

681  403 

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

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

405 
# 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

406 
# (possible infinite loop if there is a bug that continually makes new objects/refs...) 
1062  407 
# Prepare encryption 
408 
self.encrypt.prepare(self) 

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

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

411 
self.Reference(self.Catalog) 
603  412 
self.Reference(self.info) 
1062  413 
# register the encryption dictionary if present 
414 
encryptref = None 

415 
encryptinfo = self.encrypt.info() 

416 
if encryptinfo: 

417 
encryptref = self.Reference(encryptinfo) 

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

418 
# 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

419 
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

420 
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

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

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

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

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

425 
### 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

426 
done = None 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

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

428 
while done is None: 
2575  429 
counter += 1 # do next object... 
3326  430 
if counter in numbertoid: 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

434 
IO = PDFIndirectObject(id, obj) 
1062  435 
# register object number and version 
1577  436 
#encrypt.register(id, 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

438 
# add a comment to the PDF output 
2273
82f026361b70
Fix bug introduced during transparency/ImageReader changes
rgbecker
parents:
2234
diff
changeset

439 
if not rl_config.invariant and DoComments: 
1840
9c20e252dcd2
Fixed how object comments are formatted  could not always __class___.__name__
andy_robinson
parents:
1838
diff
changeset

440 
try: 
9c20e252dcd2
Fixed how object comments are formatted  could not always __class___.__name__
andy_robinson
parents:
1838
diff
changeset

441 
classname = obj.__class__.__name__ 
9c20e252dcd2
Fixed how object comments are formatted  could not always __class___.__name__
andy_robinson
parents:
1838
diff
changeset

442 
except: 
9c20e252dcd2
Fixed how object comments are formatted  could not always __class___.__name__
andy_robinson
parents:
1838
diff
changeset

443 
classname = repr(obj) 
9c20e252dcd2
Fixed how object comments are formatted  could not always __class___.__name__
andy_robinson
parents:
1838
diff
changeset

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

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

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

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

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

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

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

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

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

453 
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

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

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

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

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

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

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

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

461 
startxref = xrefoffset, 
1309  462 
Size = lno+1, 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

463 
Root = self.Reference(cat), 
1062  464 
Info = self.Reference(info), 
465 
Encrypt = encryptref, 

466 
ID = self.ID(), 

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

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

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

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

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

471 
return File.format(self) 
1577  472 

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

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

474 
"""test for existence of named form""" 
1552  475 
internalname = xObjectName(name) 
3326  476 
return internalname in self.idToObject 
0  477 

2679  478 
def getFormBBox(self, name, boxType="MediaBox"): 
479 
"""get the declared bounding box of the form as a list. 

480 
If you specify a different PDF box definition (e.g. the 

481 
ArtBox) and it has one, that's what you'll get.""" 

1552  482 
internalname = xObjectName(name) 
3326  483 
if internalname in self.idToObject: 
1430  484 
theform = self.idToObject[internalname] 
2798  485 
if hasattr(theform,'_extra_pageCatcher_info'): 
486 
return theform._extra_pageCatcher_info[boxType] 

1430  487 
if isinstance(theform, PDFFormXObject): 
488 
# internally defined form 

489 
return theform.BBoxList() 

490 
elif isinstance(theform, PDFStream): 

491 
# externally defined form 

2679  492 
return list(theform.dictionary.dict[boxType].sequence) 
1430  493 
else: 
494 
raise ValueError, "I don't understand the form instance %s" % repr(name) 

495 

1552  496 
def getXObjectName(self, name): 
1395  497 
"""Lets canvas find out what form is called internally. 
498 
Never mind whether it is defined yet or not.""" 

1552  499 
return xObjectName(name) 
1577  500 

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

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

502 
"""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

503 
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

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

505 
for name in formnames: 
1552  506 
internalname = xObjectName(name) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

510 
return PDFDictionary(D) 
1577  511 

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

513 
### note references may "grow" during the final formatting pass: don't use d.keys()! 
628
7f5cd20a02f1
very subtle bug that is only hit by pagecatcher: indirect references to integers now work.
aaron_watters
parents:
603
diff
changeset

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

515 
#print"object type is ", type(object) 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

516 
iob = hasattr(object,'__PDFObject__') 
628
7f5cd20a02f1
very subtle bug that is only hit by pagecatcher: indirect references to integers now work.
aaron_watters
parents:
603
diff
changeset

517 
idToObject = self.idToObject 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

518 
if name is None and (not iob or object.__class__ is PDFObjectReference): 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

523 
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

524 
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

525 
repr(intname), repr(name)) 
3326  526 
if intname not in idToObject: 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

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

532 
name = "R"+repr(objectcounter) 
3326  533 
if name in idToObject: 
628
7f5cd20a02f1
very subtle bug that is only hit by pagecatcher: indirect references to integers now work.
aaron_watters
parents:
603
diff
changeset

534 
other = idToObject[name] 
7f5cd20a02f1
very subtle bug that is only hit by pagecatcher: indirect references to integers now work.
aaron_watters
parents:
603
diff
changeset

535 
if other!=object: 
7f5cd20a02f1
very subtle bug that is only hit by pagecatcher: indirect references to integers now work.
aaron_watters
parents:
603
diff
changeset

536 
raise ValueError, "redefining named object: "+repr(name) 
7f5cd20a02f1
very subtle bug that is only hit by pagecatcher: indirect references to integers now work.
aaron_watters
parents:
603
diff
changeset

537 
return PDFObjectReference(name) 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

538 
if iob: 
628
7f5cd20a02f1
very subtle bug that is only hit by pagecatcher: indirect references to integers now work.
aaron_watters
parents:
603
diff
changeset

539 
object.__InternalName__ = name 
591  540 
#print "name", name, "counter", objectcounter 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

545 

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

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

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

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

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

550 

1062  551 
class PDFText: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

552 
__PDFObject__ = True 
1062  553 
def __init__(self, t): 
554 
self.t = t 

555 
def format(self, document): 

2477
704e05bad378
pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
rgbecker
parents:
2476
diff
changeset

556 
result = binascii.hexlify(document.encrypt.encode(self.t)) 
1062  557 
return "<%s>" % result 
558 
def __str__(self): 

559 
dummydoc = DummyDoc() 

560 
return self.format(dummydoc) 

1014
ba7f9c1294ea
added missing PDFText() function for consistency (needed by pagecatcher)
aaron_watters
parents:
873
diff
changeset

561 

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

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

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

564 

2517
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

565 
import re 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

566 
_re_cleanparens=re.compile('[^()]') 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

567 
del re 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

568 
def _isbalanced(s): 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

569 
'''test whether a string is balanced in parens''' 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

570 
s = _re_cleanparens.sub('',s) 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

571 
n = 0 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

572 
for c in s: 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

573 
if c=='(': n+=1 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

574 
else: 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

575 
n = 1 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

576 
if n<0: return 0 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

577 
return not n and 1 or 0 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

578 

2595  579 
def _checkPdfdoc(utext): 
580 
'''return true if no Pdfdoc encoding errors''' 

581 
try: 

582 
utext.encode('pdfdoc') 

583 
return 1 

584 
except UnicodeEncodeError, e: 

585 
return 0 

586 

1062  587 
class PDFString: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

588 
__PDFObject__ = True 
2595  589 
def __init__(self, s, escape=1, enc='auto'): 
590 
'''s can be unicode/utf8 or a PDFString 

591 
if escape is true then the output will be passed through escape 

592 
if enc is raw then the string will be left alone 

593 
if enc is auto we'll try and automatically adapt to utf_16_be if the 

594 
effective string is not entirely in pdfdoc 

595 
''' 

596 
if isinstance(s,PDFString): 

597 
self.s = s.s 

598 
self.escape = s.escape 

599 
self.enc = s.enc 

600 
else: 

601 
self.s = s 

602 
self.escape = escape 

603 
self.enc = enc 

1062  604 
def format(self, document): 
2517
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

605 
s = self.s 
2595  606 
enc = getattr(self,'enc','auto') 
607 
if type(s) is str: 

608 
if enc is 'auto': 

609 
try: 

2922
168b91cbfefc
reportlab: attempt to make heuristic for PDFString formatting more sensible
rgbecker
parents:
2919
diff
changeset

610 
u = s.decode(s.startswith(codecs.BOM_UTF16_BE) and 'utf16' or 'utf8') 
168b91cbfefc
reportlab: attempt to make heuristic for PDFString formatting more sensible
rgbecker
parents:
2919
diff
changeset

611 
if _checkPdfdoc(u): 
168b91cbfefc
reportlab: attempt to make heuristic for PDFString formatting more sensible
rgbecker
parents:
2919
diff
changeset

612 
s = u.encode('pdfdoc') 
168b91cbfefc
reportlab: attempt to make heuristic for PDFString formatting more sensible
rgbecker
parents:
2919
diff
changeset

613 
else: 
168b91cbfefc
reportlab: attempt to make heuristic for PDFString formatting more sensible
rgbecker
parents:
2919
diff
changeset

614 
s = codecs.BOM_UTF16_BE+u.encode('utf_16_be') 
2595  615 
except: 
2915  616 
try: 
2922
168b91cbfefc
reportlab: attempt to make heuristic for PDFString formatting more sensible
rgbecker
parents:
2919
diff
changeset

617 
s.decode('pdfdoc') 
2915  618 
except: 
619 
import sys 

620 
print >>sys.stderr, 'Error in',repr(s) 

621 
raise 

2595  622 
elif type(s) is unicode: 
623 
if enc is 'auto': 

624 
if _checkPdfdoc(s): 

625 
s = s.encode('pdfdoc') 

626 
else: 

627 
s = codecs.BOM_UTF16_BE+s.encode('utf_16_be') 

628 
else: 

629 
s = codecs.BOM_UTF16_BE+s.encode('utf_16_be') 

630 
else: 

631 
raise ValueError('PDFString argument must be str/unicode not %s' % type(s)) 

632 

2524
7e6da7c7fe2c
merge stable 2687:2688 pdfdoc.py: attempt to robustify escape attribute access
rgbecker
parents:
2517
diff
changeset

633 
escape = getattr(self,'escape',1) 
2517
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

634 
if not isinstance(document.encrypt,NoEncryption): 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

635 
s = document.encrypt.encode(s) 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

636 
escape = 1 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

637 
if escape: 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

638 
try: 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

639 
es = "(%s)" % pdfutils._escape(s) 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

640 
except: 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

641 
raise ValueError("cannot escape %s %s" % (s, repr(s))) 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

642 
if escape&2: 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

643 
es = es.replace('\\012','\n') 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

644 
if escape&4 and _isbalanced(s): 
2517
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

645 
es = es.replace('\\(','(').replace('\\)',')') 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

646 
return es 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

647 
else: 
c8f07edb561d
pdfdoc: allow special escaping in Annotations and PDFString
rgbecker
parents:
2487
diff
changeset

648 
return '(%s)' % s 
1062  649 
def __str__(self): 
650 
return "(%s)" % pdfutils._escape(self.s) 

1577  651 

2540  652 
def PDFName(data,lo=chr(0x21),hi=chr(0x7e)): 
484  653 
# might need to change this to class for encryption 
1062  654 
# NOTE: RESULT MUST ALWAYS SUPPORT MEANINGFUL COMPARISONS (EQUALITY) AND HASH 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

655 
# first convert the name 
2540  656 
L = list(data) 
657 
for i,c in enumerate(L): 

658 
if c<lo or c>hi or c in "%()<>{}[]#": 

659 
L[i] = "#"+hex(ord(c))[2:] # forget the 0x thing... 

660 
return "/"+(''.join(L)) 

1577  661 

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

662 
class PDFDictionary: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

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

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

666 
"""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

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

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

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

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

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

672 
self.dict[name] = value 
2919  673 
def __getitem__(self, a): 
674 
return self.dict[a] 

3326  675 
def __contains__(self,a): 
676 
return a in self.dict 

2730  677 
def Reference(self, name, document): 
2541  678 
self.dict[name] = document.Reference(self.dict[name]) 
679 
def format(self, document,IND=LINEEND+' '): 

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

680 
dict = self.dict 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

681 
try: 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

682 
keys = dict.keys() 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

683 
except: 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

684 
print repr(dict) 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

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

686 
keys.sort() 
2540  687 
L = [(format(PDFName(k),document)+" "+format(dict[k],document)) for k in keys] 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

688 
if self.multiline: 
2541  689 
L = IND.join(L) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

691 
# break up every 6 elements anyway 
2540  692 
t=L.insert 
693 
for i in xrange(6, len(L), 6): 

694 
t(i,LINEEND) 

695 
L = " ".join(L) 

696 
return "<< %s >>" % L 

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

697 

2666  698 
def copy(self): 
699 
return PDFDictionary(self.dict) 

2778  700 

3630  701 
def normalize(self): 
702 
#normalize the names to use RL standard ie Name not /Name 

703 
D = self.dict 

704 
K = [k for k in D.iterkeys() if k.startswith('/')] 

705 
for k in K: 

706 
D[k[1:]] = D.pop(k) 

707 

2869
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

708 
class checkPDFNames: 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

709 
def __init__(self,*names): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

710 
self.names = map(PDFName,names) 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

711 
def __call__(self,value): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

712 
if not value.startswith('/'): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

713 
value=PDFName(value) 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

714 
if value in self.names: 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

715 
return value 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

716 

912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

717 
def checkPDFBoolean(value): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

718 
if value in ('true','false'): return value 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

719 

912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

720 
class CheckedPDFDictionary(PDFDictionary): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

721 
validate = {} 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

722 
def __init__(self,dict=None,validate=None): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

723 
PDFDictionary.__init__(self,dict) 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

724 
if validate: self.validate = validate 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

725 

912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

726 
def __setitem__(self,name,value): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

727 
if name not in self.validate: 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

728 
raise ValueError('invalid key, %r' % name) 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

729 
cvalue = self.validate[name](value) 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

730 
if cvalue is None: 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

731 
raise ValueError('Bad value %r for key %r' % (value,name)) 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

732 
PDFDictionary.__setitem__(self,name,cvalue) 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

733 

912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

734 
class ViewerPreferencesPDFDictionary(CheckedPDFDictionary): 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

735 
validate=dict( 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

736 
HideToolbar=checkPDFBoolean, 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

737 
HideMenubar=checkPDFBoolean, 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

738 
HideWindowUI=checkPDFBoolean, 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

739 
FitWindow=checkPDFBoolean, 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

740 
CenterWindow=checkPDFBoolean, 
3460
bbfe1f84fc80
pdfdoc.py: added DisplayDocTitle to viewer settings, contributed by Mark Erbaugh
rgbecker
parents:
3456
diff
changeset

741 
DisplayDocTitle=checkPDFBoolean, #contributed by mark Erbaugh 
2869
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

742 
NonFullScreenPageMode=checkPDFNames(*'UseNone UseOutlines UseThumbs UseOC'.split()), 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

743 
Direction=checkPDFNames(*'L2R R2L'.split()), 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

744 
ViewArea=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

745 
ViewClip=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

746 
PrintArea=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

747 
PrintClip=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

748 
PrintScaling=checkPDFNames(*'None AppDefault'.split()), 
912456caa112
reportlab: add in PageLabel stuff from Christian jacobs and Date fix from Dinu Gherman
rgbecker
parents:
2852
diff
changeset

749 
) 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

750 

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

753 
class PDFStreamFilterZCompress: 

754 
pdfname = "FlateDecode" 

755 
def encode(self, text): 

674  756 
from reportlab.lib.utils import import_zlib 
757 
zlib = import_zlib() 

758 
if not zlib: raise ImportError, "cannot zcompress zlib unavailable" 

759 
return zlib.compress(text) 

484  760 
def decode(self, encoded): 
674  761 
from reportlab.lib.utils import import_zlib 
762 
zlib = import_zlib() 

763 
if not zlib: raise ImportError, "cannot zdecompress zlib unavailable" 

764 
return zlib.decompress(encoded) 

484  765 

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

1577  767 
PDFZCompress = PDFStreamFilterZCompress() 
484  768 

769 
class PDFStreamFilterBase85Encode: 

770 
pdfname = "ASCII85Decode" 

771 
def encode(self, text): 

772 
from pdfutils import _AsciiBase85Encode, _wrap 

2767
2ba5a1d26ad0
reportlab: make a85 wrap optional, add _reset to rl_config
rgbecker
parents:
2740
diff
changeset

773 
text = _AsciiBase85Encode(text) 
2ba5a1d26ad0
reportlab: make a85 wrap optional, add _reset to rl_config
rgbecker
parents:
2740
diff
changeset

774 
if rl_config.wrapA85: 
2ba5a1d26ad0
reportlab: make a85 wrap optional, add _reset to rl_config
rgbecker
parents:
2740
diff
changeset

775 
text = _wrap(text) 
2ba5a1d26ad0
reportlab: make a85 wrap optional, add _reset to rl_config
rgbecker
parents:
2740
diff
changeset

776 
return text 
484  777 
def decode(self, text): 
778 
from pdfutils import _AsciiBase85Decode 

779 
return _AsciiBase85Decode(text) 

1577  780 

484  781 
# need only one of these too 
782 
PDFBase85Encode = PDFStreamFilterBase85Encode() 

783 

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

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

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

786 
"%(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

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

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

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

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

791 
'''set dictionary elements explicitly stream.dictionary[name]=value''' 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

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

794 
__RefOnly__ = 1 # must be at top level 
3144
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

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

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

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

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

799 
self.content = content 
3144
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

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

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

802 
dictionary = self.dictionary 
591  803 
# copy it for modification 
804 
dictionary = PDFDictionary(dictionary.dict.copy()) 

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

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

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

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

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

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

810 
filters = document.defaultStreamFilters 
591  811 
# only apply filters if they haven't been applied elsewhere 
3326  812 
if filters is not None and "Filter" not in dictionary.dict: 
484  813 
# apply filters in reverse order listed 
814 
rf = list(filters) 

815 
rf.reverse() 

816 
fnames = [] 

817 
for f in rf: 

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

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

820 
content = f.encode(content) 

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

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

823 
#print "****** FILTERS", fnames 

824 
#stop 

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

1062  826 
# "stream encoding is done after all filters have been applied" 
827 
content = document.encrypt.encode(content) 

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

828 
fc = format(content, document) 
591  829 
#print "type(content)", type(content), len(content), type(self.dictionary) 
830 
lc = len(content) 

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

832 
# set dictionary length parameter 
591  833 
dictionary["Length"] = lc 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

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

839 

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

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

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

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

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

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

845 
content = string.replace(content, "\n", LINEEND) + LINEEND 
3359
171fa15695a8
reportlab: optional A85 patch contributed by Yoann Roman
rgbecker
parents:
3327
diff
changeset

846 
S = PDFStream(content = content, 
171fa15695a8
reportlab: optional A85 patch contributed by Yoann Roman
rgbecker
parents:
3327
diff
changeset

847 
filters=rl_config.useA85 and [PDFBase85Encode,PDFZCompress] or [PDFZCompress]) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

851 

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

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

853 
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

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

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

857 
class PDFArray: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

859 
multiline = LongFormat 
3144
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

860 
_ZLIST = list(9*' ')+[LINEEND] 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

865 
self.sequence = map(document.Reference, self.sequence) 
2541  866 
def format(self, document, IND=LINEEND+' '): 
867 
L = [format(e, document) for e in self.sequence] 

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

868 
if self.multiline: 
2541  869 
L = IND.join(L) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

870 
else: 
3144
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

871 
n=len(L) 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

872 
if n>10: 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

873 
# break up every 10 elements anyway 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

874 
m,r = divmod(n,10) 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

875 
L = ''.join([l+z for l,z in zip(L,m*self._ZLIST+list(r*' '))]) 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

876 
L = L.strip() 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

877 
else: 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

878 
L = ' '.join(L) 
2541  879 
return "[ %s ]" % L 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

880 

3144
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

881 
class PDFArrayCompact(PDFArray): 
a5d6bb711691
pdfdoc.py: added class PDFSeparationCMYKColorSpace
rgbecker
parents:
3112
diff
changeset

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

883 

3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

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

885 
class PDFIndirectObject: 
3318
59aae14a6010
pdfdoc.py: add __PDFObject__ to PDFIndirectObject class (patch from Arnaud Fontaine <arnaud@andesi.org>)
rgbecker
parents:
3251
diff
changeset

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

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

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

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

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

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

892 
name = self.name 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

893 
n, v = document.idToObjectNumberAndVersion[name] 
1062  894 
# set encryption parameters 
895 
document.encrypt.register(n, v) 

3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

896 
fcontent = format(self.content, document, toplevel=1) # yes this is at top level 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

897 
D = LINEENDDICT.copy() 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

898 
D["n"] = n 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

899 
D["v"] = v 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

900 
D["content"] = fcontent 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

901 
D['CLINEEND'] = (LINEEND,'')[fcontent.endswith(LINEEND)] 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

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

903 

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

904 
class PDFObjectReference: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

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

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

908 
def format(self, document): 
1317
2c0575047463
allow forms to be forward references (to allow table of contents, eg).
aaron_watters
parents:
1309
diff
changeset

909 
try: 
2541  910 
return "%s %s R" % document.idToObjectNumberAndVersion[self.name] 
1317
2c0575047463
allow forms to be forward references (to allow table of contents, eg).
aaron_watters
parents:
1309
diff
changeset

911 
except: 
2541  912 
raise KeyError, "forward reference to %s not resolved upon final formatting" % repr(self.name) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

913 

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

914 
### chapter 5 
681  915 
# Following Ken Lunde's advice and the PDF spec, this includes 
916 
# some highorder bytes. I chose the characters for Tokyo 

917 
# in ShiftJIS encoding, as these cannot be mistaken for 

918 
# any other encoding, and we'll be able to tell if something 

919 
# has run our PDF files through a dodgy Unicode conversion. 

1063  920 
PDFHeader = ( 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

921 
"%%PDF%s.%s"+LINEEND+ 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

922 
"%%\223\214\213\236 ReportLab Generated PDF document http://www.reportlab.com"+LINEEND) 
0  923 

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

924 
class PDFFile: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

926 
### just accumulates strings: keeps track of current offset 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

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

928 
self.strings = [] 
2477
704e05bad378
pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
rgbecker
parents:
2476
diff
changeset

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

930 
self.offset = 0 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

931 
self.add(PDFHeader % pdfVersion) 
2477
704e05bad378
pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
rgbecker
parents:
2476
diff
changeset

932 

704e05bad378
pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
rgbecker
parents:
2476
diff
changeset

933 
def closeOrReset(self): 
704e05bad378
pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
rgbecker
parents:
2476
diff
changeset

934 
pass 
704e05bad378
pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
rgbecker
parents:
2476
diff
changeset

935 

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

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

937 
"""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

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

939 
self.offset = result+len(s) 
2477
704e05bad378
pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
rgbecker
parents:
2476
diff
changeset

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

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

942 
def format(self, document): 
1062  943 
strings = map(str, self.strings) # final conversion, in case of lazy objects 
2359  944 
return string.join(strings, "") 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

945 

1577  946 
XREFFMT = '%0.10d %0.5d n' 
481
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 
class PDFCrossReferenceSubsection: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

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

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

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

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

954 
"""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

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

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

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

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

959 
# 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

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

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

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

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

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

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

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

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

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

969 
(num, version) = idToNV[id] 
3326  970 
if num in taken: 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

971 
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

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

973 
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

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

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

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

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

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

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

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

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

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

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

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

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

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

987 
reflineend = LINEEND 
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 
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

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

991 

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

992 
class PDFCrossReferenceTable: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

994 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1009 

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

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

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

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

1013 
"%(startxref)s%(LINEEND)s" 
873  1014 
"%(PERCENT)s%(PERCENT)sEOF%(LINEEND)s") 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1015 

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

1016 
class PDFTrailer: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

1018 

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

1019 
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

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

1021 
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

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

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

1024 
for (n,v) in [("Size", Size), ("Prev", Prev), ("Root", Root), 
1062  1025 
("Info", Info), ("ID", ID), ("Encrypt", Encrypt)]: 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

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

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

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

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

1034 

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

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

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

1037 

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

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

1039 

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

1040 
class PDFCatalog: 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

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

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

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

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

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

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

1048 
__NoDefault__ = string.split(""" 
3629
f148d4473631
pdfdoc.py: fix openeactions>openaction bug fix contributed by Andrew Cutler
rgbecker
parents:
3617
diff
changeset

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

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

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

1052 
__Refs__ = __NoDefault__ # make these all into references, if present 
1577  1053 

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

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

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

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

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

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

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

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

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

1062 
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

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

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

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

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

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

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

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

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

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

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

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

1074 
for k in Refs: 
3326  1075 
if k in D: 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

1080 

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

1081 
def showOutline(self): 
2852  1082 
self.setPageMode("UseOutlines") 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1083 

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

1084 
def showFullScreen(self): 
2852  1085 
self.setPageMode("FullScreen") 
1086 

1087 
def setPageLayout(self,layout): 

1088 
if layout: 

1089 
self.PageLayout = PDFName(layout) 

1090 

1091 
def setPageMode(self,mode): 

1092 
if mode: 

1093 
self.PageMode = PDFName(mode) 

1577  1094 

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

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

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

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

1098 

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

1099 
class PDFPages(PDFCatalog): 
2229  1100 
"""PAGES TREE WITH ONE INTERNAL NODE, FOR "BALANCING" CHANGE IMPLEMENTATION""" 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

1104 
__Defaults__ = {"Type": PDFName("Pages"), 
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 
__NoDefault__ = string.split("Kids Count Parent") 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

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

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

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

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

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

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

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

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

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

1121 
self.Count = len(pages) 
3198
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

1122 

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

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

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

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

1126 
# 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

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

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

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

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

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

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

1133 
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

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

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

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

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

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

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

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

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

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

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

1145 
XObjects = None 
3226
cd06c1172678
pdfgen,pdfbase: fix handling of CMYKColorSep spotNames with spaces etc
rgbecker
parents:
3198
diff
changeset

1146 
_colorsUsed = {} 
3570
494980a689ff
reportlab: add in shading technology contributed by Peter Johnson <johnson.peter@gmail.com>
rgbecker
parents:
3470
diff
changeset

1147 
_shadingsUsed = {} 
500  1148 
Trans = None 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1164 
self.stream = code 
500  1165 

1166 
def setPageTransition(self, tranDict): 

1167 
self.Trans = PDFDictionary(tranDict) 

1577  1168 

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

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

1170 
# 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

1171 
if self.Override_default_compilation: 
1577  1172 
return 
2798  1173 
self.MediaBox = self.MediaBox or PDFArray(self.Rotate in (90,270) and [0,0,self.pageheight,self.pagewidth] or [0, 0, self.pagewidth, self.pageheight]) 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

1178 
#raise ValueError, "annotations not reimplemented yet" 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

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

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

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

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

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

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

1186 
S = PDFStream() 
484  1187 
if self.compression: 
3359
171fa15695a8
reportlab: optional A85 patch contributed by Yoann Roman
rgbecker
parents:
3327
diff
changeset

1188 
S.filters = rl_config.useA85 and [PDFBase85Encode, PDFZCompress] or [PDFZCompress] 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

1189 
S.content = stream 
