/usr/lib/python3/dist-packages/reportlab/pdfbase/pdfpattern.py is in python3-reportlab 3.3.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | __doc__="""helper for importing pdf structures into a ReportLab generated document
"""
from reportlab.pdfbase.pdfdoc import format, PDFObject, pdfdocEnc
from reportlab.lib.utils import strTypes
def _patternSequenceCheck(pattern_sequence):
allowedTypes = strTypes if isinstance(strTypes, tuple) else (strTypes,)
allowedTypes = allowedTypes + (PDFObject,PDFPatternIf)
for x in pattern_sequence:
if not isinstance(x,allowedTypes):
if len(x)!=1:
raise ValueError("sequence elts must be strings/bytes/PDFPatternIfs or singletons containing strings: "+ascii(x))
if not isinstance(x[0],strTypes):
raise ValueError("Singletons must contain strings/bytes or PDFObject instances only: "+ascii(x[0]))
class PDFPattern(PDFObject):
__RefOnly__ = 1
def __init__(self, pattern_sequence, **keywordargs):
"""
Description of a kind of PDF object using a pattern.
Pattern sequence should contain strings, singletons of form [string] or
PDFPatternIf objects.
Strings are literal strings to be used in the object.
Singletons are names of keyword arguments to include.
PDFpatternIf objects allow some conditionality.
Keyword arguments can be non-instances which are substituted directly in string conversion,
or they can be object instances in which case they should be pdfdoc.* style
objects with a x.format(doc) method.
Keyword arguments may be set on initialization or subsequently using __setitem__, before format.
"constant object" instances can also be inserted in the patterns.
"""
_patternSequenceCheck(pattern_sequence)
self.pattern = pattern_sequence
self.arguments = keywordargs
def __setitem__(self, item, value):
self.arguments[item] = value
def __getitem__(self, item):
return self.arguments[item]
def eval(self,L):
arguments = self.arguments
document = self.__document
for x in L:
if isinstance(x,strTypes):
yield pdfdocEnc(x)
elif isinstance(x,PDFObject):
yield x.format(document)
elif isinstance(x,PDFPatternIf):
result = list(self.eval(x.cond))
cond = result and result[0]
for z in self.eval(x.thenPart if cond else x.elsePart):
yield z
else:
name = x[0]
value = arguments.get(name, None)
if value is None:
raise ValueError("%s value not defined" % ascii(name))
if isinstance(value,PDFObject):
yield format(value,document)
elif isinstance(value,strTypes):
yield pdfdocEnc(value)
else:
yield pdfdocEnc(str(value))
def format(self, document):
self.__document = document
try:
return b"".join(self.eval(self.pattern))
finally:
del self.__document
def clone(self):
c = object.__new__(self.__class__)
c.pattern = self.pattern
c.arguments = self.arguments
return c
class PDFPatternIf(object):
'''cond will be evaluated as [cond] in PDFpattern eval.
It should evaluate to a list with value 0/1 etc etc.
thenPart is a list to be evaluated if the cond evaulates true,
elsePart is the false sequence.
'''
def __init__(self,cond,thenPart=[],elsePart=[]):
if not isinstance(cond,list): cond = [cond]
for x in cond, thenPart, elsePart:
_patternSequenceCheck(x)
self.cond = cond
self.thenPart = thenPart
self.elsePart = elsePart
|