def test3(self):
     '''compare CJK splitting in some edge cases'''
     from reportlab.pdfgen.canvas import Canvas
     from reportlab.platypus.paragraph import Paragraph
     from reportlab.lib.styles import ParagraphStyle
     from reportlab.pdfbase import pdfmetrics
     from reportlab.lib.enums import TA_LEFT
     sty = ParagraphStyle('A')
     sty.fontSize = 15
     sty.leading = sty.fontSize*1.2
     sty.fontName = 'Courier'
     sty.alignment = TA_LEFT
     sty.wordWrap = 'CJK'
     p0=Paragraph('ABCDEFGHIJKL]N',sty)
     p1=Paragraph('AB<font color="red">C</font>DEFGHIJKL]N',sty)
     canv = Canvas('test_platypus_paragraph_cjk3.pdf')
     ix = len(canv._code)
     aW = pdfmetrics.stringWidth('ABCD','Courier',15)
     w,h=p0.wrap(aW,1000000)
     y = canv._pagesize[1]-72-h
     p0.drawOn(canv,72,y)
     w,h=p1.wrap(aW,1000000)
     y -= h+10
     p1.drawOn(canv,72,y)
     w,h=p0.wrap(aW*0.25-2,1000000)
     y -= h+10
     p0.drawOn(canv,72,y)
     w,h=p1.wrap(aW/4.-2,1000000)
     y -= h+10
     p1.drawOn(canv,72,y)
     assert canv._code[ix:]==['q', '1 0 0 1 72 697.8898 cm', 'q', '0 0 0 rg', 'BT 1 0 0 1 0 57 Tm /F2 15 Tf 18 TL (ABCD) Tj T* (EFGH) Tj T* (IJKL]) Tj T* (N) Tj T* ET', 'Q', 'Q', 'q', '1 0 0 1 72 615.8898 cm', 'q', 'BT 1 0 0 1 0 57 Tm 18 TL /F2 15 Tf 0 0 0 rg (AB) Tj 1 0 0 rg (C) Tj 0 0 0 rg (D) Tj T* (EFGH) Tj T* (IJKL]) Tj T* (N) Tj T* ET', 'Q', 'Q', 'q', '1 0 0 1 72 353.8898 cm', 'q', '0 0 0 rg', 'BT 1 0 0 1 0 237 Tm /F2 15 Tf 18 TL (A) Tj T* (B) Tj T* (C) Tj T* (D) Tj T* (E) Tj T* (F) Tj T* (G) Tj T* (H) Tj T* (I) Tj T* (J) Tj T* (K) Tj T* (L) Tj T* (]) Tj T* (N) Tj T* ET', 'Q', 'Q', 'q', '1 0 0 1 72 91.88976 cm', 'q', 'BT 1 0 0 1 0 237 Tm 18 TL /F2 15 Tf 0 0 0 rg (A) Tj T* (B) Tj T* 1 0 0 rg (C) Tj T* 0 0 0 rg (D) Tj T* (E) Tj T* (F) Tj T* (G) Tj T* (H) Tj T* (I) Tj T* (J) Tj T* (K) Tj T* (L) Tj T* (]) Tj T* (N) Tj T* ET', 'Q', 'Q']
     canv.showPage()
     canv.save()
Example #2
0
    def myCanvasMaker(fn, **kw):
        from reportlab.pdfgen.canvas import Canvas

        canv = Canvas(fn, **kw)
        # attach our callback to the canvas
        canv.myOnDrawCB = myOnDrawCB
        return canv
Example #3
0
 def get_chart(self, chart, fmt, data, width=1000, params=None):
     chart = BytesIO()
     canvas = Canvas(chart, pagesize=(140, 140))
     canvas.drawString(10, 70, "This is a diagram")
     canvas.save()
     chart.seek(0)
     return chart
 def print_cards(self, issues):
     """
     Generate a PDF file with the changed issues
     
     In the final version of this service, it will send the issue data to the
     print service via REST instead of doing all of this file IO
     
     Returns the name of the file created.
     
     @TODO: this writes a file - defer it to a thread
     """
     
     if not issues:
         return
     
     print >>sys.stdout, "Printing %s cards" % (len(issues))
     
     sys.stdout.flush()
     
     output_file = datetime.now().strftime("%Y-%m-%d-%H%M%S")+'.pdf'
     
     # 5 x 3 index card size
     page_width = 5*inch
     page_height = 3*inch
     canvas = Canvas(output_file, pagesize=(page_width, page_height))  
     
     for issue in issues:
         
         # print >>sys.stdout, pprint.pformat(issue)
         # sys.stdout.flush()
         
         issue_type = self.types.get(issue['type'], 'Unknown')
         icon = icons.get(issue_type, icons['Unknown'])
         
         issue_priority = self.priorities.get(issue['priority'], 'Unknown')
         priority_icon = priority_icons.get(issue_priority, priority_icons['Unknown'])
         priority_color = priority_colors.get(issue_priority, priority_colors['Unknown'])
         
         story_info = {
             'summary': issue['summary'],
             'detail': issue.get('description', ''),
             'id': issue['key'],
             'type': issue_type,
             'reporter': self.users[issue['reporter']]['fullname'],
             'date': datetime.strptime(issue['created'], "%Y-%m-%d %H:%M:%S.0"),
             'icon': icon,
             'priority_icon': priority_icon,
             'header_bg_color': priority_color,
         }
         
         story_info['formatted_date'] = story_info['date'].strftime('%m/%d @ %I:%M %p')
         
         add_card(canvas, story_info, page_width, page_height);
     
     canvas.save()
     
     print >>sys.stdout, "Wrote %s" % (output_file)
     sys.stdout.flush()
     
     return output_file
def generate_chart(chart, filename):
    if filename.lower().endswith(".pdf"):
        format = "pdf"
    elif filename.lower().endswith(".png"):
        format = "png"
    else:
        print("Unsupported file format: " + filename)
        return

    if format == "pdf":
        output = Canvas(filename)
    elif format == "png":
        image  = Image.new("RGB", (CHART_WIDTH, CHART_HEIGHT),
                           "#ffffff")
        output = ImageDraw.Draw(image)

    renderer.draw(format, "title",  chart, output)
    renderer.draw(format, "x_axis", chart, output)
    renderer.draw(format, "y_axis", chart, output)
    if chart['series_type'] == "bar":
        renderer.draw(format, "bar_series", chart, output)
    elif chart['series_type'] == "line":
        renderer.draw(format, "line_series", chart, output)

    if format == "pdf":
        output.showPage()
        output.save()
    elif format == "png":
        image.save(filename, format="png")
Example #6
0
    def __init__(self, *args, **kwargs):
        self._nc_x = kwargs.pop('x')
        self._nc_y = kwargs.pop('y')
        self._nc_text = kwargs.pop('text')

        Canvas.__init__(self, *args, **kwargs)
        self._codes = []
 def get_pdf(self, text, use_design=False):
     """
     Given the text, produces an A4 blank PDF with the text put in the
     position given by the tranlsation box.
     :param text: Text to put inside a translation box
     :param use_design: Set to true to use a design in the background
     :return: Rendered PDF
     :rtype: pypdf.PdfFileReader if use_design is False or PdfFileWriter
     """
     self.ensure_one()
     packet = StringIO.StringIO()
     can = Canvas(packet, bottomup=0)
     text_wrap = self._wrap_text(text, can._fontname, can._fontsize)
     top = self.top*inch
     left = self.left*inch
     for line in text_wrap[:self.nb_lines+1]:
         can.drawString(left, top, line)
         top += can._leading
     can.save()
     # Move to the beginning of the StringIO buffer
     packet.seek(0)
     remaining = ''
     if len(text_wrap) > self.nb_lines:
         remaining = ' '.join(text_wrap[self.nb_lines+1:])
     out_pdf = PdfFileReader(packet)
     if use_design:
         design_pdf_path = self.env['ir.config_parameter'].get_param(
             'sbc_compassion.composition_design')
         if design_pdf_path:
             design_pdf = PdfFileReader(file(design_pdf_path, 'rb'))
             page = design_pdf.getPage(0)
             page.mergePage(out_pdf.getPage(0))
             out_pdf = PdfFileWriter()
             out_pdf.addPage(page)
     return out_pdf, remaining
Example #8
0
def print_pdf(request, tag_id, type):
    from reportlab.pdfgen.canvas import Canvas
    from labels.pdf_templates import LabelPDF
    #Letter is a paper format, you can import A4 for example
    from reportlab.lib.pagesizes import letter

    tag = get_object_or_404(Tag, pk=tag_id)

    #name of the pdf
    fname = "mylabels.pdf"
    #Generating response for file
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=%s' %(fname)

    #creating the canvas object. You can change "letter" with another paper type
    c  = Canvas(response, pagesize=letter)
    #LabelPDF is the class in pdf_templates that draws on the pdf
    pdf = LabelPDF(tag,type)
    #pdf.showBoundary=1  # Turns this on for debugging purposes.
    c = pdf.draw_frames(c)

    c.save()

    return response

    tv = {'tag_id':tag_id}
    return render_to_response("labels/print.html",tv)
Example #9
0
 def __init__(self, name, data):
     self.name = name
     self.states = data.get('cellStates')
     self.signals = data.get('signals')
     self.parents = data.get('lineage')
     self.data = data
     Canvas.__init__(self, name)
Example #10
0
 def testUtf8FileName(self):
     fn=outputfile('test_pdfbase_utf8_filename')
     if not isUnicode(fn): fn = fn.decode('utf8')
     fn += u'_portr\xe4t.pdf'
     c = Canvas(fn)
     c.drawString(100,700, u'Filename='+fn)
     c.save()
Example #11
0
File: pdf.py Project: indico/indico
 def get_pdf(self):
     data = BytesIO()
     canvas = Canvas(data, pagesize=self.page_size)
     self._build_pdf(canvas)
     canvas.save()
     data.seek(0)
     return data
Example #12
0
def run(infile, outfile):
    data = compile(infile)
    c = Canvas(outfile,pagesize=pageSize,pageCompression=0)
    lines(c)
    left = notes(c, data)
    c.showPage()
    c.save()
Example #13
0
def buildPDFx6(marginmm, urls):
    width = 6 * inch
    height = 4 * inch
    square = 2 * inch
    margin = marginmm * mm
    card_width = square-(margin * 2)
    buffer = StringIO()
    pdf = Canvas(buffer)
    pdf.setPageSize((width,height))
    def create_image(url):
        for i in [1,2]:
            try:
                return ImageReader(url)
            except IOError:
                pass
        return ImageReader(url)

    def put_image(x,y,url):
      if url != "":
        img = create_image(url)
        pdf.drawImage(img,(square*x)+margin,(square*y)+margin,
              width=card_width, height=card_width)

    put_image(0,1,urls[0])
    put_image(0,0,urls[1])
    put_image(1,1,urls[2])
    put_image(1,0,urls[3])
    put_image(2,1,urls[4])
    put_image(2,0,urls[5])
    pdf.save()
    data = buffer.getvalue()
    buffer.close()
    return data
Example #14
0
def generer_coupons(output_file, coupon):
    """

    :param output_file: File
    :param coupon: Coupon
    :return:
    """
    # Styles
    styles = StyleSheet()
    styles.add_style('normal', fontName='Helvetica', fontSize=14)
    styles.add_style('normal-centered', fontName='Helvetica', fontSize=14,
                     alignment=TA_CENTER)
    styles.add_style('normal-bold', fontName='Helvetica-bold', fontSize=14)
    styles.add_style('grand', fontName='Helvetica', fontSize=18)
    styles.add_style('grand-bold', fontName='Helvetica-bold', fontSize=18)
    styles.add_style('petit', fontName='Helvetica', fontSize=12)
    styles.add_style('petit-bold', fontName='Helvetica-bold', fontSize=12)
    styles.add_style('titre', fontName='Helvetica-Bold', fontSize=15)
    styles.add_style('centered', alignment=TA_CENTER)
    styles.add_style('remarque', fontName='Helvetica-Oblique', fontSize=11)
    styles.add_style('gros-numero', fontName='Helvetica-Bold', fontSize=36)
    styles.add_style('right-aligned', alignment=TA_RIGHT)
    canvas = Canvas(output_file, pagesize=PAGESIZE)
    draw_coupon(canvas, styles, coupon.nom_participant, coupon.noms_invites,
                coupon.infos_depart_arrivee.depart_date,
                coupon.infos_depart_arrivee.depart_de,
                'depart', coupon.nb_personnes)
    draw_coupon(canvas, styles, coupon.nom_participant, coupon.noms_invites,
                coupon.infos_depart_arrivee.arrivee_date,
                coupon.infos_depart_arrivee.arrivee_a,
                'arrivee', coupon.nb_personnes)
    
    page_width, page_height = PAGESIZE
    frame_height = 10 * cm
    frame = Frame(COUPON_MARGIN_SIDE, calc_coupon_y('depart') - frame_height,
                  page_width - COUPON_MARGIN_SIDE * 2, frame_height)
    frame.addFromList([Paragraph(u"""<br/><br/><u>Veuillez noter que les transferts en 
    navette ne s'effectuent que dans les conditions suivantes:</u><br/><br/>     
        À votre arrivée, les transferts en navette organisés des aéroports de 
        Casablanca et de Marrakech sont uniquement à destination du lieu de 
        l’Assemblée générale, le Palais des Congrès de l'hôtel Mogador Agdal 2.
        <br/><b>Ces transferts ne sont disponibles que du 6 au 10 mai 2017.</b>
        <br/><br/>
        À votre départ, les transferts en navette oganisés à destination des 
        aéroports de Casablanca et de Marrakech se feront au même point qu'à 
        l'arrivée à l'hôtel Mogador Agdal 2.<br/>
        <b>Ces transferts ne sont disponibles que du 12 au 15 mai 2017.</b>
        <br/><br/>
        Aucun autre arrêt n'est prévu durant ces trajets.
        Si vous ne logez pas au Mogador Agdal 2, vous devez assurer, à vos 
        frais, votre déplacement entre votre hôtel et le lieu de l’Assemblée 
        générale.
        <br/><br/>
        <b>Adresse du Mogador Agdal 2:</b> Zone Touristique Agdal, Route d'Ourika, 
        Marrakech 40000, Maroc
        <br/><br/>
        <b>En cas de problème à l'arrivée, veuillez contacter:</b> <br/>Casablanca: 
        +212 6 89 91 77 19 &nbsp; &nbsp; &nbsp; Marrakech: +212 6 89 91 77 20
    """, styles['remarque'])], canvas)
    canvas.save()
Example #15
0
def createBlankPDF(filenameOrFH, opts):
    """
    """
    orientation = getattr(pagesizes, opts.orientation)
    canvas = Canvas(filenameOrFH, pagesize=orientation(opts.paperSize))
    canvas.showPage()
    canvas.save()
    return (filenameOrFH, canvas)
def test1():
    c  = Canvas('figures.pdf')
    f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1)
    v = PlatPropFigure1()
    v.captionTextColor = toColor('blue')
    v.captionBackColor = toColor('lightyellow')
    f.addFromList([v],c)
    c.save()
Example #17
0
def get_image_page(image):
    inch = 72
    bio = BytesIO()
    c = Canvas(bio, pagesize=(8.5*inch, 11*inch))
    dim = c.drawImage(image, 0.5*inch, 6.3*inch, 495, 290)
    # print(dim)
    c.save()
    return PdfFileReader(bio).getPage(0)
Example #18
0
def run():
    styles = getSampleStyleSheet()
    styleN = styles['Normal']
    styleH = styles['Heading1']
    story = []

    #for codeNames in code
    story.append(Paragraph('I2of5', styleN))
    story.append(I2of5(1234, barWidth = inch*0.02, checksum=0))
    story.append(Paragraph('MSI', styleN))
    story.append(MSI(1234))
    story.append(Paragraph('Codabar', styleN))
    story.append(Codabar("A012345B", barWidth = inch*0.02))
    story.append(Paragraph('Code 11', styleN))
    story.append(Code11("01234545634563"))
    story.append(Paragraph('Code 39', styleN))
    story.append(Standard39("A012345B%R"))
    story.append(Paragraph('Extended Code 39', styleN))
    story.append(Extended39("A012345B}"))
    story.append(Paragraph('Code93', styleN))
    story.append(Standard93("CODE 93"))
    story.append(Paragraph('Extended Code93', styleN))
    story.append(Extended93("L@@K! Code 93 :-)")) #, barWidth=0.005 * inch))
    story.append(Paragraph('Code 128', styleN))
    c=Code128("AB-12345678") #, barWidth=0.005 * inch)
    #print 'WIDTH =', (c.width / inch), 'barWidth =', (c.barWidth / inch)
    #print 'LQ =', (c.lquiet / inch), 'RQ =', (c.rquiet / inch)
    story.append(c)
    story.append(Paragraph('USPS FIM', styleN))
    story.append(FIM("A"))
    story.append(Paragraph('USPS POSTNET', styleN))
    story.append(POSTNET('78247-1043'))
    story.append(Paragraph('USPS 4 State', styleN))
    story.append(USPS_4State('01234567094987654321','01234567891'))

    from reportlab.graphics.barcode import createBarcodeDrawing
    story.append(Paragraph('EAN13', styleN))
    bcd = createBarcodeDrawing('EAN13', value='123456789012')
    story.append(bcd)
    story.append(Paragraph('EAN8', styleN))
    bcd = createBarcodeDrawing('EAN8', value='1234567')
    story.append(bcd)
    story.append(Paragraph('UPCA', styleN))
    bcd = createBarcodeDrawing('UPCA', value='03600029145')
    story.append(bcd)
    story.append(Paragraph('USPS_4State', styleN))
    bcd = createBarcodeDrawing('USPS_4State', value='01234567094987654321',routing='01234567891')
    story.append(bcd)

    story.append(Paragraph('Label Size', styleN))
    story.append(XBox((2.0 + 5.0/8.0)*inch, 1 * inch, '1x2-5/8"'))
    story.append(Paragraph('Label Size', styleN))
    story.append(XBox((1.75)*inch, .5 * inch, '1/2x1-3/4"'))
    c = Canvas('out.pdf')
    f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1)
    f.addFromList(story, c)
    c.save()
    print('saved out.pdf')
 def __init__(self, filename,
              pagesize=None,
              bottomup = 1,
              pageCompression=1,
              invariant = None,
              verbosity=0):
     Canvas.__init__(self, filename, pagesize=pagesize, bottomup=bottomup, pageCompression=pageCompression,
                     invariant=invariant, verbosity=verbosity)
     self.setPageSize(TAILLE_PAGE)
