def allModesKIF(just, ifb=True, width=170): if ifb: fbreak() story.append( KeepInFrame(width - offset, 284 - offset, subStory(texts=(text0, )), mode=mode, hAlign=just)) fbreak() story.append( KeepInFrame(width - offset, 284 - offset, subStory(texts=(text0, text1)), mode=mode, hAlign=just)) fbreak() story.append( KeepInFrame(width - offset, 284 - offset, subStory(texts=(text0, text1, text2)), mode=mode, hAlign=just)) fbreak() story.append( KeepInFrame(width - offset, 284 - offset, subStory(texts=(text0, text1, text2), fbg=1), mode=mode, hAlign=just))
def _KeepInFrameTestCase(self, mode, offset=12): story = [] def fbreak(story=story): story.append(FrameBreak()) styleSheet = getSampleStyleSheet() H1 = styleSheet['Heading1'] H1.pageBreakBefore = 0 H1.keepWithNext = 0 bt = styleSheet['BodyText'] story.append( KeepInFrame(170 - offset, 284 - offset, [Paragraph(text0, bt)], mode=mode)) fbreak() story.append( KeepInFrame( 170 - offset, 284 - offset, [Paragraph(text0, bt), Paragraph(text1, bt)], mode=mode)) fbreak() story.append( KeepInFrame( 170 - offset, 284 - offset, [Paragraph(text0, bt), Paragraph(text1, bt), Paragraph(text2, bt)], mode=mode)) _showDoc('test_platypus_KeepInFrame%s.pdf' % mode, story)
def draw(self): self.canv.saveState() XP, YP = self.xp, self.yp self.resize_images(self.text) story = self.text W, H = (self.width - self.lm - self.rm), self.yp - self.y0 - self.bm # possible modes: shrink, truncate, overflow, error frame = KeepInFrame(W, H, story, mode="shrink") w, h = frame.wrapOn(self.canv, W, H) frame.drawOn(self.canv, self.xp, self.yp - h) self.addSpace(0, -h - 5 * mm) self.canv.restoreState()
def test(self): outPDF = "test_compare.pdf" pageSize = pagesizes.portrait(pagesizes.A4) canv = Canvas(outPDF, pagesize=pageSize) # common variables W, H = 5 * cm, 20 * cm kifMode = "shrink" # overflow/truncate/shrink/error # hyphenated column p = HyParagraph(testdata, sth) story = [p] frame = KeepInFrame(W, H, story, mode=kifMode) w, h = frame.wrapOn(canv, W, H) x, y = 100, 100 frame.drawOn(canv, x, y + (H - h)) canv.setLineWidth(2) canv.setStrokeColor(black) canv.circle(x, y, 10) canv.setStrokeColor(red) canv.rect(x, y, W, H) canv.setLineWidth(1) canv.setStrokeColor(blue) canv.rect(x, y + (H - h), w, h) # non-hyphenated column p = Paragraph(testdata, st) story = [p] frame = KeepInFrame(W, H, story, mode=kifMode) w, h = frame.wrapOn(canv, W, H) x, y = 300, 100 frame.drawOn(canv, x, y + (H - h)) canv.setLineWidth(2) canv.setStrokeColor(black) canv.circle(x, y, 10) canv.setStrokeColor(red) canv.rect(x, y, W, H) canv.setLineWidth(1) canv.setStrokeColor(blue) canv.rect(x, y + (H - h), w, h) canv.showPage() canv.save()
def end(self, c): tdata = c.tableData c.addPara() cell = c.story # Handle empty cells, they otherwise collapse if not cell: cell = ' ' c.swapStory(self.story) # zellen hinzufügen if 0: # tdata.keepinframe["maxWidth"] and tdata.keepinframe["maxHeight"]: # print tdata.keepinframe tdata.keepinframe["content"] = cell cell = KeepInFrame(**tdata.keepinframe) tdata.add_cell(cell)
def pisaLoop(node, context, path=None, **kw): if path is None: path = [] # Initialize KW if not kw: kw = { "margin-top": 0, "margin-bottom": 0, "margin-left": 0, "margin-right": 0, } else: kw = copy.copy(kw) # indent = len(path) * " " # only used for debug print statements # TEXT if node.nodeType == Node.TEXT_NODE: # print indent, "#", repr(node.data) #, context.frag context.addFrag(node.data) # context.text.append(node.value) # ELEMENT elif node.nodeType == Node.ELEMENT_NODE: node.tagName = node.tagName.replace(":", "").lower() if node.tagName in ("style", "script"): return path = copy.copy(path) + [node.tagName] # Prepare attributes attr = pisaGetAttributes(context, node.tagName, node.attributes) # log.debug(indent + "<%s %s>" % (node.tagName, attr) + # repr(node.attributes.items())) #, path # Calculate styles context.cssAttr = CSSCollect(node, context) context.cssAttr = mapNonStandardAttrs(context.cssAttr, node, attr) context.node = node # Block? PAGE_BREAK = 1 PAGE_BREAK_RIGHT = 2 PAGE_BREAK_LEFT = 3 pageBreakAfter = False frameBreakAfter = False display = lower(context.cssAttr.get("display", "inline")) # print indent, node.tagName, display, # context.cssAttr.get("background-color", None), attr isBlock = (display == "block") if isBlock: context.addPara() # Page break by CSS if "-pdf-next-page" in context.cssAttr: context.addStory( NextPageTemplate(str(context.cssAttr["-pdf-next-page"]))) if "-pdf-page-break" in context.cssAttr: if str(context.cssAttr["-pdf-page-break"]).lower() == "before": context.addStory(PageBreak()) if "-pdf-frame-break" in context.cssAttr: if str(context.cssAttr["-pdf-frame-break"]).lower() == "before": context.addStory(FrameBreak()) if str(context.cssAttr["-pdf-frame-break"]).lower() == "after": frameBreakAfter = True if "page-break-before" in context.cssAttr: if str(context.cssAttr["page-break-before"]).lower() == "always": context.addStory(PageBreak()) if str(context.cssAttr["page-break-before"]).lower() == "right": context.addStory(PageBreak()) context.addStory(PmlRightPageBreak()) if str(context.cssAttr["page-break-before"]).lower() == "left": context.addStory(PageBreak()) context.addStory(PmlLeftPageBreak()) if "page-break-after" in context.cssAttr: if str(context.cssAttr["page-break-after"]).lower() == "always": pageBreakAfter = PAGE_BREAK if str(context.cssAttr["page-break-after"]).lower() == "right": pageBreakAfter = PAGE_BREAK_RIGHT if str(context.cssAttr["page-break-after"]).lower() == "left": pageBreakAfter = PAGE_BREAK_LEFT if display == "none": # print "none!" return # Translate CSS to frags # Save previous frag styles context.pushFrag() # Map styles to Reportlab fragment properties CSS2Frag(context, kw, isBlock) # EXTRAS transform_attrs(context.frag, ( ("keepWithNext", "-pdf-keep-with-next"), ("outline", "-pdf-outline"), ("borderLeftColor", "-pdf-outline-open"), ), context.cssAttr, getBool ) if "-pdf-outline-level" in context.cssAttr: context.frag.outlineLevel = int( context.cssAttr["-pdf-outline-level"]) if "-pdf-word-wrap" in context.cssAttr: context.frag.wordWrap = context.cssAttr["-pdf-word-wrap"] # handle keep-in-frame keepInFrameMode = None keepInFrameMaxWidth = 0 keepInFrameMaxHeight = 0 if "-pdf-keep-in-frame-mode" in context.cssAttr: value = str( context.cssAttr["-pdf-keep-in-frame-mode"]).strip().lower() if value in ("shrink", "error", "overflow", "truncate"): keepInFrameMode = value else: keepInFrameMode = "shrink" # Added because we need a default value. if "-pdf-keep-in-frame-max-width" in context.cssAttr: keepInFrameMaxWidth = getSize( "".join(context.cssAttr["-pdf-keep-in-frame-max-width"])) if "-pdf-keep-in-frame-max-height" in context.cssAttr: keepInFrameMaxHeight = getSize( "".join(context.cssAttr["-pdf-keep-in-frame-max-height"])) # ignore nested keep-in-frames, tables have their own KIF handling keepInFrame = keepInFrameMode is not None and context.keepInFrameIndex is None if keepInFrame: # keep track of current story index, so we can wrap everythink # added after this point in a KeepInFrame context.keepInFrameIndex = len(context.story) # BEGIN tag klass = globals().get("pisaTag%s" % node.tagName.replace(":", "").upper(), None) obj = None # Static block elementId = attr.get("id", None) staticFrame = context.frameStatic.get(elementId, None) if staticFrame: context.frag.insideStaticFrame += 1 oldStory = context.swapStory() # Tag specific operations if klass is not None: obj = klass(node, attr) obj.start(context) # Visit child nodes context.fragBlock = fragBlock = copy.copy(context.frag) for nnode in node.childNodes: pisaLoop(nnode, context, path, **kw) context.fragBlock = fragBlock # END tag if obj: obj.end(context) # Block? if isBlock: context.addPara() # XXX Buggy! # Page break by CSS if pageBreakAfter: context.addStory(PageBreak()) if pageBreakAfter == PAGE_BREAK_RIGHT: context.addStory(PmlRightPageBreak()) if pageBreakAfter == PAGE_BREAK_LEFT: context.addStory(PmlLeftPageBreak()) if frameBreakAfter: context.addStory(FrameBreak()) if keepInFrame: # get all content added after start of -pdf-keep-in-frame and wrap # it in a KeepInFrame substory = context.story[context.keepInFrameIndex:] context.story = context.story[:context.keepInFrameIndex] context.story.append( KeepInFrame( content=substory, maxWidth=keepInFrameMaxWidth, maxHeight=keepInFrameMaxHeight, mode=keepInFrameMode)) # mode wasn't being used; it is necessary for tables or images at # end of page. context.keepInFrameIndex = None # Static block, END if staticFrame: context.addPara() for frame in staticFrame: frame.pisaStaticStory = context.story context.swapStory(oldStory) context.frag.insideStaticFrame -= 1 # context.debug(1, indent, "</%s>" % (node.tagName)) # Reset frag style context.pullFrag() # Unknown or not handled else: # context.debug(1, indent, "???", node, node.nodeType, repr(node)) # Loop over children for node in node.childNodes: pisaLoop(node, context, path, **kw)
def wrap(self, availWidth, availHeight): availWidth = max(availWidth, 1.0) self.maxWidth = availWidth self.maxHeight = self.setMaxHeight(availHeight) return KeepInFrame.wrap(self, availWidth, availHeight)
def drawAt(self, x, y): KeepInFrame.drawOn(self, self.ctx.canvas, x, self.ctx.page_height - y)
def __init__(self, ctx, *args, **kwargs): self.ctx = ctx self.canv = None # bug? KeepInFrame.__init__(self, *args, **kwargs)