10 PDFcatalog
= "Catalog"
13 PDFmediabox
= "MediaBox%i"
14 PDFresources
= "Resources%i"
15 PDFcontents
= "Contents%i"
16 PDFcontentslength
= "ContentsLength%i"
20 def __init__(self
, filename
, compress
=1, compresslevel
=6):
21 self
.file = open(filename
, "wb")
22 if compress
and not haszlib
:
24 sys
.stderr
.write("*** PyXWarning: compression disabled due to missing zlib module\n")
25 self
.compress
= compress
26 self
.compresslevel
= compresslevel
28 self
.compressstream
= None
29 self
.refdict
= {} # id -> ref-no
30 self
.refs
= [] # refno - 1 -> filepos
33 self
.write("%%PDF-1.4\n%%%s%s%s%s\n" % (chr(195), chr(182), chr(195), chr(169)))
36 if self
.compressstream
is not None:
37 self
.file.write(self
.compressstream
.compress(str))
41 def beginobj(self
, object):
42 self
.refs
.append(self
.file.tell())
44 self
.refdict
[object] = ref
45 self
.write("%i 0 obj\n" % ref
)
48 self
.write("endobj\n")
50 def beginstream(self
):
51 self
.write("stream\n")
52 self
.beginstreampos
= self
.file.tell()
54 if self
.compressstream
is not None:
55 raise RuntimeError("compression within compression")
56 self
.compressstream
= zlib
.compressobj(self
.compresslevel
)
59 if self
.compressstream
is not None:
60 self
.file.write(self
.compressstream
.flush())
61 self
.compressstream
= None
62 length
= self
.file.tell() - self
.beginstreampos
63 self
.write("endstream\n")
66 def page(self
, abbox
, canvas
, mergedprolog
, ctrafo
):
68 self
.beginobj(PDFmediabox
% self
.pages
)
73 self
.beginobj(PDFresources
% self
.pages
)
75 if len([pritem
for pritem
in mergedprolog
if isinstance(pritem
, prolog
.fontdefinition
)]):
78 for pritem
in mergedprolog
:
79 if isinstance(pritem
, prolog
.fontdefinition
):
80 self
.write("/%s %d 0 R\n" % (pritem
.font
.getpsname(),
81 self
.refdict
[pritem
.font
.getpsname()]))
87 contentslengthref
= len(self
.refs
) + 2
88 self
.beginobj(PDFcontents
% self
.pages
)
90 "/Length %i 0 R\n" % contentslengthref
)
92 self
.write("/Filter /FlateDecode\n")
95 # apply a possible global transformation
96 if ctrafo
: ctrafo
.outputPDF(self
)
97 style
.linewidth
.normal
.outputPDF(self
)
98 canvas
.outputPDF(self
)
99 contentslength
= self
.endstream()
103 self
.beginobj(PDFcontentslength
% self
.pages
)
104 self
.write("%i\n" % contentslength
)
106 assert contentslengthref
== self
.refdict
[PDFcontentslength
% self
.pages
]
111 # page objects and pages object
112 # XXX: note that the page objects and the pages object refer to each other
113 pagesref
= len(self
.refs
) + self
.pages
+ 1
114 for page
in range(self
.pages
):
115 self
.beginobj(PDFpage
% page
)
120 "/Resources %i 0 R\n"
123 self
.refdict
[PDFmediabox
% page
],
124 self
.refdict
[PDFresources
% page
],
125 self
.refdict
[PDFcontents
% page
]))
127 self
.beginobj(PDFpages
)
132 ">>\n" % (" ".join(["%i 0 R" % self
.refdict
[PDFpage
% page
]
133 for page
in range(self
.pages
)]),
136 assert pagesref
== self
.refdict
[PDFpages
]
139 self
.beginobj(PDFcatalog
)
143 ">>\n" % self
.refdict
[PDFpages
])
147 xrefpos
= self
.file.tell()
150 "0000000000 65535 f \n" % (len(self
.refs
)+1))
151 for ref
in self
.refs
:
152 self
.file.write("%010i 00000 n \n" % ref
)
155 self
.write("trailer\n"
162 "%%%%EOF\n" % (len(self
.refs
)+1, self
.refdict
[PDFcatalog
], xrefpos
))