Example #20
0
    def _on_other_page(self, canvas: Canvas, doc):
        canvas.saveState()
        canvas.setFont('OpenSans', 8)
        canvas.drawRightString(self.pagesize[0] - 20 * mm, 10 * mm, pgettext("invoice", "Page %d") % (doc.page,))

        for i, line in enumerate(self.invoice.footer_text.split('\n')[::-1]):
            canvas.drawCentredString(self.pagesize[0] / 2, 25 + (3.5 * i) * mm, line.strip())

        canvas.restoreState()
Example #21
0
def create_new_pdf(playground, width, height):
  import reportlab.rl_config
  from reportlab.pdfgen.canvas import Canvas
  pdf = Canvas(os.path.join(playground, "book.pdf"),
               pagesize=(width, height), pageCompression=1)
  pdf.setCreator('cheesegrater')
  pdf.setTitle(os.path.basename(playground))
  load_font()
  return pdf
Example #22
0
File: pdf.py Project: k4ml/jazzpos
 def save(self):
     """add page info to each page (page x of y)"""
     num_pages = len(self._saved_page_states)
     for state in self._saved_page_states:
         for count, _code in enumerate(state['_code']):
             state['_code'][count] = state['_code'][count].replace('{NB}', str(num_pages))
         self.__dict__.update(state)
         Canvas.showPage(self)
     Canvas.save(self)
Example #23
0
 def draw_page(self, canvas: Canvas, order: Order, op: OrderPosition):
     for o in self.layout:
         if o['type'] == "barcodearea":
             self._draw_barcodearea(canvas, op, o)
         elif o['type'] == "textarea":
             self._draw_textarea(canvas, op, order, o)
         elif o['type'] == "poweredby":
             self._draw_poweredby(canvas, op, o)
     canvas.showPage()
Example #24
0
 def test1(self):
     import os
     from reportlab.lib.testutils import testsFolder
     filename = outputfile('test_no_helvetica.pdf')
     c = Canvas(filename, invariant=1, pageCompression=0, initialFontName='Times-Roman')
     c.drawString(100,700, 'Hello World')
     c.save()
     with open(filename, 'rb') as f:
         raw = f.read()
     assert b'Helvetica' not in raw and b'Times-Roman' in raw, 'Canvas initialFontName expectations not satisfied!'
Example #25
0
 def save(self):
     """
     Add "Page X of Y" string to the footer of each page.
     """
     num_pages = len(self._saved_page_states)
     for state in self._saved_page_states:
         self.__dict__.update(state)
         self.draw_page_number(num_pages)
         Canvas.showPage(self)
     Canvas.save(self)
Example #26
0
def test():
    """Test this."""
    from reportlab.pdfgen.canvas import Canvas
    from reportlab.lib import pagesizes

    canvas = Canvas("labels.pdf", pagesize=pagesizes.A4)
    canvas.setFont("Helvetica", 30)
    (width, height) = pagesizes.A4
    canvas.drawCentredString(width / 2.0, height - 4 * cm, "Sample LTO labels")
    xpos = xorig = 2 * cm
    ypos = yorig = 2 * cm
    colwidth = 10 * cm
    lineheight = 3.9 * cm
    count = 1234
    BaseLTOLabel("RL", count, "3").drawOn(canvas, xpos, ypos)
    ypos += lineheight
    count += 1
    BaseLTOLabel("RL", count, "3", border=0.0125).drawOn(canvas, xpos, ypos)
    ypos += lineheight
    count += 1
    VerticalLTOLabel("RL", count, "3").drawOn(canvas, xpos, ypos)
    ypos += lineheight
    count += 1
    VerticalLTOLabel("RL", count, "3", border=0.0125).drawOn(canvas, xpos, ypos)
    ypos += lineheight
    count += 1
    VerticalLTOLabel("RL", count, "3", colored=True).drawOn(canvas, xpos, ypos)
    ypos += lineheight
    count += 1
    VerticalLTOLabel("RL", count, "3", border=0.0125, colored=True).drawOn(canvas, xpos, ypos)
    canvas.showPage()
    canvas.save()
Example #27
0
def web_report_to_PDF(projects, developers, date_from, date_to):
    projects_data = {}
    branches_data = {}
    developers_data = {}
    developers_branch_data = {}
    developers_project_data = {}
    headtext = "Red Hat GITVIEW team report"
    timetext =\
        date_from.strftime("%Y.%m.%d") + '_' + date_to.strftime("%Y.%m.%d")
    filename = '_'.join([timetext, 'gitview.pdf'])
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] =\
        'attachment; filename=%s' % filename
    can = Canvas(response)
    can.setFont("Helvetica-Bold", 17.5)
    can.drawString(2.2*inch, 9*inch, "GIT VIEW TEAM DATA REPORT")
    can.setFont("Helvetica", 10.5)
    can.drawString(3.2*inch, 8.5*inch, timetext)
    [projects_data, developers_data, branches_data,
     developers_project_data, developers_branch_data] = \
        team_report_data(projects, developers, date_from, date_to)
    pdf_report(projects_data, developers_data, branches_data,
               developers_project_data, developers_branch_data,
               can, headtext)
    return response
Example #28
0
def main(argv):
    global X, Y, Title
    if len(argv) != 2:
        print __doc__
        sys.exit(2)
    c = Canvas(argv[1], pagesize=pageSize, pageCompression=0)
    c.setFont(fontName, fontSize)

    init()
    X = 0
    Y = 0
    execfile(argv[0], globals())
    init()
    if Title:
        print "title", Title
        c.drawCentredString(pageSize[0] / 2, pageSize[1] - (margins.top * inch * 0.65), Title)
    X = startX
    Y = startY
    for chart in Charts:
        x = chart.fx
        y = chart.fy
        if not x and not y:
            x = X
            y = Y
        chart.draw(c, x, y)
        over()

    c.showPage()
    c.save()
Example #29
0
def render_card_pdf(card, filename):
    # set up styles
    regular = ParagraphStyle('default')
    regular.fontName = 'Helvetica'
    regular.fontSize = 9
    regular.leading = 11
    
    small = ParagraphStyle('default')
    small.fontName = 'Helvetica'
    small.fontSize = 7
    small.leading = 9
    
    large = ParagraphStyle('default')
    large.fontName = 'Helvetica'
    large.fontSize = 11
    large.leading = 13
    
    text = []
    
    # generate content
    address_template = Template(address_format)
    
    # return address
    text.extend([Paragraph(address_template.render(Context({
        'name': card.sender_name,
        'address1': card.sender_address1,
        'address2': card.sender_address2,
        'city': card.sender_city,
        'state': card.sender_state,
        'zip': card.sender_zip,
    })), small), Spacer(10, 10)])
    
    text.append(Paragraph(strip_tags(card.message).replace('\n', '<br />'), regular))
        
    text.extend([Spacer(10, 10), HR(0.5), Spacer(10, 10)])
    text.append(Paragraph('The Sunlight Foundation is a non-partisan non-profit that uses cutting-edge technology and ideas to make government transparent and accountable. Visit SunlightFoundation.com to learn more.', small))
    
    canv = Canvas(filename)
    canv.setPageSize((6.25 * inch, 4.5 * inch))
    
    f = Frame(0.375 * inch, 0.75 * inch, 3.125 * inch, 3.375 * inch, showBoundary=0)
    
    f.addFromList(text, canv)
    
    address = Frame(3.75 * inch, 1 * inch, 2 * inch, 1.5 * inch, showBoundary=0)
    address.addFromList([Paragraph(address_template.render(Context({
        'name': card.recipient_name,
        'address1': card.recipient_address1,
        'address2': card.recipient_address2,
        'city': card.recipient_city,
        'state': card.recipient_state,
        'zip': card.recipient_zip,
    })), large)], canv)
    
    canv.save()
    def testTray(self):
        "Makes a document with tray command - only works on printers supporting it"
        c = Canvas(outputfile('test_pdfbase_postscript_tray.pdf'))
        c.setPageCompression(0)

        c.setFont('Helvetica-Bold', 18)
        c.drawString(100, 700,
                     'Hello World. This is page 1 of a 2 page document.')
        c.drawString(100, 680,
                     'This also has a tray command ("5 setpapertray").')
        c.addPostScriptCommand('5 setpapertray')
        c.showPage()

        c.setFont('Helvetica-Bold', 16)
        c.drawString(100, 700,
                     'Page 2. This should come from a different tray.')
        c.drawString(
            100, 680,
            'Also, if you print it using a PS device and Acrobat 4/5,')
        c.drawString(100, 660,
                     'or export to Postscript, you should see the word')
        c.drawString(100, 640,
                     '"Hello PostScript" below.  In ordinary Acrobat Reader')
        c.drawString(100, 620, 'we expect to see nothing.')
        c.addPostScriptCommand(
            '/Helvetica findfont 48 scalefont setfont 100 400 moveto (Hello PostScript) show'
        )

        c.save()
Example #31
0
    Element((36, 16), ("Helvetica-Bold", 12), text=""),
])
rpt.groupheaders = [
    Band([
        Rule((36, 20), 7.5 * 72),
        Element((36, 4), ("Helvetica-Bold", 12),
                getvalue=lambda x: x["name"][0].upper(),
                format=lambda x: "Names beginning with %s" % x),
    ],
         getvalue=lambda x: x["name"][0].upper()),
]
rpt.groupfooters = [
    Band([
        Rule((330, 4), 72),
        Element((36, 4), ("Helvetica-Bold", 12),
                getvalue=lambda x: x["name"][0].upper(),
                format=lambda x: "Subtotal for %s" % x),
        SumElement(
            (400, 4), ("Helvetica-Bold", 12), key="amount", align="right"),
        Element((36, 16), ("Helvetica-Bold", 12), text=""),
    ],
         getvalue=lambda x: x["name"][0].upper(),
         newpageafter=1),
]

sys.stdout.write("Report Starting...\nPage ")
canvas = Canvas("sample07.pdf", (72 * 11, 72 * 8.5))
rpt.generate(canvas)
canvas.save()
print("\nDone.")
Example #32
0
    def to_pdf(self, outFileName, imageFileName, showBoundingboxes, fontname="Helvetica"):
        """
        Creates a PDF file with an image superimposed on top of the text.
        Text is positioned according to the bounding box of the lines in
        the hOCR file.
        The image need not be identical to the image used to create the hOCR file.
        It can have a lower resolution, different color mode, etc.
        """
        # create the PDF file
        pdf = Canvas(outFileName, pagesize=(self.width, self.height), pageCompression=1)  # page size in points (1/72 in.)

        # draw bounding box for each paragraph
        pdf.setStrokeColorRGB(0, 1, 1)  # light blue for bounding box of paragraph
        pdf.setFillColorRGB(0, 1, 1)  # light blue for bounding box of paragraph
        pdf.setLineWidth(0)  # no line for bounding box
        for elem in self.hocr.findall(".//%sp[@class='%s']" % (self.xmlns, "ocr_par")):

            elemtxt = self._get_element_text(elem).rstrip()
            if len(elemtxt) == 0:
                continue

            coords = self.element_coordinates(elem)
            x1 = self.px2pt(coords[0])
            y1 = self.px2pt(coords[1])
            x2 = self.px2pt(coords[2])
            y2 = self.px2pt(coords[3])

            # draw the bbox border
            if showBoundingboxes:
                pdf.rect(x1, self.height - y2, x2 - x1, y2 - y1, fill=1)

        # check if element with class 'ocrx_word' are available
        # otherwise use 'ocr_line' as fallback
        elemclass = "ocr_line"
        if self.hocr.find(".//%sspan[@class='ocrx_word']" % (self.xmlns)) is not None:
            elemclass = "ocrx_word"

        # itterate all text elements
        pdf.setStrokeColorRGB(1, 0, 0)  # light green for bounding box of word/line
        pdf.setLineWidth(0.5)  # bounding box line width
        pdf.setDash(6, 3)  # bounding box is dashed
        pdf.setFillColorRGB(0, 0, 0)  # text in black
        for elem in self.hocr.findall(".//%sspan[@class='%s']" % (self.xmlns, elemclass)):
            elemtxt = self._get_element_text(elem).rstrip()
            elemtxt = self.replace_unsupported_chars(elemtxt)
            if len(elemtxt) == 0:
                continue

            coords = self.element_coordinates(elem)
            x1 = self.px2pt(coords[0])
            y1 = self.px2pt(coords[1])
            x2 = self.px2pt(coords[2])
            y2 = self.px2pt(coords[3])

            # draw the bbox border
            if showBoundingboxes:
                pdf.rect(x1, self.height - y2, x2 - x1, y2 - y1, fill=0)

            text = pdf.beginText()
            fontsize = self.px2pt(coords[3] - coords[1])
            text.setFont(fontname, fontsize)

            # set cursor to bottom left corner of bbox (adjust for dpi)
            text.setTextOrigin(x1, self.height - y2)

            # scale the width of the text to fill the width of the bbox
            text.setHorizScale(100 * (x2 - x1) / pdf.stringWidth(elemtxt, fontname, fontsize))

            # write the text to the page
            text.textLine(elemtxt)
            pdf.drawText(text)

        # put the image on the page, scaled to fill the page
        if imageFileName is not None:
            im = Image.open(imageFileName)
            pdf.drawInlineImage(im, 0, 0, width=self.width, height=self.height)

        # finish up the page and save it
        pdf.showPage()
        pdf.save()
