Exemple #1
0
def pisaStory(
    src,
    path = None,
    link_callback = None,
    debug = 0,
    default_css = None,
    xhtml = False,
    encoding = None,
    c = None,
    xml_output = None,
    **kw):

    # Prepare Context
    if not c:
        c = pisaContext(path, debug=debug)
        c.pathCallback = link_callback

    # Use a default set of CSS definitions to get an expected output
    if default_css is None:
        default_css = DEFAULT_CSS

    # Parse and fill the story
    pisaParser(src, c, default_css, xhtml, encoding, xml_output)

    #if 0:
    #    import reportlab.pdfbase.pdfmetrics as pm
    #    pm.dumpFontData()

    # Avoid empty documents
    if not c.story:
        c.story = [Spacer(1,1)]
        # c.addPara(force=True)

    # Remove anchors if they do not exist (because of a bug in Reportlab)
    for frag, anchor in c.anchorFrag:
        if anchor not in c.anchorName:
            frag.link = None

    return c
def pisaStory(
    src,
    path = None,
    link_callback = None,
    debug = 0,
    default_css = None,
    xhtml = False,
    encoding = None,
    c = None,
    xml_output = None,
    **kw):

    # Prepare Context
    if not c:
        c = pisaContext(path, debug=debug)
        c.pathCallback = link_callback

    # Use a default set of CSS definitions to get an expected output
    if default_css is None:
        default_css = DEFAULT_CSS

    # Parse and fill the story
    pisaParser(src, c, default_css, xhtml, encoding, xml_output)

    #if 0:
    #    import reportlab.pdfbase.pdfmetrics as pm
    #    pm.dumpFontData()

    # Avoid empty documents
    if not c.story:
        c.story = [Spacer(1,1)]
        # c.addPara(force=True)

    # Remove anchors if they do not exist (because of a bug in Reportlab)
    for frag, anchor in c.anchorFrag:
        if anchor not in c.anchorName:
            frag.link = None

    return c
Exemple #3
0
def pisaDocument(
    src,
    dest = None,
    path = None,
    link_callback = None,
    debug = 0,
    show_error_as_pdf = False,
    default_css = None,
    xhtml = False,
    encoding = None,
    xml_output = None,
    raise_exception = True,
    capacity = 100 * 1024, # -1,
    **kw):
    
    c = None    
    if show_error_as_pdf:
        raise_exception = False
    
    try:

        log.debug("pisaDocument options:\n  src = %r\n  dest = %r\n  path = %r\n  link_callback = %r\n  xhtml = %r",
            src,
            dest,
            path,
            link_callback,
            xhtml)

        # Prepare simple context
        c = pisaContext(path, debug=debug, capacity=capacity)
        c.pathCallback = link_callback

        if dest is None:
            dest = pisaTempFile(capacity=c.capacity)
        c.dest = dest

        # Build story
        c = pisaStory(src, path, link_callback, debug, default_css, xhtml, encoding, c=c, xml_output=xml_output)

        # Buffer PDF into memory
        out = pisaTempFile(capacity=c.capacity)

        doc = PmlBaseDoc(
            out,
            pagesize = c.pageSize,
            author = c.meta["author"].strip(),
            subject = c.meta["subject"].strip(),
            keywords = [x.strip() for x in c.meta["keywords"].strip().split(",") if x],
            title = c.meta["title"].strip(),
            showBoundary = 0,
            allowSplitting = 1)

        # XXX It is not possible to access PDF info, because it is private in canvas
        # doc.info.producer = "pisa <http://www.holtwick.it>"

        # Prepare templates and their frames
        if c.templateList.has_key("body"):
            body = c.templateList["body"]
            del c.templateList["body"]
        else:
            x, y, w, h = getBox("1cm 1cm -1cm -1cm", c.pageSize)
            body = PmlPageTemplate(
                id="body",
                frames=[
                    Frame(x, y, w, h,
                        id = "body",
                        leftPadding = 0,
                        rightPadding = 0,
                        bottomPadding = 0,
                        topPadding = 0)],
                pagesize = c.pageSize)

        # print body.frames

        # print [body] + c.templateList.values()
        doc.addPageTemplates([body] + c.templateList.values())

        # Use multibuild e.g. if a TOC has to be created
        if c.multiBuild:
            doc.multiBuild(c.story)
        else:
            doc.build(c.story)

        # Add watermarks
        if pyPdf:                      
            for bgouter in c.pisaBackgroundList:     
                          
                # If we have at least one background, then lets do it
                if bgouter:
                    
                    istream = out                    
                    try:
                        output = pyPdf.PdfFileWriter()
                        input1 = pyPdf.PdfFileReader(istream)
                        ctr = 0
                        for bg in c.pisaBackgroundList:                            
                            page = input1.getPage(ctr)
                            if bg and not bg.notFound() and (bg.mimetype=="application/pdf"):
                                bginput = pyPdf.PdfFileReader(bg.getFile())
                                pagebg = bginput.getPage(0)
                                pagebg.mergePage(page)
                                page = pagebg
                            else:
                                log.warn(c.warning("Background PDF %s doesn't exist.", bg))
                            output.addPage(page)
                            ctr += 1
                        out = pisaTempFile(capacity=c.capacity)
                        output.write(out)
                        # data = sout.getvalue()
                    except Exception:
                        log.exception(c.error("pyPDF error"))   
                        if raise_exception:
                            raise
                 
                    
                    # Found a background? So leave loop after first occurence
                    break
        else:
            log.warn(c.warning("pyPDF not installed!"))

        # In web frameworks for debugging purposes maybe an output of
        # errors in a PDF is preferred        
        if show_error_as_pdf and c and c.err:
            return pisaErrorDocument(c.dest, c)

        # Get the resulting PDF and write it to the file object
        # passed from the caller
        data = out.getvalue()
        c.dest.write(data)
            
    except:
        # log.exception(c.error("Document error"))        
        log.exception("Document error")
        c.err += 1
        if raise_exception:
            raise

    if raise_exception and c.err:
        raise Exception("Errors occured, please see log files for more informations") 

    return c
