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()
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
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")
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
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)
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)
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()
def get_pdf(self): data = BytesIO() canvas = Canvas(data, pagesize=self.page_size) self._build_pdf(canvas) canvas.save() data.seek(0) return data
def run(infile, outfile): data = compile(infile) c = Canvas(outfile,pagesize=pageSize,pageCompression=0) lines(c) left = notes(c, data) c.showPage() c.save()
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
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 Marrakech: +212 6 89 91 77 20 """, styles['remarque'])], canvas) canvas.save()
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()
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)
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)
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()
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
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)
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()
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!'
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)
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()
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
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()
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()
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.")
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()
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® Acrobat® 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'
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()
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)
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()
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()
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'))
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))
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
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'
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)
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 = []
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')
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 )
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
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)
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')
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 : {GoodsName}<br/>Merek : {BrandName}<br/>Type : {Type}<br/> #ServiceTag/FA_Number : {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("( {} )".format(ToEmployee), self.helper.LABEL_STYLE), Paragraph("( {} )".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)
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()
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)
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"