Example #33
0
    def test0(self):
        "A basic document drawing some strings"
        c = Canvas(outputfile('test_multibyte_jpn.pdf'))
        c.setFont('Helvetica', 30)
        c.drawString(100, 700, 'Japanese Font Support')

        c.setStrokeColor(colors.red)

        #unicode font automatically supplies the encoding
        pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))

        msg = u'\u6771\u4EAC : Unicode font, unicode input'
        self.hDraw(c, msg, 'HeiseiMin-W3', 100, 600)

        msg = u'\u6771\u4EAC : Unicode font, utf8 input'.encode('utf8')
        self.hDraw(c, msg, 'HeiseiMin-W3', 100, 575)

        # now try verticals - this is broken, not sure how to make it
        # work in post Unicode world.
        pdfmetrics.registerFont(CIDFont('HeiseiMin-W3', '90ms-RKSJ-V'))
        c.setFont('HeiseiMin-W3-90ms-RKSJ-V', 16)
        c.drawString(450, 650, '\223\214\213\236 vertical Shift-JIS')
        height = c.stringWidth('\223\214\213\236 vertical Shift-JIS',
                               'HeiseiMin-W3-90ms-RKSJ-V', 16)
        c.rect(450 - 8, 650, 16, -height)

        pdfmetrics.registerFont(CIDFont('HeiseiMin-W3', 'EUC-V'))
        c.setFont('HeiseiMin-W3-EUC-V', 16)
        c.drawString(475, 650, '\xC5\xEC\xB5\xFE vertical EUC')
        height = c.stringWidth('\xC5\xEC\xB5\xFE vertical EUC',
                               'HeiseiMin-W3-EUC-V', 16)
        c.rect(475 - 8, 650, 16, -height)

        from reportlab.platypus.paragraph import Paragraph
        from reportlab.lib.styles import ParagraphStyle
        jStyle = ParagraphStyle('jtext',
                                fontName='HeiseiMin-W3',
                                fontSize=12,
                                wordWrap="CJK")

        gatwickText = '\xe3\x82\xac\xe3\x83\x88\xe3\x82\xa6\xe3\x82\xa3\xe3\x83\x83\xe3\x82\xaf\xe7\xa9\xba\xe6\xb8\xaf\xe3\x81\xa8\xe9\x80\xa3\xe7\xb5\xa1\xe9\x80\x9a\xe8\xb7\xaf\xe3\x81\xa7\xe7\x9b\xb4\xe7\xb5\x90\xe3\x81\x95\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x84\xe3\x82\x8b\xe5\x94\xaf\xe4\xb8\x80\xe3\x81\xae\xe3\x83\x9b\xe3\x83\x86\xe3\x83\xab\xe3\x81\xa7\xe3\x81\x82\xe3\x82\x8b\xe5\xbd\x93\xe3\x83\x9b\xe3\x83\x86\xe3\x83\xab\xe3\x81\xaf\xe3\x80\x81\xe8\xa1\x97\xe3\x81\xae\xe4\xb8\xad\xe5\xbf\x83\xe9\x83\xa8\xe3\x81\x8b\xe3\x82\x8930\xe5\x88\x86\xe3\x81\xae\xe5\xa0\xb4\xe6\x89\x80\xe3\x81\xab\xe3\x81\x94\xe3\x81\x96\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82\xe5\x85\xa8\xe5\xae\xa2\xe5\xae\xa4\xe3\x81\xab\xe9\xab\x98\xe9\x80\x9f\xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\x8d\xe3\x83\x83\xe3\x83\x88\xe7\x92\xb0\xe5\xa2\x83\xe3\x82\x92\xe5\xae\x8c\xe5\x82\x99\xe3\x81\x97\xe3\x81\xa6\xe3\x81\x8a\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x9f\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xab\xe3\x83\xbc\xe3\x83\xa0\xe3\x81\xaf5\xe5\x90\x8d\xe6\xa7\x98\xe3\x81\xbe\xe3\x81\xa7\xe3\x81\x8a\xe6\xb3\x8a\xe3\x82\x8a\xe3\x81\x84\xe3\x81\x9f\xe3\x81\xa0\xe3\x81\x91\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82\xe3\x81\xbe\xe3\x81\x9f\xe3\x80\x81\xe3\x82\xa8\xe3\x82\xb0\xe3\x82\xbc\xe3\x82\xaf\xe3\x83\x86\xe3\x82\xa3\xe3\x83\x96\xe3\x83\xab\xe3\x83\xbc\xe3\x83\xa0\xe3\x81\xae\xe3\x81\x8a\xe5\xae\xa2\xe6\xa7\x98\xe3\x81\xaf\xe3\x80\x81\xe3\x82\xa8\xe3\x82\xb0\xe3\x82\xbc\xe3\x82\xaf\xe3\x83\x86\xe3\x82\xa3\xe3\x83\x96\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\xb3\xe3\x82\xb8\xe3\x82\x92\xe3\x81\x94\xe5\x88\xa9\xe7\x94\xa8\xe3\x81\x84\xe3\x81\x9f\xe3\x81\xa0\xe3\x81\x91\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82\xe4\xba\x8b\xe5\x89\x8d\xe3\x81\xab\xe3\x81\x94\xe4\xba\x88\xe7\xb4\x84\xe3\x81\x84\xe3\x81\x9f\xe3\x81\xa0\xe3\x81\x91\xe3\x82\x8b\xe3\x82\xbf\xe3\x82\xa4\xe3\x83\xa0\xe3\x83\x88\xe3\x82\xa5\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4\xe3\x83\xbb\xe3\x83\x91\xe3\x83\x83\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb8\xe3\x81\xab\xe3\x81\xaf\xe3\x80\x81\xe7\xa9\xba\xe6\xb8\xaf\xe3\x81\xae\xe9\xa7\x90\xe8\xbb\x8a\xe6\x96\x99\xe9\x87\x91\xe3\x81\x8c\xe5\x90\xab\xe3\x81\xbe\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x8a\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82'
        gatwickText2 = '\xe3\x82\xac\xe3\x83\x88\xe3\x82\xa6\xe3\x82\xa3\xe3\x83\x83\xe3\x82\xaf<font color=red>\xe7\xa9\xba\xe6\xb8\xaf\xe3\x81\xa8\xe9\x80\xa3\xe7\xb5\xa1\xe9\x80\x9a\xe8\xb7\xaf\xe3\x81\xa7\xe7\x9b\xb4\xe7\xb5\x90</font>\xe3\x81\x95\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x84\xe3\x82\x8b\xe5\x94\xaf\xe4\xb8\x80\xe3\x81\xae\xe3\x83\x9b\xe3\x83\x86\xe3\x83\xab\xe3\x81\xa7\xe3\x81\x82\xe3\x82\x8b\xe5\xbd\x93\xe3\x83\x9b\xe3\x83\x86\xe3\x83\xab\xe3\x81\xaf\xe3\x80\x81\xe8\xa1\x97\xe3\x81\xae\xe4\xb8\xad\xe5\xbf\x83\xe9\x83\xa8\xe3\x81\x8b\xe3\x82\x8930\xe5\x88\x86\xe3\x81\xae\xe5\xa0\xb4\xe6\x89\x80\xe3\x81\xab\xe3\x81\x94\xe3\x81\x96\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82\xe5\x85\xa8\xe5\xae\xa2\xe5\xae\xa4\xe3\x81\xab\xe9\xab\x98\xe9\x80\x9f\xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\x8d\xe3\x83\x83\xe3\x83\x88<link fg="blue" href="http://www.reportlab.com">\xe7\x92\xb0\xe5\xa2\x83\xe3\x82\x92\xe5\xae\x8c\xe5\x82\x99</link>\xe3\x81\x97\xe3\x81\xa6<u>\xe3\x81\x8a\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x99</u>\xe3\x80\x82\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x9f\xe3\x83\xaa\xe3\x83\xbc\xe3\x83\xab\xe3\x83\xbc\xe3\x83\xa0\xe3\x81\xaf5\xe5\x90\x8d\xe6\xa7\x98\xe3\x81\xbe\xe3\x81\xa7\xe3\x81\x8a\xe6\xb3\x8a\xe3\x82\x8a\xe3\x81\x84\xe3\x81\x9f\xe3\x81\xa0\xe3\x81\x91\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82\xe3\x81\xbe\xe3\x81\x9f\xe3\x80\x81\xe3\x82\xa8\xe3\x82\xb0\xe3\x82\xbc\xe3\x82\xaf\xe3\x83\x86\xe3\x82\xa3\xe3\x83\x96\xe3\x83\xab\xe3\x83\xbc\xe3\x83\xa0\xe3\x81\xae\xe3\x81\x8a\xe5\xae\xa2\xe6\xa7\x98\xe3\x81\xaf\xe3\x80\x81\xe3\x82\xa8\xe3\x82\xb0\xe3\x82\xbc\xe3\x82\xaf\xe3\x83\x86\xe3\x82\xa3\xe3\x83\x96\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\xb3\xe3\x82\xb8\xe3\x82\x92\xe3\x81\x94\xe5\x88\xa9\xe7\x94\xa8\xe3\x81\x84\xe3\x81\x9f\xe3\x81\xa0\xe3\x81\x91\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82\xe4\xba\x8b\xe5\x89\x8d\xe3\x81\xab\xe3\x81\x94\xe4\xba\x88\xe7\xb4\x84\xe3\x81\x84\xe3\x81\x9f\xe3\x81\xa0\xe3\x81\x91\xe3\x82\x8b\xe3\x82\xbf\xe3\x82\xa4\xe3\x83\xa0\xe3\x83\x88\xe3\x82\xa5\xe3\x83\x95\xe3\x83\xa9\xe3\x82\xa4\xe3\x83\xbb\xe3\x83\x91\xe3\x83\x83\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb8\xe3\x81\xab\xe3\x81\xaf\xe3\x80\x81\xe7\xa9\xba\xe6\xb8\xaf\xe3\x81\xae\xe9\xa7\x90\xe8\xbb\x8a\xe6\x96\x99\xe9\x87\x91\xe3\x81\x8c\xe5\x90\xab\xe3\x81\xbe\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x8a\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82'

        c.setFont('HeiseiMin-W3', 12)
        jPara = Paragraph(gatwickText, jStyle)
        jPara.wrap(300, 200)
        jPara.drawOn(c, 100, 220)

        jPara = Paragraph(gatwickText2, jStyle)
        jPara.wrap(300, 200)
        jPara.drawOn(c, 100, 320)

        c.setFillColor(colors.purple)
        tx = c.beginText(100, 200)
        tx.setFont('Helvetica', 12)
        tx.textLines("""This document shows sample output in Japanese
        from the Reportlab PDF library.  This page shows the two fonts
        available and tests our ability to measure the width of glyphs
        in both horizontal and vertical writing, with proportional and
        fixed-width characters. The red boxes should be the same width
        (or height) as the character strings they surround.
        The next pages show more samples and information.
        """)
        c.drawText(tx)
        c.setFont('Helvetica', 10)
        c.drawCentredString(297, 36, 'Page %d' % c.getPageNumber())

        c.showPage()

        c.setFont('Helvetica', 30)
        c.drawString(100, 700, 'Japanese TrueType Font Support')
        msg = u'\u6771\u4EAC : Unicode font'.encode('utf8')
        msg2 = u'utf8 input 0123456789 ABCDEF'.encode('utf8')
        from reportlab.pdfbase.ttfonts import TTFont
        try:
            msmincho = TTFont('MS Mincho',
                              'msmincho.ttc',
                              subfontIndex=0,
                              asciiReadable=0)
            fn = ' file=msmincho.ttc subfont 0'
        except:
            try:
                msmincho = TTFont('MS Mincho', 'msmincho.ttf', asciiReadable=0)
                fn = 'file=msmincho.ttf'
            except:
                #Ubuntu - works on Lucid Lynx if xpdf-japanese installed
                try:
                    msmincho = TTFont('MS Mincho', 'ttf-japanese-mincho.ttf')
                    fn = 'file=msmincho.ttf'
                except:
                    msmincho = None
        if msmincho is None:
            c.setFont('Helvetica', 12)
            c.drawString(100, 600, 'Cannot find msmincho.ttf or msmincho.ttc')
        else:
            pdfmetrics.registerFont(msmincho)
            c.setFont('MS Mincho', 30)
            c.drawString(100, 600, msg)
            c.drawString(100, 570, msg2)
            c.drawString(100, 540, fn)
            if fn.endswith('0'):
                try:
                    msmincho1 = TTFont('MS Mincho 1',
                                       'msmincho.ttc',
                                       subfontIndex=1,
                                       asciiPreload=0)
                    pdfmetrics.registerFont(msmincho1)
                    fn = ' file=msmincho.ttc subfont 1'
                    c.setFont('MS Mincho 1', 30)
                    c.drawString(100, 500, msg + fn)
                except:
                    c.setFont('Helvetica', 30)
                    c.drawString(100, 500, msg)
                c.drawString(100, 470, msg2)
                c.drawString(100, 440, fn)
            #test a paragraph with CJK and <br/> tags
            u = u'''<font color=red>\u30ac\u30c8\u30a6\u30a3\u30c3</font><br/><font color=blue>\u30af\u7a7a\u6e2f\u3068\u9023\u7d61\u901a</font><br/>\u8def\u3067\u76f4\u7d50\u3055\u308c\u3066\u3044\u308b\u552f<br/>\u4e00\u306e\u30db\u30c6\u30eb\u3067\u3042\u308b\u5f53\u30db\u30c6\u30eb\u306f\u3001\u8857\u306e\u4e2d\u5fc3\u90e8\u304b\u308930\u5206\u306e\u5834\u6240\u306b\u3054\u3056\u3044\u307e\u3059\u3002\u5168\u5ba2\u5ba4\u306b\u9ad8\u901f\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8<br/>\u74b0\u5883\u3092\u5b8c\u5099\u3057\u3066\u304a\u308a\u307e\u3059\u3002\u30d5\u30a1\u30df\u30ea\u30fc\u30eb\u30fc\u30e0\u306f5\u540d\u69d8\u307e\u3067\u304a\u6cca\u308a\u3044\u305f\u3060\u3051\u307e\u3059\u3002\u307e\u305f\u3001\u30a8\u30b0\u30bc\u30af\u30c6\u30a3\u30d6\u30eb\u30fc\u30e0\u306e\u304a\u5ba2\u69d8\u306f\u3001\u30a8\u30b0\u30bc\u30af\u30c6\u30a3\u30d6\u30e9\u30a6\u30f3\u30b8\u3092\u3054\u5229\u7528\u3044\u305f\u3060\u3051\u307e\u3059\u3002\u4e8b\u524d\u306b\u3054\u4e88\u7d04\u3044\u305f\u3060\u3051\u308b\u30bf\u30a4\u30e0\u30c8\u30a5\u30d5\u30e9\u30a4\u30fb\u30d1\u30c3\u30b1\u30fc\u30b8\u306b\u306f\u3001\u7a7a\u6e2f\u306e\u99d0\u8eca\u6599\u91d1\u304c\u542b\u307e\u308c\u3066\u304a\u308a\u307e\u3059\u3002'''
            jPara = Paragraph(u, jStyle)
            jPara.wrap(300, 500)
            jPara.drawOn(c, 100, 300)

        c.showPage()

        # realistic text sample
        ##        sample = """Adobe Acrobat
        ##\x83h\x83L\x83\x85\x83\x81\x83\x93\x83g\x82\xaa\x8aJ\x82\xa9\x82\xc8\x82\xad\x82\xc4\x8d\xa2\x82\xc1\x82\xbd\x82\xb1\x82\xc6\x82\xcd
        ##\x82\xa0\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x82\xa9\x81B\x8e\x96\x8b\xc6\x8cv\x89\xe6\x8f\x91\x81A\x89c\x8b\xc6\x83\x8c\x83|\x81[\x83g
        ##\x81A\x83J\x83^\x83\x8d\x83O\x82\xe2\x83p\x83\x93\x83t\x83\x8c\x83b\x83g\x82\xc8\x82\xc7\x90\xa7\x8d\xec\x95\xa8\x82\xcc\x8e\xed
        ##\x97\xde\x82\xc9\x82\xa9\x82\xa9\x82\xed\x82\xe7\x82\xb8\x81A
        ##\x83h\x83L\x83\x85\x83\x81\x83\x93\x83g\x82\xcdAdobe&reg; Acrobat&reg; 5.0\x82\xf0\x8eg\x82\xc1\x82\xc4Adobe PDF\x81iPortable Document
        ##Format\x81j\x83t\x83@\x83C\x83\x8b\x82\xc9\x95\xcf\x8a\xb7\x82\xb5\x82\xdc\x82\xb5\x82\xe5\x82\xa4\x81B\x96\xb3\x8f\x9e\x94z\x95z\x82\xcc
        ##Adobe Acrobat Reader\x82\xf0\x8eg\x82\xa6\x82\xce\x81A\x83n\x81[\x83h\x83E\x83F\x83A\x81A\x83\\\x83t\x83g\x83E\x83F\x83A\x82\xc9\x82\xa9
        ##\x82\xa9\x82\xed\x82\xe7\x82\xb8\x81A\x92N\x82\xc5\x82\xe0\x82\xa0\x82\xc8\x82\xbd\x82\xcc\x83h\x83L\x83\x85\x83\x81\x83\x93\x83g\x82\xf0
        ##\x83I\x83\x8a\x83W\x83i\x83\x8b\x82\xcc\x91\xcc\x8d\xd9\x82\xc5\x8aJ\x82\xad\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xdc\x82\xb7\x81B
        ##\x82\xa0\x82\xc8\x82\xbd\x82\xcc\x88\xd3\x90}\x82\xb5\x82\xbd\x82\xc6\x82\xa8\x82\xe8\x82\xc9\x8f\xee\x95\xf1\x82\xf0\x93`\x82\xa6\x82\xe9
        ##\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xdc\x82\xb7\x81B
        ##\x82\xb3\x82\xe7\x82\xc9\x81AAdobe Acrobat 5.0\x82\xc5\x82\xcd\x81AWeb\x83u\x83\x89\x83E\x83U\x82\xa9\x82\xe7\x83R\x83\x81\x83\x93\x83g\x82\xe2
        ##\x83}\x81[\x83N\x83A\x83b\x83v\x82\xf0\x8f\x91\x82\xab\x8d\x9e\x82\xf1\x82\xbe\x82\xe8\x81A\x93d\x8eq\x8f\x90\x96\xbc\x82\xf0\x8f\x91\x82\xab
        ##\x8d\x9e\x82\xdd\x81A\x8c\xb4\x96{\x82\xc6\x82\xb5\x82\xc4\x83\x8d\x81[\x83J\x83\x8b\x82\xc9\x95\xdb\x91\xb6\x82\xb7\x82\xe9\x82\xb1\x82\xc6\x82\xe0\x89\xc2\x94\\\x82\xc5\x82\xb7\x81B
        ##\x8a\xe9\x8b\xc6\x93\xe0\x82\xa0\x82\xe9\x82\xa2\x82\xcd\x8a\xe9\x8b\xc6\x82\xcc\x98g\x82\xf0\x92\xb4\x82\xa6\x82\xc4\x83`\x81[\x83\x80\x82\xc5
        ##\x82\xcc\x83h\x83L\x83\x85\x83\x81\x83\x93\x83g\x83\x8f\x81[\x83N\x82\xcc\x90\xb6\x8eY\x90\xab\x82\xf0\x8c\xfc\x8f\xe3\x82\xb3\x82\xb9\x82\xe9\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xdc\x82\xb7\x81B
        ##
        ##Adobe Acrobat 5.0\x82\xc5\x8d\xec\x90\xac\x82\xb5\x82\xbdAdobe PDF\x82\xcd\x81A(Acrobat 5.0\x82\xc5\x82\xcc\x82\xdd\x83T\x83|\x81[\x83g
        ##\x82\xb5\x82\xc4\x82\xa2\x82\xe9\x88\xc3\x8d\x86\x89\xbb\x90\xdd\x92\xe8\x82\xf0\x8f\x9c\x82\xa2\x82\xc4\x82\xcd)\x8f]\x97\x88\x82\xdc
        ##\x82\xc5\x82\xcc\x83o\x81[\x83W\x83\x87\x83\x93(3\x82\xa8\x82\xe6\x82\xd1\x82S)\x82\xccAcrobat Reader\x82\xc5\x82\xe0\x8aJ\x82\xad
        ##\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xdc\x82\xb7\x81B\x8f\xee\x95\xf1\x8b\xa4\x97L\x82\xcc\x83c\x81[\x83\x8b\x82\xc6\x82\xb5
        ##\x82\xc4\x81A\x82\xb3\x82\xe7\x82\xc9\x90i\x95\xe0\x82\xb5\x82\xbdAdobe Acrobat 5.0\x82\xf0\x81A\x8f]\x97\x88\x82\xcc\x8a\xc2\x8b\xab
        ##\x82\xc5\x82\xe0\x88\xc0\x90S\x82\xb5\x82\xc4\x82\xb2\x97\x98\x97p\x82\xa2\x82\xbd\x82\xbe\x82\xaf\x82\xdc\x82\xb7\x81B
        ##
        ##\x96{\x90\xbb\x95i\x82\xf0\x83l\x83b\x83g\x83\x8f\x81[\x83N\x82\xc8\x82\xc7\x82\xf0\x89\xee\x82\xb5\x82\xc4\x92\xbc\x90\xda\x82\xa0\x82\xe9
        ##\x82\xa2\x82\xcd\x8a\xd4\x90\xda\x82\xc9\x95\xa1\x90\x94\x82\xcc\x92[\x96\x96\x82\xa9\x82\xe7\x8eg\x97p\x82\xb7\x82\xe9\x8f\xea\x8d\x87\x81A
        ##\x82\xbb\x82\xcc\x92[\x96\x96\x82\xc6\x93\xaf\x90\x94\x82\xcc\x83\x89\x83C\x83Z\x83\x93\x83X\x82\xf0\x82\xb2\x8dw\x93\xfc\x82\xad\x82\xbe
        ##\x82\xb3\x82\xa2\x81B\x96{\x90\xbb\x95i\x82\xcd\x83N\x83\x89\x83C\x83A\x83\x93\x83g\x97p\x83\\\x83t\x83g\x83E\x83F\x83A\x82\xc5\x82\xa0\x82\xe8
        ##\x81A\x83T\x81[\x83o\x97p\x83\\\x83t\x83g\x83E\x83F\x83A\x82\xc6\x82\xb5\x82\xc4\x82\xa8\x8eg\x82\xa2\x82\xa2\x82\xbd\x82\xbe\x82\xad\x82\xb1\x82\xc6
        ##\x82\xcd\x81A\x8f\xe3\x8bL\x95\xfb\x96@\x82\xc9\x82\xe6\x82\xe9\x88\xc8\x8aO\x81A\x8b\x96\x91\xf8\x82\xb3\x82\xea\x82\xc4\x82\xa2\x82\xdc\x82\xb9
        ##\x82\xf1\x81B\x95\xa1\x90\x94\x82\xcc\x83\x89\x83C\x83Z\x83\x93\x83X\x82\xf0\x82\xb2\x8dw\x93\xfc\x82\xb3\x82\xea\x82\xe9\x8f\xea\x8d\x87\x82\xc9
        ##\x82\xcd\x83\x89\x83C\x83Z\x83\x93\x83X\x83v\x83\x8d\x83O\x83\x89\x83\x80\x82\xf0\x82\xb2\x97\x98\x97p\x82\xc9\x82\xc8\x82\xe9\x82\xc6\x82\xa8\x93\xbe\x82\xc5\x82\xb7\x81B
        ##
        ##
        ##\x81y\x82\xa8\x92m\x82\xe7\x82\xb9\x81zMicrosoft Office XP\x82\xa9\x82\xe7PDF\x82\xf0\x8d\xec\x90\xac\x82\xb7\x82\xe9\x82\xc9\x82\xcd
        ##"""
        ##        c.setFont('Helvetica', 24)
        ##        c.drawString(100,750, "Sample text from Adobe's web site")
        ##        tx = c.beginText(100,700)
        ##        tx.setFont('Helvetica', 10)
        ##        tx.textLine('Note: line wrapping has not been preserved and some lines may be wrapped in mid-word.')
        ##        tx.textLine('We are just testing that we see Japanese and not random characters!')
        ##        tx.setFont('HeiseiMin-W3-90ms-RKSJ-H',6)
        ##        tx.textLines(sample)
        ##        tx.setFont('Helvetica', 8)
        ##        tx.textLine()
        ##        tx.textLine()
        ##        tx.textLines("""
        ##            This test document shows Japanese output from the Reportlab PDF Library.
        ##            You may use two fonts, HeiseiMin-W3 and HeiseiKakuGo-W5, and a number of
        ##            different encodings.
        ##
        ##            The available encoding names (with comments from the PDF specification) are:
        ##            encodings_jpn = [
        ##                # official encoding names, comments taken verbatim from PDF Spec
        ##                '83pv-RKSJ-H',      #Macintosh, JIS X 0208 character set with KanjiTalk6
        ##                                    #extensions, Shift-JIS encoding, Script Manager code 1
        ##                '90ms-RKSJ-H',      #Microsoft Code Page 932 (lfCharSet 0x80), JIS X 0208
        ##                                    #character set with NEC and IBM extensions
        ##                '90ms-RKSJ-V',      #Vertical version of 90ms-RKSJ-H
        ##                '90msp-RKSJ-H',     #Same as 90ms-RKSJ-H, but replaces half-width Latin
        ##                                    #characters with proportional forms
        ##                '90msp-RKSJ-V',     #Vertical version of 90msp-RKSJ-H
        ##                '90pv-RKSJ-H',      #Macintosh, JIS X 0208 character set with KanjiTalk7
        ##                                    #extensions, Shift-JIS encoding, Script Manager code 1
        ##                'Add-RKSJ-H',       #JIS X 0208 character set with Fujitsu FMR extensions,
        ##                                    #Shift-JIS encoding
        ##                'Add-RKSJ-V',       #Vertical version of Add-RKSJ-H
        ##                'EUC-H',            #JIS X 0208 character set, EUC-JP encoding
        ##                'EUC-V',            #Vertical version of EUC-H
        ##                'Ext-RKSJ-H',       #JIS C 6226 (JIS78) character set with NEC extensions,
        ##                                    #Shift-JIS encoding
        ##                'Ext-RKSJ-V',       #Vertical version of Ext-RKSJ-H
        ##                'H',                #JIS X 0208 character set, ISO-2022-JP encoding,
        ##                'V',                #Vertical version of H
        ##                'UniJIS-UCS2-H',    #Unicode (UCS-2) encoding for the Adobe-Japan1 character
        ##                                    #collection
        ##                'UniJIS-UCS2-V',    #Vertical version of UniJIS-UCS2-H
        ##                'UniJIS-UCS2-HW-H', #Same as UniJIS-UCS2-H, but replaces proportional Latin
        ##                                    #characters with half-width forms
        ##                'UniJIS-UCS2-HW-V'  #Vertical version of UniJIS-UCS2-HW-H
        ##                ]
        ##
        ##            The next few pages show the complete character set available in the encoding
        ##            "90ms-RKSJ-H" - Shift-JIS with the standard Microsoft extensions.
        ##            """)
        ##        c.drawText(tx)
        ##
        ##        c.setFont('Helvetica',10)
        ##        c.drawCentredString(297, 36, 'Page %d' % c.getPageNumber())
        ##
        ##
        ##
        ##        c.showPage()

        from reportlab.lib import textsplit

        c.setFont('HeiseiMin-W3', 14)
        y = 700
        c.drawString(70, y, 'cannot end line')
        y -= 20
        for group in textsplit.CANNOT_START_LINE:
            c.drawString(70, y, group)
            y -= 20
            c.setFont('Helvetica', 10)
            c.drawString(70, y, ' '.join(map(lambda x: repr(x)[4:-1], group)))
            c.setFont('HeiseiMin-W3', 14)
            y -= 20

        y -= 20
        c.drawString(70, y, 'cannot end line')
        y -= 20
        for group in textsplit.CANNOT_END_LINE:
            c.drawString(70, y, group)
            y -= 20
            c.setFont('Helvetica', 10)
            c.drawString(70, y, ' '.join(map(lambda x: repr(x)[2:], group)))
            c.setFont('HeiseiMin-W3', 14)
            y -= 20

        c.showPage()

        #utf8 encoded paragraph
        sample2_uni = u'''\u30ac\u30c8\u30a6\u30a3\u30c3\u30af\u7a7a\u6e2f\u3068\u9023\u7d61\u901a
        \u8def\u3067\u76f4\u7d50\u3055\u308c\u3066\u3044\u308b\u552f\u4e00\u306e\u30db\u30c6\u30eb
        \u3067\u3042\u308b\u5f53\u30db\u30c6\u30eb\u306f\u3001\u8857\u306e\u4e2d\u5fc3\u90e8\u304b
        \u308930\u5206\u306e\u5834\u6240\u306b\u3054\u3056\u3044\u307e\u3059\u3002\u5168\u5ba2\u5ba4
        \u306b\u9ad8\u901f\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u74b0\u5883\u3092\u5b8c\u5099
        \u3057\u3066\u304a\u308a\u307e\u3059\u3002\u30d5\u30a1\u30df\u30ea\u30fc\u30eb\u30fc\u30e0
        \u306f5\u540d\u69d8\u307e\u3067\u304a\u6cca\u308a\u3044\u305f\u3060\u3051\u307e\u3059\u3002
        \u307e\u305f\u3001\u30a8\u30b0\u30bc\u30af\u30c6\u30a3\u30d6\u30eb\u30fc\u30e0\u306e\u304a
        \u5ba2\u69d8\u306f\u3001\u30a8\u30b0\u30bc\u30af\u30c6\u30a3\u30d6\u30e9\u30a6\u30f3\u30b8
        \u3092\u3054\u5229\u7528\u3044\u305f\u3060\u3051\u307e\u3059\u3002\u4e8b\u524d\u306b\u3054
        \u4e88\u7d04\u3044\u305f\u3060\u3051\u308b\u30bf\u30a4\u30e0\u30c8\u30a5\u30d5\u30e9\u30a4
        \u30fb\u30d1\u30c3\u30b1\u30fc\u30b8\u306b\u306f\u3001\u7a7a\u6e2f\u306e\u99d0\u8eca\u6599
        \u91d1\u304c\u542b\u307e\u308c\u3066\u304a\u308a\u307e\u3059\u3002'''

        oneline_uni = u''.join(sample2_uni.split())
        sample2_utf8 = oneline_uni.encode('utf8')

        from reportlab.platypus import Paragraph
        from reportlab.lib.styles import ParagraphStyle
        jsty = ParagraphStyle('japanese',
                              fontName='HeiseiMin-W3',
                              wordWrap='CJK')
        jpara = Paragraph(oneline_uni, style=jsty)

        c.drawString(
            100, 710,
            'Try to wrap a paragraph using a style with wordWrap="CJK"')
        w, h = jpara.wrap(400, 400)
        jpara.drawOn(c, 100, 700 - h)

        #now try to split it...
        c.drawString(100, 510,
                     'Now try to split a paragraph as if over a page break')

        topPara, bottomPara = jpara.split(400, 30)
        w1, h1 = topPara.wrap(400, 30)
        topPara.drawOn(c, 100, 450)

        w2, h2 = bottomPara.wrap(400, 30)
        bottomPara.drawOn(c, 100, 400)
        #print 'split into heights %0.2f, %0.2f' % (topPara.height, bottomPara.height)

        ##        c.showPage()
        ##
        ##
        ##        # full kuten chart in EUC
        ##        c.setFont('Helvetica', 24)
        ##        c.drawString(72,750, 'Characters available in JIS 0208-1997')
        ##        y = 600
        ##        for row in range(1, 95):
        ##            KutenRowCodeChart(row, 'HeiseiMin-W3','EUC-H').drawOn(c, 72, y)
        ##            y = y - 125
        ##            if y < 50:
        ##                c.setFont('Helvetica',10)
        ##                c.drawCentredString(297, 36, 'Page %d' % c.getPageNumber())
        ##                c.showPage()
        ##                y = 700
        ##
        ##        c.showPage()

        #try with Unicode truetype - Mincho for starters
        ##        import time
        ##        started = time.clock()
        ##        c.showPage()
        ##        c.setFont('Helvetica',16)
        ##        c.drawString(100,750, 'About to say Tokyo in MS Gothic...')
        ##
        ##        from reportlab.pdfbase.ttfonts import TTFont, TTFontFile
        ##        f = TTFontFile("msgothic.ttf")
        ##        print f.name
        ##
        ##        pdfmetrics.registerFont(TTFont(f.name, f))
        ##
        ##        utfText = u'Andr\202'.encode('utf8')
        ##        c.setFont(f.name,16)
        ##        c.drawString(100,700, utfText)
        ##
        ##
        ##        #tokyoUCS2 = '\x67\x71\x4E\xAC'
        ##        finished = time.clock()

        c.save()

        if VERBOSE:
            print 'saved test_multibyte_jpn.pdf'
Example #34
0
class ReceiptDocument:
    """This class represents a pdf receipt.
    All units are in mm
    pdffilePath is the output pdf file
    receiptData  = [ Options, lesson_dates,tuition_id_prefix, lesson_num, number_of_lessons,
        student_name, tuition_address, post code, duration_of_lesson, tuition_fee ]
    """
    def __init__(self, pdffilePath, receiptData):
        self.pageHeight = A4[1] / mm  # in mm, all units in mm
        self.pageWidth = A4[0] / mm
        self.lMargin = 20.0
        self.rMargin = 20.0
        self.tMargin = 30.0
        self.bMargin = 30.0
        #print("page size of A4 in mm: ", self.pageWidth, self.pageHeight)

        self.canvas = Canvas(pdffilePath, pagesize=A4)
        self.canvas.setTitle("receipt for maths tuition")
        self.title = "receipt for maths tuition"
        self.textSize = 16  # in pixels
        self.headingSize = 22  # in pixels
        self.iSpace = 20  # in pixels
        self.rightColumn = self.pageWidth / 2.0

        self.fontPathBase = "./fonts/%s.ttf"
        #print("Font: ", self.fontPathBase % "DejaVuSerif")
        pdfmetrics.registerFont(
            TTFont('DejaVu', self.fontPathBase % "DejaVuSerif"))
        pdfmetrics.registerFont(
            TTFont('DejaVu-Bold', self.fontPathBase % "DejaVuSerif-Bold"))
        pdfmetrics.registerFont(
            TTFont('DejaVu-Italics', self.fontPathBase % "DejaVuSerif-Italic"))

        self.tutor = "Hannes Buchholzer"
        self.options = receiptData[0]
        self.tuition_dates = receiptData[1]
        self.tuition_id_prefix = receiptData[2]
        self.lesson_num = receiptData[3]
        self.n_lessons = receiptData[4]
        self.student_name = receiptData[5]
        # format address data, put postcode to address
        pre_address = receiptData[6]
        if pre_address.endswith("?"):
            pre_address = pre_address[:-1] + ","
            self.tuition_address = [pre_address, receiptData[7]]
        else:
            address = pre_address + ", " + receiptData[7]
            self.tuition_address = address.split("?")
        self.lesson_duration = receiptData[8]
        self.tuition_fee = receiptData[9]
        self.year = QDate.currentDate().toString("yyyy")

    # make a tuition_id out of a prefix (string)
    # and a number
    def make_tuition_id(self, num):
        tuition_id = self.tuition_id_prefix + "{0:03d}".format(
            int(num) + self.lesson_num)
        return tuition_id

    # make a date string
    def make_date(self, ind):
        if ind < len(self.tuition_dates):
            return self.tuition_dates[ind].toString("dd/MM/yyyy")
        else:
            word1 = "___ / ___ / "
            word2 = self.year if self.options["year"] else "______"
            return word1 + word2

    # return lesson duration dependent on option
    def make_duration(self):
        if self.options["minutes"]:
            word = "{0} minutes".format(int(self.lesson_duration))
        else:
            word = "_____  minutes"
        return word

    # return the payemnt amount, which is the tuition fee
    def make_payment(self):
        if self.options["payment"]:
            word = "£ {:4.2f}".format(float(self.tuition_fee))
        else:
            word = "£ _____"
        return word

    # translate coordinates x,y in mm from top left
    # into pixels from bottom right
    def coord(self, x, y, fromRight=False, fromBottom=False):
        cx = (self.pageWidth - x) * mm if fromRight else x * mm
        cy = y * mm if fromBottom else (self.pageHeight - y) * mm
        return (cx, cy)

    # draw it centered y mm from top
    def draw_heading(self, y):
        self.canvas.setFont('DejaVu', self.headingSize)
        (cx, cy) = self.coord(self.pageWidth / 2.0, y)
        self.canvas.drawCentredString(cx, cy, self.title)

    # draw it centered y mm from top
    def draw_section(self, y, ind):
        self.canvas.setFont('DejaVu', self.textSize)
        # left column
        (xl, yy) = self.coord(self.lMargin, y)
        (xr, yy) = self.coord(self.rightColumn, y)

        self.canvas.drawString(xl, yy, "unique tuition id:")
        self.canvas.drawString(xr, yy, self.make_tuition_id(ind))
        yy -= self.iSpace
        self.canvas.drawString(xl, yy, "name of tutor:")
        self.canvas.drawString(xr, yy, self.tutor)
        yy -= self.iSpace
        self.canvas.drawString(xl, yy, "name of student:")
        self.canvas.drawString(xr, yy, self.student_name)
        yy -= self.iSpace
        self.canvas.drawString(xl, yy, "address of tuition:")
        for line in self.tuition_address:
            self.canvas.drawString(xr, yy, line)
            yy -= self.iSpace
        self.canvas.drawString(xl, yy, "date of tuition:")
        self.canvas.drawString(xr, yy, self.make_date(ind))
        yy -= self.iSpace
        self.canvas.drawString(xl, yy, "duration of a lesson:")
        self.canvas.drawString(xr, yy, self.make_duration())
        yy -= self.iSpace
        self.canvas.drawString(xl, yy, "tuition fee amount:")
        self.canvas.drawString(xr, yy, self.make_payment())
        yy -= self.iSpace
        if self.options["transfer"]:
            self.canvas.drawString(xl, yy, "payment:")
            self.canvas.drawString(xr, yy, "by bank transfer")
        else:
            self.canvas.drawString(xl, yy, "payment amount received:")
            self.canvas.drawString(xr, yy, "£ ______")
        yy -= self.iSpace
        self.canvas.drawString(xl, yy, "signature of client:")
        self.canvas.drawString(xr, yy, "__" * 12)
        yy -= self.iSpace
        self.canvas.drawString(xl, yy, "signature of tutor:")
        self.canvas.drawString(xr, yy, "__" * 12)

    def compileReceipt(self):
        for i in range(int(self.n_lessons / 2)):
            self.draw_heading(30)
            self.draw_section(55, 2 * i)
            self.draw_heading(173.5)
            self.draw_section(198.5, 2 * i + 1)
            self.canvas.showPage()
        self.canvas.save()
Example #35
0
def genTestFile(path, numPages):
    "Generate a PDF doc with *very* big page numbers on all pages."
    
    size = landscape(A4)
    canv = Canvas(path, pagesize=size)
    for i in range(numPages):
        canv.setFont("Helvetica", size[1]*1.2)
        x, y = size[0]/2.0, size[1]*0.1
        text = "%s" % i
        if i % 2 == 1:
            canv.setStrokeColor(black)
            canv.setFillColor(black)
            canv.rect(0, 0, size[0], size[1], fill=True)
        if i % 2 == 1:
            canv.setFillColor(white)
        else:
            canv.setFillColor(black)
        canv.drawCentredString(x, y, text) 
        canv.showPage()
    canv.save() 
    def check40BitOptions(self):
        userPass = '******'
        for canPrint in (0, 1):
            for canModify in (0, 1):
                for canCopy in (0, 1):
                    for canAnnotate in (0, 1):
                        for strength in (40, 128):
                            # work out a 4-char string to be a mnemonic for the options
                            p = m = c = a = 'x'
                            if canPrint: p = 'P'
                            if canModify: m = 'M'
                            if canCopy: c = 'C'
                            if canAnnotate: a = 'A'

                            filename = 'test_crypto_%03dbit_%s_%s%s%s%s.pdf' % (
                                strength, userPass, p, m, c, a)
                            import os
                            filepath = outputfile(filename)
                            canv = Canvas(filepath)

                            canv.setFont('Helvetica', 24)
                            canv.drawString(100, 700,
                                            'PDF Encryption test case')
                            canv.setFont('Helvetica', 16)
                            canv.drawString(
                                100, 675,
                                'Verify by looking at File - Document Info - Security'
                            )

                            canv.drawString(100, 600,
                                            'open password = %s' % userPass)
                            canv.drawString(100, 575,
                                            'strength = %d buts' % strength)
                            canv.drawString(100, 500,
                                            'canPrint = %d' % canPrint)
                            canv.drawString(100, 475,
                                            'canModify = %d' % canModify)
                            canv.drawString(100, 450, 'canCopy = %d' % canCopy)
                            canv.drawString(100, 425,
                                            'canAnnotate = %d' % canAnnotate)

                            encryptCanvas(canv,
                                          userPass,
                                          canPrint=canPrint,
                                          canModify=canModify,
                                          canCopy=canCopy,
                                          canAnnotate=canAnnotate,
                                          strength=strength)

                            canv.save()
                            if VERBOSE: print('saved %s' % filepath)
Example #37
0
class PDFGenerator(object):

	canvas = None
	colorspace = None
	use_spot = True
	num_pages = 0
	page_count = 0
	prgs_msg = _('Saving in process...')

	def __init__(self, fileptr, cms, version=PDF_VERSION_DEFAULT):
		self.cms = cms
		self.canvas = Canvas(fileptr, pdfVersion=version[0])
		self.info = UC_PDFInfo(self.canvas._doc)
		self.info.pdfxversion = version[1]
		self.info.subject = '---'
		self.canvas.setPageCompression(1)

	#---PDF doc data
	def set_creator(self, name): self.info.creator = name
	def set_producer(self, name): self.info.producer = name
	def set_title(self, title): self.info.title = title
	def set_author(self, author): self.info.author = author
	def set_subject(self, subj): self.info.subject = subj
	def set_keywords(self, keywords): self.info.keywords = keywords

	#---Rendering options
	def set_compression(self, val=True):
		self.canvas.setPageCompression(int(val))

	def set_colorspace(self, cs=None):
		self.colorspace = cs

	def set_spot_usage(self, val=True):
		self.use_spot = val

	#---Page processing

	def set_num_pages(self, num=1):
		self.num_pages = num

	def set_progress_message(self, msg):
		self.prgs_msg = msg

	def start_page(self, w, h, left_margin=0.0, top_margin=0.0):
		self.canvas.translate(w / 2.0 - left_margin, h / 2.0 - top_margin)
		self.canvas.setPageSize((w, h))
		position = 0.0
		if self.num_pages:
			position = float(self.page_count) / float(self.num_pages)
		events.emit(events.FILTER_INFO, self.prgs_msg, position)

	def end_page(self):
		self.canvas.showPage()
		self.page_count += 1
		position = 1.0
		if self.num_pages:
			position = float(self.page_count) / float(self.num_pages)
		events.emit(events.FILTER_INFO, self.prgs_msg, position)


	def save(self):
		self.canvas.save()

	#--- Rendering
	def render(self, objs, toplevel=False):
		obj_count = 0
		for obj in objs:
			if obj.is_pixmap():
				self.draw_pixmap(obj)
			elif obj.is_primitive():
				curve_obj = obj.to_curve()
				if curve_obj.is_primitive():
					self.draw_curve(curve_obj)
				else:
					self.render(curve_obj.childs)
			elif obj.is_container():
				self.draw_container(obj)
			else:
				self.render(obj.childs)

			#---Progress
			obj_count += 1
			shift = 0.0
			page_size = 1.0
			if self.num_pages:
				shift = float(self.page_count) / float(self.num_pages)
				page_size = 1.0 / float(self.num_pages)
			position = shift + obj_count / len(objs) * page_size
			events.emit(events.FILTER_INFO, self.prgs_msg, position)

	def draw_curve(self, curve_obj):
		paths = libgeom.apply_trafo_to_paths(curve_obj.paths, curve_obj.trafo)
		pdfpath, closed = self.make_pdfpath(paths)
		fill_style = curve_obj.style[0]
		stroke_style = curve_obj.style[1]
		if stroke_style and stroke_style[7]:
			self.stroke_pdfpath(pdfpath, stroke_style, curve_obj.stroke_trafo)
		if fill_style and fill_style[0] & sk2_const.FILL_CLOSED_ONLY and closed:
			self.fill_pdfpath(curve_obj, pdfpath, fill_style, curve_obj.fill_trafo)
		elif fill_style and not fill_style[0] & sk2_const.FILL_CLOSED_ONLY:
			self.fill_pdfpath(curve_obj, pdfpath, fill_style, curve_obj.fill_trafo)
		if stroke_style and not stroke_style[7]:
			self.stroke_pdfpath(pdfpath, stroke_style, curve_obj.stroke_trafo)

	def draw_container(self, obj):
		container = obj.childs[0].to_curve()
		paths = libgeom.apply_trafo_to_paths(container.paths, container.trafo)
		pdfpath, closed = self.make_pdfpath(paths)
		fill_style = container.style[0]
		stroke_style = container.style[1]
		if stroke_style and stroke_style[7]:
			self.stroke_pdfpath(pdfpath, stroke_style, container.stroke_trafo)

		self.canvas.saveState()
		self.canvas.clipPath(pdfpath, 0, 0)

		if fill_style and fill_style[0] & sk2_const.FILL_CLOSED_ONLY and closed:
			self.fill_pdfpath(container, pdfpath, fill_style, container.fill_trafo)
		elif fill_style and not fill_style[0] & sk2_const.FILL_CLOSED_ONLY:
			self.fill_pdfpath(container, pdfpath, fill_style, container.fill_trafo)

		self.render(obj.childs[1:])

		self.canvas.restoreState()

		if stroke_style and not stroke_style[7]:
			self.stroke_pdfpath(pdfpath, stroke_style, container.stroke_trafo)

	def make_pdfpath(self, paths):
		closed = False
		pdfpath = self.canvas.beginPath()
		for path in paths:
			pdfpath.moveTo(*path[0])
			for point in path[1]:
				if len(point) > 2:
					pdfpath.curveTo(point[0][0], point[0][1],
								point[1][0], point[1][1],
								point[2][0], point[2][1])
				else:
					pdfpath.lineTo(*point)
			if path[2]:
				pdfpath.close()
				closed = True
		return pdfpath, closed

	def set_fill_rule(self, fillrule):
		if fillrule in (sk2_const.FILL_EVENODD,
					sk2_const.FILL_EVENODD_CLOSED_ONLY):
			fillrule = FILL_EVEN_ODD
		else:fillrule = FILL_NON_ZERO
		self.canvas._fillMode = fillrule

	def set_rgb_values(self, color, pdfcolor):
		r, g, b = self.cms.get_rgb_color(color)[1]
		density = pdfcolor.density
		if density < 1:
			r = density * (r - 1) + 1
			g = density * (g - 1) + 1
			b = density * (b - 1) + 1
		pdfcolor.red, pdfcolor.green, pdfcolor.blue = (r, g, b)

	def get_pdfcolor(self, color):
		pdfcolor = None
		alpha = color[2]
		if self.use_spot and color[0] == uc2const.COLOR_SPOT:
			c, m, y, k = self.cms.get_cmyk_color(color)[1]
			spotname = color[3]
			if spotname == uc2const.COLOR_REG: spotname = 'All'
			pdfcolor = CMYKColorSep(c, m, y, k, spotName=spotname, alpha=alpha)
		elif self.colorspace == uc2const.COLOR_CMYK:
			c, m, y, k = self.cms.get_cmyk_color(color)[1]
			pdfcolor = CMYKColor(c, m, y, k, alpha=alpha)
		elif self.colorspace == uc2const.COLOR_RGB:
			r, g, b = self.cms.get_rgb_color(color)[1]
			return Color(r, g, b, alpha)
		elif self.colorspace == uc2const.COLOR_GRAY:
			gray = self.cms.get_grayscale_color(color)
			k = 1.0 - gray[1][0]
			c = m = y = 0.0
			pdfcolor = CMYKColor(c, m, y, k, alpha=alpha)
		else:
			if color[0] == uc2const.COLOR_RGB:
				r, g, b = color[1]
				return Color(r, g, b, alpha)
			elif color[0] == uc2const.COLOR_GRAY:
				k = 1.0 - color[1][0]
				c = m = y = 0.0
				pdfcolor = CMYKColor(c, m, y, k, alpha=alpha)
			else:
				c, m, y, k = self.cms.get_cmyk_color(color)[1]
				pdfcolor = CMYKColor(c, m, y, k, alpha=alpha)

		self.set_rgb_values(color, pdfcolor)
		return pdfcolor

	def stroke_pdfpath(self, pdfpath, stroke_style, stroke_trafo=[]):
		width = stroke_style[1]

		if not stroke_style[8]:
			width = stroke_style[1]
		else:
			if not stroke_trafo:
				stroke_trafo = [] + sk2_const.NORMAL_TRAFO
			points = [[0.0, 0.0], [1.0, 0.0]]
			points = libgeom.apply_trafo_to_points(points, stroke_trafo)
			coef = libgeom.distance(*points)
			width = stroke_style[1] * coef

		self.canvas.setStrokeColor(self.get_pdfcolor(stroke_style[2]))
		dash = stroke_style[3]
		caps = stroke_style[4]
		joint = stroke_style[5]
		miter = stroke_style[6]

		self.canvas.setLineWidth(width)
		self.canvas.setLineCap(caps - 1)
		self.canvas.setLineJoin(joint)
		dashes = []
		if dash:
			dashes = list(dash)
			w = width
			if w < 1.0: w = 1.0
			for i in range(len(dashes)):
				dashes[i] = w * dashes[i]
		self.canvas.setDash(dashes)
		self.canvas.setMiterLimit(miter)
		self.canvas.drawPath(pdfpath, 1, 0)
		self.canvas.setStrokeAlpha(1.0)

	def fill_pdfpath(self, obj, pdfpath, fill_style, fill_trafo=None):
		self.set_fill_rule(fill_style[0])

		if fill_style[1] == sk2_const.FILL_SOLID:
			self.canvas.setFillColor(self.get_pdfcolor(fill_style[2]))
			self.canvas.drawPath(pdfpath, 0, 1)
		elif fill_style[1] == sk2_const.FILL_GRADIENT:
			gradient = fill_style[2]
			stops = gradient[2]
			transparency = False
			for stop in stops:
				if stop[1][2] < 1.0:
					transparency = True
					break
			if transparency:
				self.fill_tr_gradient(obj, pdfpath, fill_trafo, gradient)
			else:
				self.fill_gradient(pdfpath, fill_trafo, gradient)

		elif fill_style[1] == sk2_const.FILL_PATTERN:
			pattern = fill_style[2]
			self.fill_pattern(obj, pdfpath, fill_trafo, pattern)

	def fill_gradient(self, pdfpath, fill_trafo, gradient):
		self.canvas.saveState()
		self.canvas.clipPath(pdfpath, 0, 0)
		if fill_trafo:
			self.canvas.transform(*fill_trafo)
		grad_type = gradient[0]
		sp, ep = gradient[1]
		stops = gradient[2]
		colors = []
		positions = []
		for offset, color in stops:
			positions.append(offset)
			colors.append(self.get_pdfcolor(color))
		if grad_type == sk2_const.GRADIENT_RADIAL:
			radius = libgeom.distance(sp, ep)
			self.canvas.radialGradient(sp[0], sp[1], radius, colors,
									positions, True)
		else:
			x0, y0 = sp
			x1, y1 = ep
			self.canvas.linearGradient(x0, y0, x1, y1, colors,
									positions, True)
		self.canvas.restoreState()

	def fill_tr_gradient(self, obj, pdfpath, fill_trafo, gradient):
		grad_type = gradient[0]
		if grad_type == sk2_const.GRADIENT_RADIAL:
			self.fill_radial_tr_gradient(obj, pdfpath, fill_trafo, gradient)
		else:
			self.fill_linear_tr_gradient(obj, pdfpath, fill_trafo, gradient)

	def get_grcolor_at_point(self, stops, point=0.0):
		if not point:return self.get_pdfcolor(stops[0][1])
		if point == 1.0:return self.get_pdfcolor(stops[-1][1])
		stop0 = stops[0]
		stop1 = None
		for item in stops:
			if item[0] < point:stop0 = item
			if item[0] >= point:
				stop1 = item
				break
		size = stop1[0] - stop0[0]
		if not size:
			color = stop1[1]
		else:
			coef = (point - stop0[0]) / size
			color = self.cms.mix_colors(stop0[1], stop1[1], coef)
		return self.get_pdfcolor(color)

	def fill_linear_tr_gradient(self, obj, pdfpath, fill_trafo, gradient):
		if not fill_trafo:
			fill_trafo = [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]
		stops = gradient[2]
		sp, ep = gradient[1]
		dx, dy = sp
		l = libgeom.distance(sp, ep)
		angle = libgeom.get_point_angle(ep, sp)
		m21 = math.sin(angle)
		m11 = m22 = math.cos(angle)
		m12 = -m21
		trafo = [m11, m21, m12, m22, dx, dy]
		inv_trafo = libgeom.multiply_trafo(libgeom.invert_trafo(fill_trafo),
										libgeom.invert_trafo(trafo))
		cv_trafo = libgeom.multiply_trafo(trafo, fill_trafo)
		paths = libgeom.apply_trafo_to_paths(obj.paths, obj.trafo)
		paths = libgeom.apply_trafo_to_paths(paths, inv_trafo)
		bbox = libgeom.sum_bbox(libgeom.get_paths_bbox(paths),
							[0.0, 0.0, l, 0.0])
		bbox = libgeom.normalize_bbox(bbox)

		y = bbox[1]
		d = libgeom.distance(*libgeom.apply_trafo_to_points([[0.0, 0.0],
													[0.0, 1.0]], inv_trafo))
		height = bbox[3] - bbox[1]

		self.canvas.saveState()
		self.canvas.clipPath(pdfpath, 0, 0)
		self.canvas.transform(*cv_trafo)

		self.canvas.setFillColor(self.get_grcolor_at_point(stops, 0.0))
		self.canvas.rect(bbox[0], y, 0.0 - bbox[0], height, stroke=0, fill=1)

		x = 0.0
		while x < l:
			point = x / l
			self.canvas.setFillColor(self.get_grcolor_at_point(stops, point))
			if x + d < l: width = d
			else: width = l - x
			self.canvas.rect(x, y, width, height, stroke=0, fill=1)
			x += d

		self.canvas.setFillColor(self.get_grcolor_at_point(stops, 1.0))
		self.canvas.rect(l, y, bbox[2] - l, height, stroke=0, fill=1)

		self.canvas.restoreState()


	def fill_radial_tr_gradient(self, obj, pdfpath, fill_trafo, gradient):
		if not fill_trafo:
			fill_trafo = [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]
		stops = gradient[2]
		sp, ep = gradient[1]
		dx, dy = sp
		l = libgeom.distance(sp, ep)
		trafo = [1.0, 0.0, 0.0, 1.0, dx, dy]
		inv_trafo = libgeom.multiply_trafo(libgeom.invert_trafo(fill_trafo),
										libgeom.invert_trafo(trafo))
		cv_trafo = libgeom.multiply_trafo(trafo, fill_trafo)
		paths = libgeom.apply_trafo_to_paths(obj.paths, obj.trafo)
		paths = libgeom.apply_trafo_to_paths(paths, inv_trafo)
		bbox = libgeom.sum_bbox(libgeom.get_paths_bbox(paths),
							[0.0, 0.0, l, 0.0])
		bbox = libgeom.normalize_bbox(bbox)
		d = libgeom.distance(*libgeom.apply_trafo_to_points([[0.0, 0.0],
													[0.0, 1.0]], inv_trafo))

		circle_paths = libgeom.get_circle_paths(0.0, 0.0, sk2_const.ARC_CHORD)
		trafo = [2.0, 0.0, 0.0, 2.0, -1.0, -1.0]
		circle_paths = libgeom.apply_trafo_to_paths(circle_paths, trafo)

		inner_paths = []
		r = 0.0
		self.canvas.saveState()
		self.canvas.clipPath(pdfpath, 0, 0)
		self.canvas.transform(*cv_trafo)
		while r < l:
			point = r / l
			self.canvas.setFillColor(self.get_grcolor_at_point(stops, point))
			if r + d < l: coef = (r + d)
			else: coef = l
			trafo = [coef, 0.0, 0.0, coef, 0.0, 0.0]
			paths = libgeom.apply_trafo_to_paths(circle_paths, trafo)
			ring = self.make_pdfpath(inner_paths + paths)[0]
			inner_paths = paths
			self.canvas.drawPath(ring, stroke=0, fill=1)
			r += d

		self.canvas.setFillColor(self.get_grcolor_at_point(stops, 1.0))
		r = max(bbox[2] - bbox[0], bbox[3] - bbox[1])
		trafo = [2.0 * r, 0.0, 0.0, 2.0 * r, 0.0, 0.0]
		paths = libgeom.apply_trafo_to_paths(circle_paths, trafo)
		ring = self.make_pdfpath(inner_paths + paths)[0]
		self.canvas.drawPath(ring, stroke=0, fill=1)

		self.canvas.restoreState()

	def draw_image(self, image, alpha_channel=None):
		if not image: return
		if self.colorspace == uc2const.COLOR_CMYK:
			image = self.cms.convert_image(image, uc2const.IMAGE_CMYK)
		elif self.colorspace == uc2const.COLOR_RGB:
			image = self.cms.convert_image(image, uc2const.IMAGE_RGB)
		elif self.colorspace == uc2const.COLOR_GRAY:
			image = self.cms.convert_image(image, uc2const.IMAGE_GRAY)
		img = ImageReader(image)
		img.getRGBData()
		if alpha_channel: img._dataA = ImageReader(alpha_channel)
		self.canvas.drawImage(img, 0, 0, mask='auto')

	def draw_pixmap_obj(self, obj):
		if obj.colorspace in uc2const.DUOTONES:
			fg, bg = libimg.convert_duotone_to_image(self.cms, obj)
			self.draw_image(*bg)
			self.draw_image(*fg)
		else:
			raw_image = Image.open(StringIO(b64decode(obj.bitmap)))
			raw_image.load()
			alpha_chnl = None
			if obj.alpha_channel:
				alpha_chnl = Image.open(StringIO(b64decode(obj.alpha_channel)))
				alpha_chnl.load()
			self.draw_image(raw_image, alpha_chnl)

	def draw_pixmap(self, obj):
		self.canvas.saveState()
		self.canvas.transform(*obj.trafo)
		self.canvas.setFillColorCMYK(0, 0, 0, 1, 1)
		self.canvas.setStrokeColorCMYK(0, 0, 0, 1, 1)
		self.draw_pixmap_obj(obj)
		self.canvas.restoreState()

	def fill_pattern(self, obj, pdfpath, fill_trafo, pattern):
		if not fill_trafo:
			fill_trafo = [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]
		inv_ptrn_trafo = libgeom.invert_trafo(pattern[3])
		inv_trafo = libgeom.multiply_trafo(libgeom.invert_trafo(fill_trafo),
										libgeom.invert_trafo(inv_ptrn_trafo))
		paths = libgeom.apply_trafo_to_paths(obj.paths, obj.trafo)
		paths = libgeom.apply_trafo_to_paths(paths, inv_trafo)
		bbox = libgeom.get_paths_bbox(paths)
		cv_trafo = libgeom.multiply_trafo(pattern[3], fill_trafo)

		bmpstr = b64decode(pattern[1])
		image_obj = sk2_model.Pixmap(obj.config)
		libimg.set_image_data(self.cms, image_obj, bmpstr)
		if pattern[0] == sk2_const.PATTERN_IMG and \
		 len(pattern) > 2:
			image_obj.style[3] = deepcopy(pattern[2])
		libimg.update_image(self.cms, image_obj)

		self.canvas.saveState()
		self.canvas.clipPath(pdfpath, 0, 0)
		self.canvas.transform(*cv_trafo)

		w, h = image_obj.get_size()
		x = bbox[0]
		y = bbox[3]
		while y > bbox[1] - h:
			while x < bbox[2]:
				self.canvas.saveState()
				self.canvas.transform(1.0, 0.0, 0.0, 1.0, x, y)
				self.draw_pixmap_obj(image_obj)
				self.canvas.restoreState()
				x += w
			y -= h
			x = bbox[0]
		self.canvas.restoreState()
Example #38
0
def print_timesheets(period: str, path: str, uids: List = []) -> None:

    for uid in uids:
        qry = (t.tracking_date.year() == int(period[:4])) & (
            t.tracking_date.month() == int(period[5:])) & (t.user_id == uid)

        rows = db(qry).select()
        tothours = tot_hours(rows)[:-3]
        data = rows.as_list()

        if False:
            import sys
            print(tothours)
            sys.exit()

        user = db(u.id == uid).select().first()

        pdf_file = os.path.join(
            path,
            f"{period[:2]}{period[5:]}-timesheet {user.last_name} {user.first_name}.pdf"
        )

        cols = [30, 130, 170, 210, 250, 310, 350]

        rpt = Report(
            datasource=data,
            detailband=Band([
                Element((cols[0], 0), ("Helvetica", 10),
                        key='tracking_date',
                        format=lambda x: x.strftime("%Y-%m-%d %a")),
                Element((cols[1], 0), ("Helvetica", 10),
                        key='time_start',
                        format=lambda x: x.strftime("%H:%M")),
                Element((cols[2], 0), ("Helvetica", 10),
                        key='time_end',
                        format=lambda x: x.strftime("%H:%M")),
                Element((cols[3], 0), ("Helvetica", 10),
                        key='time_break',
                        format=lambda x: x.strftime("%H:%M")),
                Element((cols[4], 0), ("Helvetica-Bold", 10),
                        key='total_time',
                        format=lambda x: x[:-3]),
                Element((cols[5], 0), ("Helvetica", 10), key='place'),
                # Element((cols[6], 0), ("Helvetica", 10), key = 'comments'),
            ]))

        rpt.pageheader = Band([
            Element((cols[0], 0), ("Times-Bold", 18),
                    text=f"{user.last_name} {user.first_name}"),
            Element((cols[0] + 150, 7), ("Helvetica", 11), text="timesheet"),
            Element((cols[0] + 150 + 52, 0), ("Times-Bold", 18),
                    text=f"{period}"),
            Element((cols[0] + 150 + 52 + 125, 7), ("Helvetica", 11),
                    text="total hours: "),
            Element((cols[0] + 150 + 52 + 125 + 60, 0), ("Times-Bold", 18),
                    text=f"{tothours}"),
            Element((cols[0], 45), ("Helvetica", 11), text="Date"),
            Element((cols[1], 45), ("Helvetica", 11), text="Start"),
            Element((cols[2], 45), ("Helvetica", 11), text="End"),
            Element((cols[3], 45), ("Helvetica", 11), text="Break"),
            Element((cols[4], 45), ("Helvetica", 11), text="Total"),
            Element((cols[5], 45), ("Helvetica", 11), text="Place"),
            Rule((cols[0], 63), 6 * 72, thickness=1),
            Element((cols[0], 67), ("Helvetica", 6), text=" "),
        ])

        if False:
            rpt.pagefooter = Band([
                Element((36, 16), ("Helvetica-Bold", 12),
                        sysvar="pagenumber",
                        format=lambda x: "Page %d" % x),
                Element((300, 16), ("Helvetica-Bold", 12),
                        text=f"{tothours}",
                        align="right")
            ])

        canvas = Canvas(pdf_file, pagesize=A4)
        rpt.generate(canvas)
        canvas.save()
Example #39
0
    def test0(self):
        "A basic document drawing some strings"

        # if they do not have the Japanese font files, go away quietly
        from reportlab.pdfbase.cidfonts import UnicodeCIDFont, findCMapFile

        pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))

        c = Canvas(outputfile('test_multibyte_chs.pdf'))
        c.setFont('Helvetica', 30)
        c.drawString(100, 700, 'Simplified Chinese Font Support')

        c.setFont('Helvetica', 10)
        c.drawString(100, 680,
                     'Short sample: "China - Zhang Ziyi"  (famous actress)')
        # the two typefaces

        hBoxText(
            u'\u4e2d\u56fd - \u7ae0\u5b50\u6021',
            c,
            100,
            660,
            'STSong-Light',
        )

        c.setFont('Helvetica', 10)
        c.drawCentredString(297, 36, 'Page %d' % c.getPageNumber())
        c.showPage()

        ##        # full kuten chart in EUC
        ##        c.setFont('Helvetica', 18)
        ##        c.drawString(72,750, 'Characters available in GB 2312-80, EUC encoding')
        ##        y = 600
        ##        enc = 'GB_EUC_H'
        ##        for row in range(1, 95):
        ##            KutenRowCodeChart(row, 'STSong-Light',enc).drawOn(c, 72, y)
        ##            y = y - 125
        ##            if y < 50:
        ##                c.setFont('Helvetica',10)
        ##                c.drawCentredString(297, 36, 'Page %d' % c.getPageNumber())
        ##                c.showPage()
        ##                y = 700
        ##
        c.save()
        if VERBOSE:
            print('saved ' + outputfile('test_multibyte_chs.pdf'))
Example #40
0
def test(outDir='pdfout', shout=False):
    from reportlab.graphics.shapes import _baseGFontName, _baseGFontNameBI
    from reportlab.rl_config import verbose
    import os
    if not os.path.isdir(outDir):
        os.mkdir(outDir)
    fn = os.path.join(outDir, 'renderPDF.pdf')
    c = Canvas(fn)
    c.setFont(_baseGFontName, 36)
    c.drawString(80, 750, 'Graphics Test')

    # print all drawings and their doc strings from the test
    # file

    #grab all drawings from the test module
    from reportlab.graphics import testshapes
    drawings = []
    for funcname in dir(testshapes):
        if funcname[0:10] == 'getDrawing':
            drawing = eval('testshapes.' + funcname + '()')  #execute it
            docstring = eval('testshapes.' + funcname + '.__doc__')
            drawings.append((drawing, docstring))

    #print in a loop, with their doc strings
    c.setFont(_baseGFontName, 12)
    y = 740
    i = 1
    for (drawing, docstring) in drawings:
        assert (docstring is not None), "Drawing %d has no docstring!" % i
        if y < 300:  #allows 5-6 lines of text
            c.showPage()
            y = 740
        # draw a title
        y = y - 30
        c.setFont(_baseGFontNameBI, 12)
        c.drawString(80, y, 'Drawing %d' % i)
        c.setFont(_baseGFontName, 12)
        y = y - 14
        textObj = c.beginText(80, y)
        textObj.textLines(docstring)
        c.drawText(textObj)
        y = textObj.getY()
        y = y - drawing.height
        draw(drawing, c, 80, y)
        i = i + 1
    if y != 740: c.showPage()

    c.save()
    if shout or verbose > 2:
        print('saved %s' % ascii(fn))
Example #41
0
def drawToFile(d,
               fn,
               msg="",
               showBoundary=rl_config._unset_,
               autoSize=1,
               canvasKwds={}):
    """Makes a one-page PDF with just the drawing.

    If autoSize=1, the PDF will be the same size as
    the drawing; if 0, it will place the drawing on
    an A4 page with a title above it - possibly overflowing
    if too big."""
    d = renderScaledDrawing(d)
    for x in ('Name', 'Size'):
        a = 'initialFont' + x
        canvasKwds[a] = getattr(d, a,
                                canvasKwds.pop(a, STATE_DEFAULTS['font' + x]))
    c = Canvas(fn, **canvasKwds)
    if msg:
        c.setFont(rl_config.defaultGraphicsFontName, 36)
        c.drawString(80, 750, msg)
    c.setTitle(msg)

    if autoSize:
        c.setPageSize((d.width, d.height))
        draw(d, c, 0, 0, showBoundary=showBoundary)
    else:
        #show with a title
        c.setFont(rl_config.defaultGraphicsFontName, 12)
        y = 740
        i = 1
        y = y - d.height
        draw(d, c, 80, y, showBoundary=showBoundary)

    c.showPage()
    c.save()
    if sys.platform == 'mac' and not hasattr(fn, "write"):
        try:
            import macfs, macostools
            macfs.FSSpec(fn).SetCreatorType("CARO", "PDF ")
            macostools.touched(fn)
        except:
            pass
Example #42
0
def test():
    c = Canvas('renderPDF.pdf')
    c.setFont('Times-Roman', 36)
    c.drawString(80, 750, 'Graphics Test')

    # print all drawings and their doc strings from the test
    # file

    #grab all drawings from the test module
    from reportlab.graphics import testshapes
    drawings = []
    for funcname in dir(testshapes):
        if funcname[0:10] == 'getDrawing':
            drawing = eval('testshapes.' + funcname + '()')  #execute it
            docstring = eval('testshapes.' + funcname + '.__doc__')
            drawings.append((drawing, docstring))

    #print in a loop, with their doc strings
    c.setFont('Times-Roman', 12)
    y = 740
    i = 1
    for (drawing, docstring) in drawings:
        assert (docstring is not None), "Drawing %d has no docstring!" % i
        if y < 300:  #allows 5-6 lines of text
            c.showPage()
            y = 740
        # draw a title
        y = y - 30
        c.setFont('Times-BoldItalic', 12)
        c.drawString(80, y, 'Drawing %d' % i)
        c.setFont('Times-Roman', 12)
        y = y - 14
        textObj = c.beginText(80, y)
        textObj.textLines(docstring)
        c.drawText(textObj)
        y = textObj.getY()
        y = y - drawing.height
        draw(drawing, c, 80, y)
        i = i + 1
    if y != 740: c.showPage()

    c.save()
    print 'saved renderPDF.pdf'
Example #43
0
class QRCodePrinter(object):

    def __init__(self, workdir: Path):
        self.working_dir: Path = None
        self.url_prefix: str = ''
        self.box_start: int = 0
        self.label_count: int = 0
        self.output_file: str = ''
        self.full_path: Path = None
        self.pdf: Canvas = None

        # width and height are in points (1/72 inch)
        self.width: int = None
        self.height: int = None

        # database connection information
        self.con = None
        self.meta: MetaData = None
        self.box: Table = None

        # label locations on the page
        self.label_locations: list(LabelPosition) = list()
        self.compute_box_dimensions()

        # set this to the last position in the list to force a new page
        self.next_pos: int = len(self.label_locations)

        # use the page number to control first page handling
        self.page_number: int = 0

        if not workdir is None and workdir.is_dir():
            self.working_dir = workdir
        return

    def run_QRPrt(self, parameters: dict):
        """
        Top method for running Run the QR code printer..

        :param parameters: dictionary of command line arguments
        :return:
        """
        parm_dict = parameters
        self.url_prefix: str = parm_dict['--prefix'].strip('\'"')
        self.box_start: int = int(parm_dict['--start'])
        self.label_count: int = int(parm_dict['--count'])
        self.output_file: str = parm_dict['--output']
        if (not isinstance(self.box_start, int)) or \
                self.box_start <= 0:
            raise ValueError('Box start must be a positive integer')
        if (not isinstance(self.label_count, int)) or \
                self.label_count <= 0:
            raise ValueError('Label count must be a positive integer')
        full_path = Path('/home/capstonetest/PycharmProjects/Food-Pantry-Inventory/scans') / self.output_file
        if full_path.exists():
            raise ValueError('File already exists')
        else:
            self.full_path = full_path
        debug(
            f'Parameters validated: pfx: {self.url_prefix}, '
            f'start: {self.box_start}, '
            f'count: {self.label_count}, '
            f'file: {self.output_file}'
        )

        self.connect_to_generate_labels()

    def connect_to_generate_labels(self):
        """
        Connect to the database and generate labels.
        :return:
        """
        # establish access to the database
        self.con, self.meta = self.connect(
            user=settings_private.DB_USER,
            password=settings_private.DB_PSWD,
            db=settings_private.DB_NAME,
            host=settings_private.DB_HOST,
            port=settings_private.DB_PORT
        )

        # establish access to the box table
        self.box = Table(
            'fpiweb_box',
            self.meta,
            autoload=True,
            autoload_with=self.con)

        self.generate_label_pdf()
        # self.con.close()

    def connect(self, user, password, db, host='localhost', port=5432):
        """
        Establish a connection to the desired PostgreSQL database.

        :param user:
        :param password:
        :param db:
        :param host:
        :param port:
        :return:
        """

        # We connect with the help of the PostgreSQL URL
        # postgresql://federer:grandestslam@localhost:5432/tennis
        url = f'postgresql://{user}:{password}@{host}:{port}/{db}'

        # The return value of create_engine() is our connection object
        con = create_engine(url, client_encoding='utf8')
        # We then bind the connection to MetaData()
        meta = MetaData(bind=con)
        return con, meta

    def generate_label_pdf(self):
        """
        Generate the pdf file with the requested labels in it.
        :return:
        """
        self.initialize_pdf_file()
        self.fill_pdf_pages()
        self.finalize_pdf_file()

    def initialize_pdf_file(self, buffer):
        """
        Prepare to scribble on a new pdf file.

        :param buffer:  May be a string with a filename or a BytesIO or other
            File-like object

        """
        self.pdf: Canvas(buffer, pagesize=letter)
        self.width, self.height = letter

    def compute_box_dimensions(self):
        """
        Compute the dimensions and bounding boxes for each label on the page.
        :return:
        """
        vertical_start = (BACKGROUND_SIZE.y * 3) + PAGE_OFFSET.y
        horizontal_stop = (BACKGROUND_SIZE.x * 3) + PAGE_OFFSET.x - 1
        for vertical_position in range(vertical_start, -1,
                                       -BACKGROUND_SIZE.y):
            for horizontal_position in range(PAGE_OFFSET.x,
                                             horizontal_stop,
                                             BACKGROUND_SIZE.x):
                new_label = LabelPosition(Point(horizontal_position,
                                                vertical_position))
                self.label_locations.append(new_label)
        return

    @staticmethod
    def get_box_numbers(start, count) -> (str, int):
        next_box_number = start
        available_count = 0
        while available_count < count:
            box_label = f'BOX{next_box_number:05}'
            logger.debug(f'Attempting to get {box_label}')
            if Box.objects.filter(box_number=box_label).exists():
                next_box_number += 1
                continue
            available_count += 1
            logger.debug(f'{box_label} not found - using for label')
            yield box_label, next_box_number
            next_box_number += 1

    def get_next_box_url(self, starting_number, count) -> (str, str):
        """
        Build the URL for the next box.
        :return:
        """
        for label, box_number in self.get_box_numbers(
                starting_number,
                count
        ):
            logger.debug(f'Got {label}, {box_number}')
            url = f"{self.url_prefix}{box_number:05}"
            yield url, label
            # shutil.move(label, 'scans')

    def get_next_qr_img(self, starting_number, count) -> (str, str):
        """
        Build the QR image for the next box label.

        :return: a QR code image ready to print
        """
        # scans_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        files = []
        for url, label in self.get_next_box_url(starting_number, count):
            label_file_name = f'{label}.png'
            qr = create_qrcode(url)
            qr.png(label_file_name, scale=5)
            files.append(label_file_name)
        for file in files:
            shutil.move(file, '/home/capstonetest/PycharmProjects/Food-Pantry-Inventory/scans',
                        copy_function=shutil.copytree)


            yield label_file_name, label

    def fill_pdf_pages(self, starting_number, count):
        # # draw lines around the boxes that will be filled with labels
        # self.draw_boxes_on_page()
        # # self.pdf.setFillColorRGB(1, 0, 1)
        # # self.pdf.rect(2*inch, 2*inch, 2*inch, 2*inch, fill=1)
        for label_file, label_name in self.get_next_qr_img(starting_number, count):
            debug(f'Got {label_file}')
            if self.next_pos >= len(self.label_locations) - 1:
                self.finish_page()
                self.next_pos = 0
            else:
                self.next_pos += 1
            self.draw_bounding_box(self.next_pos)
            self.place_label(label_file, label_name, self.next_pos)
        self.finish_page()
        return

    def finalize_pdf_file(self):
        self.pdf.save()
        return

    def print(self, starting_number, count, buffer):
        self.initialize_pdf_file(buffer)
        self.fill_pdf_pages(starting_number, count)
        self.finalize_pdf_file()

    def finish_page(self):
        if self.page_number > 0:
            self.pdf.showPage()
        self.page_number += 1

    def place_label(self, file_name: str, label_name: str, pos: int):
        """
        Place the label in the appropriate location on the page.

        :param file_name:
        :param label_name:
        :param pos:
        :return:
        """
        box_info = self.label_locations[pos]

        # place image on page
        im = Image(file_name, LABEL_SIZE.x, LABEL_SIZE.y)
        im.drawOn(self.pdf, box_info.image_start.x, box_info.image_start.y)

        # place title above image
        self.pdf.setFont('Helvetica-Bold', 12)
        self.pdf.drawCentredString(
            box_info.title_start.x + TITLE_ADJUSTMENT.x,
            box_info.title_start.y + TITLE_ADJUSTMENT.y,
            label_name
        )

    def draw_bounding_box(self, label_pos: int):
        """
        Draw a bounding box around the specified label.

        :param label_pos: position in the labels locations list.
        :return:
        """
        self.pdf = Canvas(str(self.full_path), pagesize=letter)
        self.width, self.height = letter

        box_info = self.label_locations[label_pos]

        self.pdf.line(box_info.upper_left_offset.x,
                      box_info.upper_left_offset.y,
                      box_info.upper_right_offset.x,
                      box_info.upper_right_offset.y)

        self.pdf.line(box_info.upper_right_offset.x,
                      box_info.upper_right_offset.y,
                      box_info.lower_right_offset.x,
                      box_info.lower_right_offset.y)

        self.pdf.line(box_info.lower_right_offset.x,
                      box_info.lower_right_offset.y,
                      box_info.lower_left_offset.x,
                      box_info.lower_left_offset.y)

        self.pdf.line(box_info.lower_left_offset.x,
                      box_info.lower_left_offset.y,
                      box_info.upper_left_offset.x,
                      box_info.upper_left_offset.y)
def get_text_width(font, size, text):
    c = Canvas(test, pagesize=pagesize)
    length = c.stringWidth(str(text), font, size)

    return length
    def test3(self):
        aW = 307
        styleSheet = getSampleStyleSheet()
        bt = styleSheet['BodyText']
        btj = ParagraphStyle('bodyText1j', parent=bt, alignment=TA_JUSTIFY)
        p = Paragraph(
            """<a name='top'/>Subsequent pages test pageBreakBefore, frameBreakBefore and
                keepTogether attributes.  Generated at 1111. The number in brackets
                at the end of each paragraph is its position in the story. llllllllllllllllllllllllll 
                bbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccc ddddddddddddddddddddd eeeeyyy""",
            btj)

        w, h = p.wrap(aW, 1000)
        canv = Canvas('test_platypus_paragraph_just.pdf', pagesize=(aW, h))
        i = len(canv._code)
        p.drawOn(canv, 0, 0)
        ParaCode = canv._code[i:]
        canv.saveState()
        canv.setLineWidth(0)
        canv.setStrokeColorRGB(1, 0, 0)
        canv.rect(0, 0, aW, h)
        canv.restoreState()
        canv.showPage()
        canv.save()
        x = paraFontSizeHeightOffset and '50' or '53.17'
        good = [
            'q', '1 0 0 1 0 0 cm', 'q', 'BT 1 0 0 1 0 ' + x +
            ' Tm 3.59 Tw 12 TL /F1 10 Tf 0 0 0 rg (Subsequent pages test pageBreakBefore, frameBreakBefore and) Tj T* 0 Tw .23 Tw (keepTogether attributes. Generated at 1111. The number in brackets) Tj T* 0 Tw .299167 Tw (at the end of each paragraph is its position in the story. llllllllllllllllllllllllll) Tj T* 0 Tw 66.9 Tw (bbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccc) Tj T* 0 Tw (ddddddddddddddddddddd eeeeyyy) Tj T* ET',
            'Q', 'Q'
        ]
        ok = ParaCode == good
        assert ok, "\nParaCode=%r\nexpected=%r" % (ParaCode, good)
    def _build_omr_layer(marks):
        padding_x = 4.2 * mm
        padding_y = 8.5 * mm
        top_mark_x = 7 * mm
        top_mark_y = 220 * mm
        mark_y_spacing = 4 * mm

        mark_width = 6.5 * mm
        marks_height = (len(marks) - 1) * mark_y_spacing

        logger.info('Mailer DS-75i OMR Settings: 1={} 2={}'.format(
            (297 * mm - top_mark_y) / mm,
            (top_mark_x + mark_width / 2) / mm + 0.5))

        omr_buffer = StringIO.StringIO()
        omr_canvas = Canvas(omr_buffer)
        omr_canvas.setLineWidth(0.2 * mm)

        # add a white background for the omr code
        omr_canvas.setFillColor(white)
        omr_canvas.rect(x=top_mark_x - padding_x,
                        y=top_mark_y - marks_height - padding_y,
                        width=mark_width + 2 * padding_x,
                        height=marks_height + 2 * padding_y,
                        fill=True,
                        stroke=False)

        for offset, mark in enumerate(marks):
            mark_y = top_mark_y - offset * mark_y_spacing
            if mark:
                omr_canvas.line(top_mark_x, mark_y, top_mark_x + mark_width,
                                mark_y)

        # Close the PDF object cleanly.
        omr_canvas.showPage()
        omr_canvas.save()

        # move to the beginning of the StringIO buffer
        omr_buffer.seek(0)
        omr_pdf = PdfFileReader(omr_buffer)

        return omr_pdf.getPage(0)
Example #47
0
def generateNumberedPages(numPages, pageSize, orientation, bgColor, outPath):
    "Generate a 10 page document with one big number per page."
    
    if orientation == "landscape":
        pageSize = landscape(pageSize)
    canv = Canvas(outPath, pagesize=pageSize)

    for i in range(numPages):
        canv.setFont("Helvetica", 500)
        text = "%s" % i
        if i % 2 == 0:
            canv.setStrokeColor(bgColor)
            canv.setFillColor(bgColor)
            canv.rect(0, 0, pageSize[0], pageSize[1], stroke=True, fill=True)
            canv.setFillColor(black)
        elif i % 2 == 1:
            canv.setStrokeColor(black)
            canv.setFillColor(black)
            canv.rect(0, 0, pageSize[0], pageSize[1], stroke=True, fill=True)
            canv.setFillColor(bgColor)
        if orientation == "portrait":
            canv.drawCentredString(pageSize[0]/2.0, pageSize[1]*0.3, "%s" % i) 
        elif orientation == "landscape":
            canv.drawCentredString(pageSize[0]/2.0, pageSize[1]*0.21, "%s" % i) 
        canv.showPage()
        
    canv.save() 
 def __init__(self, name, pagesize=defaultPageSize):
     self.pagesize=pagesize
     self.name=name
     self.canvas = Canvas(name, pagesize=self.pagesize)
     self.pages = []
Example #49
0
def course_download(request, pk):
    obj = get_object_or_404(Course, pk=pk)
    buffer = io.BytesIO()
    canvas = Canvas(buffer)
    pdfmetrics.registerFont(
        TTFont('Times', os.path.join(STATICFILES_DIRS[0], 'fonts',
                                     'times.ttf')))
    canvas.setFont('Times', 26)
    canvas.drawString(200, 750, "Информация о курсе")
    canvas.setFont('Times', 15)
    canvas.drawString(50, 700, f"Категория: {obj.category}")
    canvas.drawString(50, 675, f"Описание: {obj.description}")
    canvas.drawString(50, 650, f"Название: {obj.name}")
    canvas.drawString(50, 625, f"Компания: {obj.company}")
    canvas.drawString(50, 575, f"Телефон: {obj.phone}")
    canvas.drawString(50, 600, f"Электронная почта: {obj.email}")
    canvas.drawString(50, 550, f"Адрес: {obj.address}")
    canvas.showPage()
    canvas.save()
    buffer.seek(0)
    return FileResponse(buffer,
                        as_attachment=True,
                        filename=f'Курс_{obj.name}.pdf')
Example #50
0
def main():
    canvas = Canvas(FILENAME)
    canvas.setFont("Courier", 8)
    canvas.setPageSize(A4)
    c = canvas
    canvas.line(0,HEIGHT/2, WIDTH,HEIGHT/2)
    canvas.setFont("Courier", 30)
    canvas.drawString(10,(HEIGHT/2)-20, TEXT)
    canvas.showPage()
    canvas.save()
    print( 'canvas is auto saved to file', canvas._filename )
    time.sleep(1)
    os.system( 'open %s' % canvas._filename )
Example #51
0
def createCalendar(start, end, filename=None, size=SIZE, color=colors.red):
    """
    Create an academic calendar for a quarter.
    Counts academic weeks + 1 week for finals.

    start: an Arrow date
    end: an Arrow date
    filename: String containing the file to write the calendar to
    size: size, in points of the canvas to write on
    color: color for accents
    """

    # initializations
    canvas = Canvas(filename, size)
    weekHeader = calendar.weekheader(1).split()
    weekHeader.insert(0, 0)
    width, height = size

    # dictionary for each month in quarter
    months = 1
    monthInfo = {}

    for dt in arrow.Arrow.range('month', start.replace(day=1),
                                end.replace(day=2)):
        name = dt.format('MMM')
        cal = calendar.monthcalendar(dt.year, dt.month)
        monthInfo[months] = mo(name, cal)
        months += 1

    # arrange array for printing
    fullCal = []
    fullCal.append(weekHeader)
    weekNum = 1

    for m in monthInfo:
        weekNum -= 1
        fullCal.append(monthInfo[m].name)
        for w in monthInfo[m].cal:
            # add academic week numbers
            if (m == 1 and max(w) >= start.day) or weekNum > 0:
                weekNum += 1
            if weekNum > NUMWEEKS + 1:
                weekNum = 0

            w.insert(0, weekNum)
            fullCal.append(w)

    # draw everything out
    cellWidth = .3 * inch
    cellHeight = .3 * inch
    x = 1.5 * inch
    y = height - inch
    canvas.setStrokeAlpha(.25)

    for week in fullCal:
        # found a month
        if type(week) is str:
            canvas.setFont('Helvetica-Bold', 11)
            canvas.setFillColor(color)
            canvas.drawString(inch, y, week)
            canvas.setFillColor(colors.black)
            canvas.setFont('Helvetica', 11)
        else:  # found an array for weekdays
            for d, day in enumerate(week):
                if day != 0:
                    # weekday abbreviations
                    if type(day) is str:
                        canvas.setFont('Helvetica-Bold', 11)
                    else:
                        canvas.setFont('Helvetica', 11)

                    # draw circles around all the week numbers
                    if d == 0:
                        canvas.circle(x, y + .05 * inch, .1 * inch)

                    # weekends
                    if d in (6, 7):
                        canvas.setFillColor(color)
                    else:
                        canvas.setFillColor(colors.black)

                    canvas.drawCentredString(x, y, str(day))
                x += cellWidth
            x = 1.5 * inch
            y -= cellHeight

    # finish this page
    canvas.showPage()
    return canvas
Example #52
0
import os

printer_name = "Brother QL-700"
label_file = "ap-labels.pdf"


def inputMAC():
    while True:
        print("Enter mac-address:")
        inp = input()  # raw_input in Python 2.x
        if re.match(r'[a-fA-F0-9]{12}$', inp):
            return inp
        print('Invalid MAC, please enter again:')


canvas = Canvas(label_file, pagesize=(6.2 * cm, 1 * cm))
for i in range(8):
    mac = inputMAC()
    canvas.setFont("Courier", 24)
    canvas.drawString(0.1 * cm, 0.2 * cm, mac)
    canvas.showPage()
canvas.save()

# acroread = r'C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe'
acrobat = r'C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe'

# '"%s"'is to wrap double quotes around paths
# as subprocess will use list2cmdline internally if we pass it a list
# which escapes double quotes and Adobe Reader doesn't like that

cmd = '"{}" /N /T "{}" "{}"'.format(acrobat, label_file, printer_name)
Example #53
0
    def ___test2_all(self):
        """Dumps out ALl GLYPHS in a CID font.

        Reach for your microscope :-)"""
        try:
            from reportlab.pdfbase.cidfonts import CIDFont, findCMapFile
            findCMapFile('90ms-RKSJ-H')
            findCMapFile('Identity-H')
        except:
            #don't have the font pack.  return silently
            return

        pdfmetrics.registerFont(CIDFont('HeiseiMin-W3', 'Identity-H'))

        c = Canvas('test_japanese_2.pdf')
        c.setFont('Helvetica', 30)
        c.drawString(100, 800, 'All Glyphs in Adobe-Japan-1-2 collection!')

        # the two typefaces
        c.setFont('HeiseiMin-W3-Identity-H', 2)

        x0 = 50
        y0 = 700
        dx = 2
        dy = 2
        for row in range(256):
            for cell in range(256):
                s = chr(row) + chr(cell)
                x = x0 + cell * dx
                y = y0 - row * dy
                c.drawString(x, y, s)

        c.save()
        if VERBOSE:
            print 'saved ' + outputfile('test_multibyte_jpn.pdf')
Example #54
0
class NA_GO_PDF:
    helper = BaseHelper()
    main_display_table = [
        'GoodsName', 'BrandName', 'Serial_Number', 'Goods_Type',
        'Date_Request', 'Date_Released', 'IsNew', 'for_employee',
        'Eks_Employee', 'Sender', 'Responsible_by', 'Ref_GoodsFrom',
        'Equipment', 'Descriptions'
    ]
    main_display_add_hoc = [
        'GoodsName', 'BrandName', 'SerialNumber', 'Type', 'DateReleased',
        'ToEmployee', 'Equipment', 'Descriptions', 'Conditions',
        'Eks_Employee', 'Sender'
    ]
    Header_Cols = None

    def __init__(self, title):
        self.file = io.BytesIO()
        self.width, self.height = A4
        #self.canvas = canv
        self.flowables = []
        self.Header_Cols = [[
            self.helper.create_bold_text(BoldCols, size=9)
            for BoldCols in self.main_display_table
        ]]
        self.canv = Canvas(self.file, pagesize=A4)
        self.canv.setAuthor('Nandar HayHay')

        #set margin canvas
        self.frameDoc = self.helper.Margin(self.helper.u('0.4in'),
                                           self.helper.u('0.3in'),
                                           self.helper.u('0.4in'),
                                           self.helper.u('0.3in'))
        #set cursor langsung
        self.cursor = self.helper.Position(self.frameDoc.left,
                                           self.height - self.frameDoc.top)
        self.doc = SimpleDocTemplate(self.file,
                                     pagesize=A4,
                                     topMargin=self.frameDoc.top,
                                     leftMargin=self.frameDoc.left,
                                     rightMargin=self.frameDoc.right,
                                     bottomMargin=self.frameDoc.bottom,
                                     title=title,
                                     displayDocTitle=True)

    def set_cursor(self, x, y):
        self.cursor = self.helper.Position(x, y)
        self.doc.Position = self.cursor
        return self.cursor

    #def move_cursor(self, x=0, y=0):
    #    return self.set_cursor(
    #        self.cursor.x + x,
    #        self.cursor.y + y)
    def AddLogoHeader(self, canv, doc):
        width, height = doc.pagesize
        img = Image(doc.logo_path_header, width=113, height=28)
        img.wrapOn(canv, width, height)
        x, y = doc.Position
        img.drawOn(canv, x, y)

    def buildAddHocPDF(self, Data=None):
        #buat text centered
        BAState = Paragraph("Berita Acara ", self.helper.CENTER_STYLE_H1)
        self.flowables.append(BAState)
        self.flowables.append(Spacer(0, 50))
        ToEmployee = Data[self.main_display_add_hoc[5]]
        Descriptions = Data[self.main_display_add_hoc[7]]
        GoodsName = Data[self.main_display_add_hoc[0]]
        self.canv.setTitle("Goods_Outwards_" + GoodsName)
        self.canv.setTitle("Goods_Outwards_" + GoodsName)
        BrandName = Data[self.main_display_add_hoc[1]]
        Type = Data[self.main_display_add_hoc[3]]
        SerialNumber = Data[self.main_display_add_hoc[2]]
        Kondisi = Data[self.main_display_add_hoc[8]]
        Equipment = Data[self.main_display_add_hoc[6]]
        DateReleased = Data[self.main_display_add_hoc[4]]
        Sender = Data[self.main_display_add_hoc[10]]
        self.flowables.append(
            Paragraph(
                """Telah diserahkan 1 unit barang inventaris kepada Saudara/(Saudari){ToEmployee}, <br/> <br/>
        """.format(ToEmployee=ToEmployee, GoodsName=GoodsName),
                self.helper.LABEL_STYLE))

        self.flowables.append(Spacer(0, 25))

        #self.flowables.ap(Indenter(-90))
        colWidthBarang = [120, 250]

        berupa = Paragraph("<b>Berupa</b>", self.helper.LABEL_STYLE)
        barang = Paragraph(": {GoodsName}".format(GoodsName=GoodsName),
                           self.helper.LABEL_STYLE)

        merk = Paragraph("<b>Merek</b>", self.helper.LABEL_STYLE)
        merkBarang = Paragraph(": {BrandName}".format(BrandName=BrandName),
                               self.helper.LABEL_STYLE)

        LabelType = Paragraph("<b>Type</b>", self.helper.LABEL_STYLE)
        TypeBarang = Paragraph(": {Type}".format(Type=Type),
                               self.helper.LABEL_STYLE)

        LabelSN = Paragraph("<b>SerialNumber/FA NO</b>",
                            self.helper.LABEL_STYLE)
        DataSN = Paragraph(
            ": {SerialNumber}".format(SerialNumber=SerialNumber),
            self.helper.LABEL_STYLE)

        DataBarang = [[berupa, barang], [merk, merkBarang],
                      [LabelType, TypeBarang], [LabelSN, DataSN]]
        tblBarang = Table(DataBarang,
                          colWidthBarang,
                          None,
                          style=TableStyle([('ALIGN', (0, 0), (-1, -1), 'LEFT')
                                            ]),
                          hAlign='LEFT')
        self.flowables.append(tblBarang)

        self.flowables.append(Spacer(0, 20))
        self.flowables.append(
            Paragraph("{Descriptions}".format(Descriptions=Descriptions),
                      self.helper.LABEL_STYLE))

        #self.flowables.append(Paragraph("""<b>Berupa&nbsp;&nbsp;: {GoodsName}<br/>Merek&nbsp;&nbsp;: {BrandName}<br/>Type&nbsp;&nbsp;: {Type}<br/>
        #ServiceTag/FA_Number&nbsp;&nbsp;: {SerialNumber}<br/><br/><br/>
        #Kelengkapan:</b>""" .format(GoodsName=GoodsName,BrandName=BrandName, Type=Type, SerialNumber=SerialNumber), self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 20))
        self.flowables.append(
            Paragraph("Kelengkapan : {}".format(Equipment),
                      self.helper.LABEL_STYLE))  #kelengkapan
        self.flowables.append(Spacer(0, 20))
        if Kondisi == "Bekas":
            EksEmployee = Data[self.main_display_add_hoc[9]]
            self.flowables.append(
                Paragraph(
                    "{GoodsName} ({Conditions} {EksEmployee})".format(
                        GoodsName=GoodsName,
                        Conditions=Kondisi,
                        EksEmployee=EksEmployee), self.helper.LABEL_STYLE))
        elif Kondisi == "Baru":
            self.flowables.append(
                Paragraph(
                    "{GoodsName} {Conditions}".format(GoodsName=GoodsName,
                                                      Conditions=Kondisi),
                    self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 20))
        self.flowables.append(
            Paragraph("Demikian berita acara ini di buat dengan sebenarnya",
                      self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 25))
        self.flowables.append(
            Paragraph(
                "Jakarta, {},".format(
                    parse(str(DateReleased)).strftime('%d %B %Y')),
                self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 160))
        self.flowables.append(Indenter(left=130))
        #create table
        colWidths = [(self.width / 1.8) - 5, (self.width / 2) - 5]
        #self.flowables.append(i)
        Accepter = Paragraph("Yang Menerima", self.helper.LABEL_STYLE)
        Submitter = Paragraph("Yang Menyerahkan", self.helper.LABEL_STYLE)

        Data1 = [[Accepter, Submitter]]
        tbl1 = Table(data=Data1,
                     colWidths=colWidths,
                     style=TableStyle([('ALIGN', (0, 0), (-2, -1), 'LEFT'),
                                       ('ALIGN', (0, 1), (-1, -1), 'RIGHT')]))
        self.flowables.append(tbl1)
        self.flowables.append(Spacer(0, 50))
        Data2 = [[
            Paragraph("(&nbsp;&nbsp;{}&nbsp;&nbsp;)".format(ToEmployee),
                      self.helper.LABEL_STYLE),
            Paragraph("(&nbsp;&nbsp;{}&nbsp;&nbsp;)".format(Sender),
                      self.helper.LABEL_STYLE)
        ]]
        tbl2 = Table(data=Data2,
                     colWidths=colWidths,
                     style=TableStyle([('ALIGN', (0, 0), (-2, -1), 'LEFT'),
                                       ('ALIGN', (0, 1), (-1, -1), 'RIGHT')]))
        self.flowables.append(tbl2)

        #add logo
        widthLogo = 187.5
        heightLogo = 137.25
        x, y = self.helper.coord(self.width - widthLogo,
                                 self.height - heightLogo, self.height,
                                 self.helper.unit_lookup["pt"])
        self.set_cursor(x + 50, y - 95)
        #self.doc.canv.setTitle("Goods_Outwards_" + GoodsName)
        self.doc.widthLogo = widthLogo
        self.doc.heigLogo = heightLogo
        self.doc.logo_path_header = settings.LOGO_IMAGE + "LogoHeader.jpg"
        self.doc.logo_path_footer = settings.LOGO_IMAGE + "LogoFooter.jpg"
        #self.helper.AddLogoHeader(self.canvas, self.doc)
        self.doc.build(self.flowables,
                       onFirstPage=self.helper.header_and_footer)
        #self.doc.build(self.flowables, onFirstPage=self.AddLogoHeader)

        ReportFile = self.file.getvalue()
        self.file.close()
        return ReportFile
def makeTestDoc(fontNames):
    filename = outputfile('test_pdfbase_pdfmetrics.pdf')
    c = Canvas(filename)
    c.bookmarkPage('Glyph Width Tests')
    c.showOutline()
    c.addOutlineEntry('Glyph Width Tests', 'Glyph Width Tests', level=0)
    if verbose:
        print  # get it on a different line to the unittest log output.
    for fontName in fontNames:
        if verbose:
            print('width test for', fontName)

        makeWidthTestForAllGlyphs(c, fontName)
        c.showPage()
    c.save()
    if verbose:
        if verbose:
            print('saved', filename)
Example #56
0
def render_to_reportlab_document(output_filename, papersize_tuple, layout):
    """Create and save a document with contents of the given layout manager."""
    c = Canvas(output_filename, papersize_tuple)
    render_to_reportlab_canvas(c, papersize_tuple, layout)
    c.save()
Example #57
0
 ap_models = Counter(access_point['model']
                     for access_point in access_points
                     if access_point.get('model'))
 ap_models = dict(ap_models)
 print(ap_models)
 label_file_url = "{}/{}/{}".format(import_path_ekahau,
                                    d.get('Gatuadress'), label_file)
 label_title = str("{} - {}".format(d.get('Gatuadress'),
                                    d.get('Popularnamn')))
 #Creating packinglist
 styles = getSampleStyleSheet()
 style = styles["BodyText"]
 header = Paragraph(
     "<bold><font size=15>{}</font></bold>".format(label_title),
     style)
 canvas = Canvas(label_file_url, pagesize=(6.2 * cm, 4 * cm))
 #canvas.drawString(0.1 * cm, 8.2 * cm, label_title)
 aW = 6 * cm
 aH = 3 * cm
 w, h = header.wrap(aW, aH)
 header.drawOn(canvas, 5, aH)
 for ap_model in ap_models:
     aH = aH - h
     ap_model_str = str("{}: {}st".format(ap_model,
                                          ap_models[ap_model]))
     ap_model_text = Paragraph(
         "<font size=15>{}</font>".format(ap_model_str), style)
     ap_model_text.wrap(aW, aH)
     ap_model_text.drawOn(canvas, 5, aH)
     aH = aH - h
     #canvas.drawString(0.1 * cm, 0.2 * cm, ap_model_str)
Example #58
0
def _simple_subset_generation(fn, npages, alter=0):
    c = Canvas(outputfile(fn))
    c.setFont('Helvetica', 30)
    c.drawString(100, 700, 'Unicode TrueType Font Test %d pages' % npages)
    # Draw a table of Unicode characters
    for p in xrange(npages):
        for fontName in ('Vera', 'VeraBI'):
            c.setFont(fontName, 10)
            for i in xrange(32):
                for j in xrange(32):
                    ch = utf8(i * 32 + j + p * alter)
                    c.drawString(80 + j * 13 + int(j / 16.0) * 4,
                                 600 - i * 13 - int(i / 8.0) * 8, ch)
        c.showPage()
    c.save()
    def testVisible(self):
        "Makes a document with extra text - should export and distill"
        c = Canvas(outputfile('test_pdfbase_postscript_visible.pdf'))
        c.setPageCompression(0)

        c.setFont('Helvetica-Bold', 18)
        c.drawString(100, 700,
                     'Hello World. This is page 1 of a 2 page document.')
        c.showPage()

        c.setFont('Helvetica-Bold', 16)
        c.drawString(100, 700,
                     'Page 2. This has some postscript drawing code.')
        c.drawString(100, 680,
                     'If you print it using a PS device and Acrobat 4/5,')
        c.drawString(100, 660,
                     'or export to Postscript, you should see the word')
        c.drawString(100, 640,
                     '"Hello PostScript" below.  In ordinary Acrobat Reader')
        c.drawString(100, 620, 'we expect to see nothing.')
        c.addPostScriptCommand(
            '/Helvetica findfont 48 scalefont setfont 100 400 moveto (Hello PostScript) show'
        )

        c.drawString(100, 500, 'This document also inserts two postscript')
        c.drawString(100, 480, ' comments at beginning and endof the stream;')
        c.drawString(100, 460,
                     'search files for "%PS_BEFORE" and "%PS_AFTER".')
        c.addPostScriptCommand('%PS_BEFORE', position=0)
        c.addPostScriptCommand('%PS_AFTER', position=2)

        c.save()
def run():
    styles = getSampleStyleSheet()
    styleN = styles["Normal"]
    styleH = styles["Heading1"]
    story = []

    # for codeNames in code
    story.append(Paragraph("I2of5", styleN))
    story.append(I2of5(1234, barWidth=inch * 0.02, checksum=0))
    story.append(Paragraph("MSI", styleN))
    story.append(MSI(1234))
    story.append(Paragraph("Codabar", styleN))
    story.append(Codabar("A012345B", barWidth=inch * 0.02))
    story.append(Paragraph("Code 11", styleN))
    story.append(Code11("01234545634563"))
    story.append(Paragraph("Code 39", styleN))
    story.append(Standard39("A012345B%R"))
    story.append(Paragraph("Extended Code 39", styleN))
    story.append(Extended39("A012345B}"))
    story.append(Paragraph("Code93", styleN))
    story.append(Standard93("CODE 93"))
    story.append(Paragraph("Extended Code93", styleN))
    story.append(Extended93("L@@K! Code 93 :-)"))  # , barWidth=0.005 * inch))
    story.append(Paragraph("Code 128", styleN))
    c = Code128("AB-12345678")  # , barWidth=0.005 * inch)
    # print 'WIDTH =', (c.width / inch), 'barWidth =', (c.barWidth / inch)
    # print 'LQ =', (c.lquiet / inch), 'RQ =', (c.rquiet / inch)
    story.append(c)
    story.append(Paragraph("USPS FIM", styleN))
    story.append(FIM("A"))
    story.append(Paragraph("USPS POSTNET", styleN))
    story.append(POSTNET("78247-1043"))
    story.append(Paragraph("USPS 4 State", styleN))
    story.append(USPS_4State("01234567094987654321", "01234567891"))

    from reportlab.graphics.barcode import createBarcodeDrawing

    story.append(Paragraph("EAN13", styleN))
    bcd = createBarcodeDrawing("EAN13", value="123456789012")
    story.append(bcd)
    story.append(Paragraph("EAN8", styleN))
    bcd = createBarcodeDrawing("EAN8", value="1234567")
    story.append(bcd)
    story.append(Paragraph("UPCA", styleN))
    bcd = createBarcodeDrawing("UPCA", value="03600029145")
    story.append(bcd)
    story.append(Paragraph("USPS_4State", styleN))
    bcd = createBarcodeDrawing("USPS_4State", value="01234567094987654321", routing="01234567891")
    story.append(bcd)

    story.append(Paragraph("Label Size", styleN))
    story.append(XBox((2.0 + 5.0 / 8.0) * inch, 1 * inch, '1x2-5/8"'))
    story.append(Paragraph("Label Size", styleN))
    story.append(XBox((1.75) * inch, 0.5 * inch, '1/2x1-3/4"'))
    c = Canvas("out.pdf")
    f = Frame(inch, inch, 6 * inch, 9 * inch, showBoundary=1)
    f.addFromList(story, c)
    c.save()
    print "saved out.pdf"