Exemple #4
0
def pisaDocument(
        src,
        dest=None,
        path=None,
        link_callback=None,
        debug=0,
        show_error_as_pdf=False,
        default_css=None,
        xhtml=False,
        encoding=None,
        xml_output=None,
        raise_exception=True,
        capacity=100 * 1024,  # -1,
        **kw):

    c = None
    if show_error_as_pdf:
        raise_exception = False

    try:

        log.debug(
            "pisaDocument options:\n  src = %r\n  dest = %r\n  path = %r\n  link_callback = %r\n  xhtml = %r",
            src, dest, path, link_callback, xhtml)

        # Prepare simple context
        c = pisaContext(path, debug=debug, capacity=capacity)
        c.pathCallback = link_callback

        if dest is None:
            dest = pisaTempFile(capacity=c.capacity)
        c.dest = dest

        # Build story
        c = pisaStory(src,
                      path,
                      link_callback,
                      debug,
                      default_css,
                      xhtml,
                      encoding,
                      c=c,
                      xml_output=xml_output)

        # Buffer PDF into memory
        out = pisaTempFile(capacity=c.capacity)

        doc = PmlBaseDoc(out,
                         pagesize=c.pageSize,
                         author=c.meta["author"].strip(),
                         subject=c.meta["subject"].strip(),
                         keywords=[
                             x.strip()
                             for x in c.meta["keywords"].strip().split(",")
                             if x
                         ],
                         title=c.meta["title"].strip(),
                         showBoundary=0,
                         allowSplitting=1)

        # XXX It is not possible to access PDF info, because it is private in canvas
        # doc.info.producer = "pisa <http://www.holtwick.it>"

        # Prepare templates and their frames
        if c.templateList.has_key("body"):
            body = c.templateList["body"]
            del c.templateList["body"]
        else:
            x, y, w, h = getBox("1cm 1cm -1cm -1cm", c.pageSize)
            body = PmlPageTemplate(id="body",
                                   frames=[
                                       Frame(x,
                                             y,
                                             w,
                                             h,
                                             id="body",
                                             leftPadding=0,
                                             rightPadding=0,
                                             bottomPadding=0,
                                             topPadding=0)
                                   ],
                                   pagesize=c.pageSize)

        # print body.frames

        # print [body] + c.templateList.values()
        doc.addPageTemplates([body] + c.templateList.values())

        # Use multibuild e.g. if a TOC has to be created
        if c.multiBuild:
            doc.multiBuild(c.story)
        else:
            doc.build(c.story)

        # Add watermarks
        if pyPdf:
            for bgouter in c.pisaBackgroundList:

                # If we have at least one background, then lets do it
                if bgouter:

                    istream = out
                    try:
                        output = pyPdf.PdfFileWriter()
                        input1 = pyPdf.PdfFileReader(istream)
                        ctr = 0
                        for bg in c.pisaBackgroundList:
                            page = input1.getPage(ctr)
                            if bg and not bg.notFound() and (
                                    bg.mimetype == "application/pdf"):
                                bginput = pyPdf.PdfFileReader(bg.getFile())
                                pagebg = bginput.getPage(0)
                                pagebg.mergePage(page)
                                page = pagebg
                            else:
                                log.warn(
                                    c.warning(
                                        "Background PDF %s doesn't exist.",
                                        bg))
                            output.addPage(page)
                            ctr += 1
                        out = pisaTempFile(capacity=c.capacity)
                        output.write(out)
                        # data = sout.getvalue()
                    except Exception:
                        log.exception(c.error("pyPDF error"))
                        if raise_exception:
                            raise

                    # Found a background? So leave loop after first occurence
                    break
        else:
            log.warn(c.warning("pyPDF not installed!"))

        # In web frameworks for debugging purposes maybe an output of
        # errors in a PDF is preferred
        if show_error_as_pdf and c and c.err:
            return pisaErrorDocument(c.dest, c)

        # Get the resulting PDF and write it to the file object
        # passed from the caller
        data = out.getvalue()
        c.dest.write(data)

    except:
        # log.exception(c.error("Document error"))
        log.exception("Document error")
        c.err += 1
        if raise_exception:
            raise

    if raise_exception and c.err:
        raise Exception(
            "Errors occured, please see log files for more informations")

    return c
