author  rgbecker 
Mon, 06 Aug 2012 13:31:35 +0000  
changeset 3570  494980a689ff 
parent 3470  3a5a51f3426c 
child 3588  aed7c74d52a2 
permissions  rwxrxrx 
2332  1 
#Copyright ReportLab Europe Ltd. 20002004 
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 
2902
f15ac27dc73f
reportlab: add in RGBA functionality for sensible images
rgbecker
parents:
2869
diff
changeset

21 
from reportlab.lib.utils import import_zlib, open_for_read, fp_str, _digester 
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 
2737  231 
filename = utf8str(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 
2737  234 
filename = utf8str(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 
cd06c1172678
pdfgen,pdfbase: fix handling of CMYKColorSep spotNames with spaces etc
rgbecker
parents:
3198
diff
changeset

330 
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

331 
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

332 
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

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

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

335 

0  336 
def setTitle(self, title): 
337 
"embeds in PDF file" 

2666  338 
if title is None: 
339 
self.info.title = '(anonymous)' 

340 
else: 

341 
self.info.title = title 

342 

0  343 
def setAuthor(self, author): 
344 
"embedded in PDF file" 

2666  345 
#allow resetting to clear it 
346 
if author is None: 

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

348 
else: 

349 
self.info.author = author 

1577  350 

0  351 
def setSubject(self, subject): 
352 
"embeds in PDF file" 

2666  353 

354 
#allow resetting to clear it 

355 
if subject is None: 

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

357 
else: 

358 
self.info.subject = subject 

359 

3456  360 
def setCreator(self, creator): 
361 
"embeds in PDF file" 

362 

363 
#allow resetting to clear it 

364 
if creator is None: 

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

366 
else: 

367 
self.info.creator = creator 

368 

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

371 

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

373 
if keywords is None: 

374 
self.info.keywords = '' 

375 
else: 

376 
self.info.keywords = keywords 

377 

2595  378 
def setDateFormatter(self, dateFormatter): 
379 
self.info._dateFormatter = dateFormatter 

380 

0  381 
def getAvailableFonts(self): 
382 
fontnames = self.fontMapping.keys() 

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

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

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

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

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

387 
fontnames.append(name) 
0  388 
fontnames.sort() 
389 
return fontnames 

681  390 

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

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

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

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

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

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

398 
self.Reference(self.Catalog) 
603  399 
self.Reference(self.info) 
1062  400 
# register the encryption dictionary if present 
401 
encryptref = None 

402 
encryptinfo = self.encrypt.info() 

403 
if encryptinfo: 

404 
encryptref = self.Reference(encryptinfo) 

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

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

406 
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

407 
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

426 
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

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

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

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

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

431 
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

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

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

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

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

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

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

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

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

440 
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

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

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

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

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

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

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

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

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

450 
Root = self.Reference(cat), 
1062  451 
Info = self.Reference(info), 
452 
Encrypt = encryptref, 

453 
ID = self.ID(), 

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

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

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

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

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

458 
return File.format(self) 
1577  459 

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

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

461 
"""test for existence of named form""" 
1552  462 
internalname = xObjectName(name) 
3326  463 
return internalname in self.idToObject 
0  464 

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

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

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

1552  469 
internalname = xObjectName(name) 
3326  470 
if internalname in self.idToObject: 
1430  471 
theform = self.idToObject[internalname] 
2798  472 
if hasattr(theform,'_extra_pageCatcher_info'): 
473 
return theform._extra_pageCatcher_info[boxType] 

1430  474 
if isinstance(theform, PDFFormXObject): 
475 
# internally defined form 

476 
return theform.BBoxList() 

477 
elif isinstance(theform, PDFStream): 

478 
# externally defined form 

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

482 

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

1552  486 
return xObjectName(name) 
1577  487 

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

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

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

490 
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

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

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

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

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

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

497 
return PDFDictionary(D) 
1577  498 

2540  499 
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

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

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

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

503 
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

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

505 
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

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

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

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

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

510 
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

511 
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

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

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

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

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

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

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

519 
name = "R"+repr(objectcounter) 
3326  520 
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

521 
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

522 
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

523 
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

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

525 
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

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

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

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

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

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

532 

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

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

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

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

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

537 

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

539 
__PDFObject__ = True 
1062  540 
def __init__(self, t): 
541 
self.t = t 

542 
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

543 
result = binascii.hexlify(document.encrypt.encode(self.t)) 
1062  544 
return "<%s>" % result 
545 
def __str__(self): 

546 
dummydoc = DummyDoc() 

547 
return self.format(dummydoc) 

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

548 

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

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

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

551 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

565 

2595  566 
def _checkPdfdoc(utext): 
567 
'''return true if no Pdfdoc encoding errors''' 

568 
try: 

569 
utext.encode('pdfdoc') 

570 
return 1 

571 
except UnicodeEncodeError, e: 

572 
return 0 

573 

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

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

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

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

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

581 
effective string is not entirely in pdfdoc 

582 
''' 

583 
if isinstance(s,PDFString): 

584 
self.s = s.s 

585 
self.escape = s.escape 

586 
self.enc = s.enc 

587 
else: 

588 
self.s = s 

589 
self.escape = escape 

590 
self.enc = enc 

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

592 
s = self.s 
2595  593 
enc = getattr(self,'enc','auto') 
594 
if type(s) is str: 

595 
if enc is 'auto': 

596 
try: 

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

597 
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

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

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

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

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

604 
s.decode('pdfdoc') 
2915  605 
except: 
606 
import sys 

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

608 
raise 

2595  609 
elif type(s) is unicode: 
610 
if enc is 'auto': 

611 
if _checkPdfdoc(s): 

612 
s = s.encode('pdfdoc') 

613 
else: 

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

615 
else: 

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

617 
else: 

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

619 

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

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

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

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

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

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

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

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

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

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

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

630 
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

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

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

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

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

635 
return '(%s)' % s 
1062  636 
def __str__(self): 
637 
return "(%s)" % pdfutils._escape(self.s) 

1577  638 

2540  639 
def PDFName(data,lo=chr(0x21),hi=chr(0x7e)): 
484  640 
# might need to change this to class for encryption 
1062  641 
# 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

642 
# first convert the name 
2540  643 
L = list(data) 
644 
for i,c in enumerate(L): 

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

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

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

1577  648 

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

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

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

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

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

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

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

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

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

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

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

659 
self.dict[name] = value 
2919  660 
def __getitem__(self, a): 
661 
return self.dict[a] 

3326  662 
def __contains__(self,a): 
663 
return a in self.dict 

2730  664 
def Reference(self, name, document): 
2541  665 
self.dict[name] = document.Reference(self.dict[name]) 
666 
def format(self, document,IND=LINEEND+' '): 

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

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

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

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

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

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

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

673 
keys.sort() 
2540  674 
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

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

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

678 
# break up every 6 elements anyway 
2540  679 
t=L.insert 
680 
for i in xrange(6, len(L), 6): 

681 
t(i,LINEEND) 

682 
L = " ".join(L) 

683 
return "<< %s >>" % L 

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

684 

2666  685 
def copy(self): 
686 
return PDFDictionary(self.dict) 

2778  687 

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

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

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

690 
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

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

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

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

694 
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

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

696 

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

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

698 
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

699 

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

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

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

702 
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

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

704 
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

705 

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

706 
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

707 
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

708 
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

709 
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

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

711 
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

712 
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

713 

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

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

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

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

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

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

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

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

721 
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

722 
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

723 
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

724 
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

725 
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

726 
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

727 
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

728 
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

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

730 

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

733 
class PDFStreamFilterZCompress: 

734 
pdfname = "FlateDecode" 

735 
def encode(self, text): 

674  736 
from reportlab.lib.utils import import_zlib 
737 
zlib = import_zlib() 

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

739 
return zlib.compress(text) 

484  740 
def decode(self, encoded): 
674  741 
from reportlab.lib.utils import import_zlib 
742 
zlib = import_zlib() 

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

744 
return zlib.decompress(encoded) 

484  745 

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

1577  747 
PDFZCompress = PDFStreamFilterZCompress() 
484  748 

749 
class PDFStreamFilterBase85Encode: 

750 
pdfname = "ASCII85Decode" 

751 
def encode(self, text): 

752 
from pdfutils import _AsciiBase85Encode, _wrap 

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

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

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

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

756 
return text 
484  757 
def decode(self, text): 
758 
from pdfutils import _AsciiBase85Decode 

759 
return _AsciiBase85Decode(text) 

1577  760 

484  761 
# need only one of these too 
762 
PDFBase85Encode = PDFStreamFilterBase85Encode() 

763 

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

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

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

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

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

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

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

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

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

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

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

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

775 
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

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

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

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

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

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

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

782 
dictionary = self.dictionary 
591  783 
# copy it for modification 
784 
dictionary = PDFDictionary(dictionary.dict.copy()) 

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

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

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

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

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

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

790 
filters = document.defaultStreamFilters 
591  791 
# only apply filters if they haven't been applied elsewhere 
3326  792 
if filters is not None and "Filter" not in dictionary.dict: 
484  793 
# apply filters in reverse order listed 
794 
rf = list(filters) 

795 
rf.reverse() 

796 
fnames = [] 

797 
for f in rf: 

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

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

800 
content = f.encode(content) 

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

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

803 
#print "****** FILTERS", fnames 

804 
#stop 

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

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

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

808 
fc = format(content, document) 
591  809 
#print "type(content)", type(content), len(content), type(self.dictionary) 
810 
lc = len(content) 

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

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

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

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

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

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

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

819 

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

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

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

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

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

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

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

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

827 
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

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

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

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

831 

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

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

833 
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

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

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

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

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

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

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

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

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

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

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

845 
self.sequence = map(document.Reference, self.sequence) 
2541  846 
def format(self, document, IND=LINEEND+' '): 
847 
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

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

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

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

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

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

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

855 
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

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

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

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

860 

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

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

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

863 

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

864 
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

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

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

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

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

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

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

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

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

873 
n, v = document.idToObjectNumberAndVersion[name] 
1062  874 
# set encryption parameters 
875 
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

876 
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

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

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

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

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

881 
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

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

883 

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

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

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

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

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

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

889 
try: 
2541  890 
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

891 
except: 
2541  892 
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

893 

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

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

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

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

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

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

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

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

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

904 
class PDFFile: 
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 
### 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

907 
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

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

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

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

911 
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

912 

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

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

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

915 

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

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

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

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

919 
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

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

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

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

925 

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

927 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

951 
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

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

953 
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

969 
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

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

971 

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

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

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

974 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

989 

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

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

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

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

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

995 

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

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

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

998 

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

999 
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

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

1001 
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

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

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

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

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

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

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

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

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

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

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

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

1014 

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

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

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

1017 

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

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

1019 

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

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

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

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

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

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

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

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

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

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

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

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

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

1032 
__Refs__ = __NoDefault__ # make these all into references, if present 
1577  1033 

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

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

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

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

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

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

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

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

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

1042 
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1060 

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

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

1063 

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

1064 
def showFullScreen(self): 
2852  1065 
self.setPageMode("FullScreen") 
1066 

1067 
def setPageLayout(self,layout): 

1068 
if layout: 

1069 
self.PageLayout = PDFName(layout) 

1070 

1071 
def setPageMode(self,mode): 

1072 
if mode: 

1073 
self.PageMode = PDFName(mode) 

1577  1074 

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

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

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

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

1078 

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

1079 
class PDFPages(PDFCatalog): 
2229  1080 
"""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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1101 
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

1102 

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

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

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

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

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

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

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

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

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

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

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

1113 
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

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

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

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

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

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

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

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

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

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

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

1125 
XObjects = None 
3226
cd06c1172678
pdfgen,pdfbase: fix handling of CMYKColorSep spotNames with spaces etc
rgbecker
parents:
3198
diff
changeset

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

1127 
_shadingsUsed = {} 
500  1128 
Trans = None 
481
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
aaron_watters
parents:
479
diff
changeset

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1144 
self.stream = code 
500  1145 

1146 
def setPageTransition(self, tranDict): 

1147 
self.Trans = PDFDictionary(tranDict) 

1577  1148 

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

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

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

1151 
if self.Override_default_compilation: 
1577  1152 
return 
2798  1153 
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

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

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

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

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

1158 
#raise ValueError, "annotations not reimplemented yet" 
3101
ec18b8a44cd2
reportlab:attempt to make PDF objects more explicit
rgbecker
parents:
3031
diff
changeset

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

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

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

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

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

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

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

1166 
S = PDFStream() 
484  1167 
if self.compression: 
3359
171fa15695a8
reportlab: optional A85 patch contributed by Yoann Roman
rgbecker
parents:
3327
diff
changeset

1168 
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1186 
resources.setColorSpace(self._colorsUsed) 
683ca9eb6b18
reportlab: added in support for Overprint/Opacity & Separated colours (Opacity inspired by Simon King)
rgbecker
parents:
3172
diff
changeset

1187 

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

1188 
self.Resources = resources 
136669babedf
complete revision of pdfdoc. Not finished (compression missing, testing needed)