def pisaDocument(
    src, 
    dest, 
    path = None, 
    link_callback = None,
    debug = 0,
    show_error_as_pdf = False, 
    default_css = None,
    **kw):

    try:       
        c = pisaContext(
            path, 
            debug = debug)
        c.pathCallback = link_callback
        
        # XXX Handle strings and files    
        if type(src) in types.StringTypes:
            src = cStringIO.StringIO(src)
        
        if default_css is None:
            default_css = DEFAULT_CSS
        
        pisaParser(src, c, default_css)
    
        if 0:
            import reportlab.pdfbase.pdfmetrics as pm
            pm.dumpFontData()
        
        # Avoid empty pages
        if not c.story:
            c.addPara(force=True)
    
        # Remove anchors if they do not exist (because of a bug in Reportlab)
        for frag, anchor in c.anchorFrag:       
            if anchor not in c.anchorName:                        
                frag.link = None
                
        out = cStringIO.StringIO()
        
        doc = PmlBaseDoc(
            out,
            pagesize = c.pageSize,
            author = c.meta["author"].strip(),
            subject = c.meta["subject"].strip(),
            keywords = [x.strip() for x in c.meta["keywords"].strip().split(",") if x],
            title = c.meta["title"].strip(),
            showBoundary = 0,
            allowSplitting = 1)
    
        # XXX It is not possible to access PDF info, because it is private in canvas
        # doc.info.producer = "pisa <http://www.holtwick.it>" 
               
        if c.templateList.has_key("body"):
            body = c.templateList["body"]
            del c.templateList["body"]
        else:
            x, y, w, h = getBox("1cm 1cm -1cm -1cm", c.pageSize)    
            body = PmlPageTemplate(
                id="body",
                frames=[
                    Frame(x, y, w, h, 
                        id = "body",
                        leftPadding = 0,
                        rightPadding = 0,
                        bottomPadding = 0,
                        topPadding = 0)],
                pagesize = c.pageSize)
    
        # print body.frames
    
        # print [body] + c.templateList.values()
        doc.addPageTemplates([body] + c.templateList.values())             
        doc.build(c.story)    
        
        # Add watermarks
        if pyPdf:             
            # print c.pisaBackgroundList   
            for bgouter in c.pisaBackgroundList:                    
                # If we have at least one background, then lets do it
                if bgouter:
                    istream = out 
                    # istream.seek(2,0) #cStringIO.StringIO(data)
                    try:                            
                        output = pyPdf.PdfFileWriter()
                        input1 = pyPdf.PdfFileReader(istream)
                        ctr = 0                        
                        for bg in c.pisaBackgroundList:                                
                            page = input1.getPage(ctr)
                            if bg:
                                if os.path.exists(bg):                    
                                    # print "BACK", bg                
                                    bginput = pyPdf.PdfFileReader(open(bg, "rb"))
                                    # page.mergePage(bginput.getPage(0))
                                    pagebg = bginput.getPage(0)
                                    pagebg.mergePage(page)
                                    page = pagebg 
                                else:
                                    c.warning("Background PDF %s doesn't exist." % bg)
                            output.addPage(page)
                            ctr += 1
                        out = cStringIO.StringIO()
                        output.write(out)
                        # data = sout.getvalue()
                    except Exception, e:
                        c.error("Exception: %s" % str(e))
                    # istream.close()
                # Found a background? So leave loop after first occurence
                break
        else:
def pisaDocument(src,
                 dest,
                 path=None,
                 link_callback=None,
                 debug=0,
                 show_error_as_pdf=False,
                 default_css=None,
                 **kw):

    try:
        c = pisaContext(path, debug=debug)
        c.pathCallback = link_callback

        # XXX Handle strings and files
        if type(src) in types.StringTypes:
            src = cStringIO.StringIO(src)

        if default_css is None:
            default_css = DEFAULT_CSS

        pisaParser(src, c, default_css)

        if 0:
            import reportlab.pdfbase.pdfmetrics as pm
            pm.dumpFontData()

        # Avoid empty pages
        if not c.story:
            c.addPara(force=True)

        # Remove anchors if they do not exist (because of a bug in Reportlab)
        for frag, anchor in c.anchorFrag:
            if anchor not in c.anchorName:
                frag.link = None

        out = cStringIO.StringIO()

        doc = PmlBaseDoc(out,
                         pagesize=c.pageSize,
                         author=c.meta["author"].strip(),
                         subject=c.meta["subject"].strip(),
                         keywords=[
                             x.strip()
                             for x in c.meta["keywords"].strip().split(",")
                             if x
                         ],
                         title=c.meta["title"].strip(),
                         showBoundary=0,
                         allowSplitting=1)

        # XXX It is not possible to access PDF info, because it is private in canvas
        # doc.info.producer = "pisa <http://www.holtwick.it>"

        if c.templateList.has_key("body"):
            body = c.templateList["body"]
            del c.templateList["body"]
        else:
            x, y, w, h = getBox("1cm 1cm -1cm -1cm", c.pageSize)
            body = PmlPageTemplate(id="body",
                                   frames=[
                                       Frame(x,
                                             y,
                                             w,
                                             h,
                                             id="body",
                                             leftPadding=0,
                                             rightPadding=0,
                                             bottomPadding=0,
                                             topPadding=0)
                                   ],
                                   pagesize=c.pageSize)

        # print body.frames

        # print [body] + c.templateList.values()
        doc.addPageTemplates([body] + c.templateList.values())
        doc.build(c.story)

        # Add watermarks
        if pyPdf:
            # print c.pisaBackgroundList
            for bgouter in c.pisaBackgroundList:
                # If we have at least one background, then lets do it
                if bgouter:
                    istream = out
                    # istream.seek(2,0) #cStringIO.StringIO(data)
                    try:
                        output = pyPdf.PdfFileWriter()
                        input1 = pyPdf.PdfFileReader(istream)
                        ctr = 0
                        for bg in c.pisaBackgroundList:
                            page = input1.getPage(ctr)
                            if bg:
                                if os.path.exists(bg):
                                    # print "BACK", bg
                                    bginput = pyPdf.PdfFileReader(
                                        open(bg, "rb"))
                                    # page.mergePage(bginput.getPage(0))
                                    pagebg = bginput.getPage(0)
                                    pagebg.mergePage(page)
                                    page = pagebg
                                else:
                                    c.warning(
                                        "Background PDF %s doesn't exist." %
                                        bg)
                            output.addPage(page)
                            ctr += 1
                        out = cStringIO.StringIO()
                        output.write(out)
                        # data = sout.getvalue()
                    except Exception, e:
                        c.error("Exception: %s" % str(e))
                    # istream.close()
                # Found a background? So leave loop after first occurence
                break
        else: