示例#1
0
 def generateBarCode(self):
     if self.sku.text is None or self.sku.text is "" and self.skulist is None:
         self.errorLabel = "Please enter suvs or browse a file"
     else:
         skuarr = None
         inputStr = self.sku.text
         inputlist = inputStr.split(',')
         if self.barCodePath is None or self.barCodePath is "":
             self.errorLabel = "Go to settings and specify folder location to save the codes"
             return
         try:
             if self.skulist is not None:
                 skuarr = self.skulist
             else:
                 inputStr = self.sku.text
                 skuarr = inputStr.split(',')
             for s in skuarr:
                 str = self.now.strftime("%Y-%m-%d")
                 fullPath = self.barCodePath + '/' + str
                 if not os.path.exists(fullPath):
                     os.makedirs(fullPath)
                 code128.image(s).save(fullPath + "/" + s + ".png")
             if self.skulist is not None:
                 self.skulist = None
             self.errorLabel = "Done"
         except Exception as e:
             print(e)
             self.errorLabel = "Error in generating SKU's"
def generate_labels(prefix, start, end):
    for image in range(start, end + 1):
        code128.image(prefix.format(image),
                      height=238,
                      thickness=7,
                      quiet_zone=True).save("{0}{1}{2}.png".format(
                          prefix, path, image),
                                            compress_level=6)
示例#3
0
def main():
    """entry point for command line users"""
    
    parser = argparse.ArgumentParser()
    parser.add_argument("data", help="Data, that should be encoded")
    parser.add_argument("output", help="File to store the barcode")
    parser.add_argument("-H", "--height", default=100, type=int,
                        help="height of generated picture in pixel, default: 100")
    parser.add_argument("-T", "--thickness", default=3, type=int,
                        help="width of a bar with weight=1 in pixel, default: 3")
    parser.add_argument("-q", "--no_quiet", action="store_false", default=True,
                        help="Do not include the quiet zone "
                                    "before and after the code in the picture")    
    args = parser.parse_args()

    ftype = splitext(args.output)[1]
    suptypes =  ".bmp .dib .gif .im .jpg .jpe .jpeg .pcx .png .pbm " \
                ".pgm .ppm .tif .tiff .xbm .xpm .svg".split()

    if ftype == ".svg":
        print("Barcode '%s' created" % args.data)
        with open(args.output, "w") as f:
            f.write(code128.svg(args.data, args.height,
                                args.thickness, args.no_quiet))
        print("Barcode successfully saved as", args.output)

    elif ftype in suptypes:
        img = code128.image(args.data, args.height,
                                args.thickness, args.no_quiet)
        print("Barcode '%s' created" % args.data)
        img.save(args.output)
        print("Barcode successfully saved as", args.output)

    else: print("Type '%s' is not supportet, use one of these: %s" % (ftype,
                " ".join(suptypes)) )
示例#4
0
def generate_barcode(counter=0):
    """Generate the barcode, which shows a running counter and the current time.

    :param counter: sequence number to embed in the barcode
    :returns: tuple of
    * the incremented counter,
    * the data to display and
    * the filename of the saved barcode
    """

    now = datetime.datetime.now()
    timestr = now.strftime("%H:%M:%S.%f")
    data_to_display = "#%05d %s" % (counter, timestr)
    counter += 1
    # print(f"{data_to_display=}")

    pil_image = code128.image(data_to_display)

    # Resize the image to maximum 640x120
    maxsize = (640, 120)
    pil_image.thumbnail(maxsize, PIL.Image.ANTIALIAS)

    filename = 'generated_barcode.jpg'
    pil_image.save(filename)
    # qt_image = ImageQt.ImageQt(pil_image)      # Make it an QT image
    # pix = QPixmap.fromImage(qt_image)

    return counter, data_to_display, filename
示例#5
0
def make_barcode_image(guid):

    pdf_file = tempfile.NamedTemporaryFile()
    pdf_file.name += '.pdf'

    imgTemp = BytesIO()
    img = code128.image('%s%s' % (PREFIX, guid))

    options = {
        'page-width': '120mm',
        'page-height': '120mm',
        'encoding': "UTF-8"
    }

    img.save(imgTemp, format='PNG')

    sourceHtml = """
       <body style="text-align: center;">
           <div>
               <img style="inline" src='data:image/png;base64,{0}' />
           </div>
       </body>
    """.format(base64.b64encode(imgTemp.getvalue()).decode())
    pdfkit.from_string(sourceHtml, 'app/testpdf.pdf', options=options)
    pdfkit.from_string(sourceHtml, pdf_file.name, options=options)
    _send_barcodeimage_to_printer(pdf_file)
示例#6
0
def index(request):
    form = FormCodigo(request.POST)
    if form.is_valid():
        form_data = form.cleaned_data
        v_descripcion = form_data.get('descripcion')
        v_modelo = form_data.get("modelo")
        v_serial = form_data.get("serial")
        obj = Equipos.objects.create(descripcion=v_descripcion,
                                     modelo=v_modelo,
                                     serial=v_serial)
        ruta = r'static/imagen_codigo/'
        if not os.path.exists(ruta): os.makedirs(ruta)
        code128.image(v_descripcion + ' ' + v_modelo + ' ' +
                      v_serial).save(ruta + v_serial + ".png")
    context = {
        "el_form": form,
    }
    return render(request, "index.html", context)
示例#7
0
def generateBarcodes(country, number, protocol, dryrun=False):
    os.mkdir('TEMP')
    
    ctry = country[0].upper() 
    
    if not dryrun:
        usedcodes = [line.rstrip() for line in open('used_codes.txt')]
    
    combos = []
    for a1 in list(string.ascii_lowercase):
        for a2 in list(string.ascii_lowercase):
            for a3 in list(string.ascii_lowercase):
                combos.append(a1+a2+a3)
    
    if not dryrun:    
        cleancombos = [x for x in combos if x not in usedcodes]
    else:
        cleancombos = [x for x in combos]
        
    selectcombos = random.sample(cleancombos, int(number))
                
    barcodes = []
    
    if protocol=='Eplot':
        for i in selectcombos:
            for d in ['1', '2', '3', '4']:
                barcode = ctry + '-' + i + '-' + d
                barcodes.append(barcode)
    
    elif protocol=='FFS':
        for i in selectcombos:
            barcode = ctry + '-' + i
            barcodes.append(barcode)
    
    if not dryrun:
        f = open('used_codes.txt', 'a')
        for i in selectcombos:
            f.write(i + '\n')
        f.close()
        
    for b in barcodes:
        code128.image(b).save('TEMP/' + b + '.png')
        
    return barcodes
示例#8
0
def SendEmail(request):
    if request.method == "GET":
        bar_code = request.GET.get('bar_code')
        code128.image(bar_code).save(
            os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +
            "/static/svg/" + bar_code + ".png")
        bar_code = BarCodes.objects.filter(bar_code=bar_code,
                                           code__isnull=False)[0]
        ctx = {
            'message': 'success',
            'code': bar_code.bar_code,
            'server_name': settings.SERVER_NAME,
            'valid_till': bar_code.valid_till,
        }
        message = render_to_string('email.html', ctx)
        email_message = EmailMessage("Coupon Details", message,
                                     settings.DEFAULT_FROM_EMAIL,
                                     [bar_code.code.email_address])
        email_message.content_subtype = 'html'
        email_message.send(fail_silently=True)
        return HttpResponse(json.dumps({'msg': 'sucess'}),
                            content_type="application/json")
示例#9
0
    def form_valid(self, form):
        self.object = form.save(commit=False)
        name_bar_code_extension = str(self.object.code) + ".png"
        img = code128.image(self.object.code)
        f = open(name_bar_code_extension, "wb")
        img.save(name_bar_code_extension)
        f.close()
        reopen = open(name_bar_code_extension, "rb")
        django_file = File(reopen)
        self.object.bar_code.save(name_bar_code_extension,
                                  django_file,
                                  save=True)
        reopen.close()
        self.object.save()
        os.remove(name_bar_code_extension)

        return super(BarCodeCreateView, self).form_valid(form)
示例#10
0
def barcode_factory(address, nonce):
    return code128.image("(" + str(address) + "," + str(nonce) + ")")
示例#11
0
    def generate_code128(self, part, data):

        code128.image(data).save(part + self.name + ".png")  # with PIL present
示例#12
0
def cApply():
    global result, T, photo

    result = code128.image(T.get("1.0", 'end-1c'))
    photo = scaleImage(result.convert("RGB"))
    updateDisplay()
示例#13
0
def generate(data):
    """Generates barcode from parsed data."""
    return code128.image(data).save("utils/temp/barcode.png")
示例#14
0
from PIL import Image, ImageDraw, ImageFont
import re

with open('roll.txt', 'r') as roll:
    for i in roll:
        i = i.strip().strip('\n')
        '''i_lst=list(i)
		fstN=re.findall(r'\d',i)[0]
		pstn=i_lst.index(fstN)
		i_lst.insert(pstn,'1')
		i_new=''.join(i_lst)
		print (i_new)'''

        #code128.image("LX14164152").save("LX14164152.jpg")
        ttfont = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", 20)
        bar = code128.image(i)
        org_width, org_height = bar.size
        print(org_width, ' ', org_height)

        new_im = Image.new("RGB", (org_width, org_height + 90),
                           "white")  #396,200
        new_im.paste(bar, (0, 35))  #30
        draw = ImageDraw.Draw(new_im)
        w, h = draw.textsize(i, font=ttfont)
        draw.text((org_width / 2 - w / 2, org_height + 50),
                  i,
                  fill="black",
                  font=ttfont)
        #new_im.show()
        new_im.save('%s.jpg' % i)
示例#15
0
# -*- coding: utf-8 -*-
# @Time    : 2019/7/23 16:51
# @Author  : Yo
# @Email   : [email protected]
# @File    : createcode128png.py
# @Software: PyCharm
# @models: ..
# @function: ...
# @Git: https://gitee.com/m7n9/PyCharm.git
# @Edit: yo

import code128

with open("code.txt", 'r', encoding='utf-8') as f:
    y = f.read()

for i in y.split("\n"):
    print(i)
    if len(i):
        file = "./code/{}.png".format(i)
        code128.image(str(i)).save(file)  # with PIL present
示例#16
0
# -*- coding: utf-8 -*-
# @Time    : 2019/7/23 16:46
# @Author  : Yo
# @Email   : [email protected]
# @File    : code128demo.py
# @Software: PyCharm
# @models: ..
# @function: ...
# @Git: https://gitee.com/m7n9/PyCharm.git
# @Edit: yo

import code128

code128.image("CUKe3DGg").save("Hello World.png")  # with PIL present
#
with open("Hello World.svg", "w") as f:
    f.write(code128.svg("Hello World"))
示例#17
0
    def render(self):
        #logging.INFO('rendering '+str(self.barcode.value))

        refdict = self.dicts[self.type]
        self.tag = Image.new('RGB', self.imsize, color="White")
        self.dr = ImageDraw.Draw(self.tag)
        if self.barcode.value != '':

            bar = code128.image(
                self.barcode.value,
                thickness=round(self.res / 100 *
                                refdict['barcode']['shape'][0]),
                height=round(self.res / 100 * refdict['barcode']['shape'][1]))
            bar = bar.convert('RGB')  #convert to RGB just in case
            bar = bar.rotate(refdict['barcode']['rot'], expand=1)
            #paste barcode onto canvas
            barbox = [
                round(dyn_look(self, "barcode.pos")[0]),
                round(dyn_look(self, "barcode.pos")[1]), 0, 0
            ]
            barbox[2] = barbox[0] + bar.size[0]
            barbox[3] = barbox[1] + bar.size[1]
            self.tag.paste(bar, barbox)

        #go through all the ones that have font defined and make that text
        for attrs in refdict.T['font'].dropna().keys():
            attr = getattr(self, attrs)
            if str(attrs) == 'combo':
                if 'combo' in self.spec.types:  #if this barcode has C in it, then allow the combo value to be set from the window
                    try:
                        print(self.combo.value)

                    except:
                        print('no combo set')
                else:  #not in barcode, nothing happens on tag
                    self.combo.value = ''

            if str(attrs) == 'underbar':
                if refdict['barcode'][
                        'underbar'] == True and self.barcode.value != '':  #if underbar is shown for this tag style

                    attr.pos = [
                        round((barbox[2] + barbox[0]) / 2),
                        round(barbox[3] + self.res / 100 *
                              refdict['underbar']['underdist'])
                    ]

                    #print('set'+str(self.underbar.pos))
                else:
                    #print('broke')
                    break
            elif str(
                    attrs
            ) == 'price':  #puts price in right format, this is rly thrown together needs to b better (only changes if tag is actualized)
                try:  #if it can be turned into a float make it into dollars
                    setattr(attr, 'value',
                            '$%.2f' % float(getattr(attr, 'value')))
                except ValueError:  #else it's already been done
                    pass

            attag = Image.new('L', self.imsize, color="White")
            d = ImageDraw.Draw(attag)
            #print(attrs) #useful for debugging
            try:

                attsize = ImageDraw.ImageDraw.multiline_textsize(
                    d, text=str(attr.value), font=getattr(attr, "font"))
                if attsize > self.imsize:
                    #attr.value=str(attr.value.split(' ')
                    #attsize=ImageDraw.ImageDraw.multiline_textsize(d,text=str(attr.value), ffont=getattr(attr,"font"))
                    print('too big' + str(attsize))

                variableprice = True  #need to include varprice from csv

                if attrs == 'price' and self.price.value == "$0.00" and variableprice:
                    attsize = ImageDraw.ImageDraw.multiline_textsize(
                        d, text='$__.00', font=getattr(attr, "font"))
                    aftsize = ImageDraw.ImageDraw.textsize(d,
                                                           text='.00',
                                                           font=getattr(
                                                               attr, "font"))
                    dolsize = ImageDraw.ImageDraw.textsize(d,
                                                           text='$',
                                                           font=getattr(
                                                               attr, "font"))
                    d.line((dolsize[0], attsize[1], attsize[0] - aftsize[0],
                            attsize[1]),
                           width=10)
                    d.text([0, 0], text='$__.00', font=getattr(attr, "font"))
                else:
                    d.multiline_text([0, 0],
                                     text=str(getattr(attr, 'value')),
                                     font=getattr(attr, "font"))

                attbox = [0, 0]
                attbox.append(attbox[0] + attsize[0])
                attbox.append(attbox[1] + attsize[1])
                box = [
                    round(dyn_look(attr, "pos")[i] - attsize[i] / 2)
                    for i in [0, 1]
                ]
                box.append(box[0] + attsize[0])
                box.append(box[1] + attsize[1])

                self.tag.paste(attag.crop(attbox),
                               box,
                               mask=ImageOps.invert(attag.crop(attbox)))
            except:
                pass
            # self.dr.text([dyn_look(self,"month.pos")[i].get() for i in [0,1]],str(self.month.get()),0,font=dyn_look(self,"month.font"))

        return self.tag
示例#18
0
 def _save_barcode(self, address, nonce):
     barcode = code128.image(str(address) + "," + str(nonce))
     factor = 4
     barcode = barcode.resize(
         (int(barcode.width * factor), int(barcode.height * factor)))
     barcode.save(str(BAR_CODE_FILE_PATH))
示例#19
0
def soldTag(res=100, n=(2,6),lbl=None,side='oldsold-front',orientation='portrait',**kw):
    o=ORIENTATIONS[orientation]
    relres=res/100
    tagsize=(round(res*o[0]/n[0]),round(res*o[1]/n[1]))    
    tag=Image.new('L',tagsize,color="white")
    dtag=ImageDraw.Draw(tag)
    if 'lbl' in TEMPLATES[side].keys():
        TEMPLATES[side]['lbl'][0]['text']=str(lbl)
    def centertext(d,justify='center',line=0,autopar=False):        
      
        for att in d:
            if 'c' in att.keys():
                locrat=att['c']
    
                font=ImageFont.truetype(att['font'][0],round(att['font'][1]*relres))
                attsize=ImageDraw.ImageDraw.multiline_textsize(dtag,text=att['text'], font=font)
    
                if justify=='center':
                    justamt=[.5*i for i in attsize]
                elif justify=='left':
                    justamt=(attsize[0]/2,0)
                loc=[round((tagsize[i]*locrat[i]-justamt[i])) for i in range(2)]
                dtag.multiline_text(loc,att['text'],anchor='center',font=font)#takes the size of the tag, multiplies it by location ratio, then subtracts pixelsize of text - needed bc default action of text is to go from top-left corner, this ends up doing from the center
                if 'bar' in att.keys():
                    if att['bar'][0]=='after':
                        barloc=(loc[0]+attsize[0],loc[1]+attsize[1])
                        lineloc=(barloc[0],barloc[1],(barloc[0]+10*relres*att['bar'][1]),barloc[1])
                    dtag.line(lineloc)
                #add line here


    if side.upper() in TEMPLATES.keys():
        if side.upper()=='NEWSOLD':
            corns=((.025,.05),(.975,.95))
            coords=[round(tagsize[i]*corns[j][i]) for j in range(2) for i in range(2)]
            logo=Image.open(os.path.join(wd,"Logo","NewLogoCentered.png"))
            tag.paste(logo.resize((round(tagsize[0]/2),round(tagsize[1]/(8)))),(round(tagsize[0]/4),round(tagsize[1]*.05)))
            dtag.rectangle(coords,width=2,outline='black')
        elif side.upper()in ['FURN','TAG']:
            s=side.upper()
            if 'price' in kw.keys():
                PR=TEMPLATES[s]['price'][0]
                p=kw['price']
                try:
                    P="%.2f" %round(float(p),2)
                    PR['text']='$'+P
                except:#not a number
                    print('whoops')
                centertext(TEMPLATES[s]['price'])
            if 'barcode' in kw.keys():
                BC=TEMPLATES[s]['barcode'][0]
                BC['code']=kw['barcode']
                bar=code128.image(BC['code'],thickness=round(relres*BC['shape'][0]),height=round(relres*BC['shape'][1]))
                bar=bar.convert('RGB') #convert to RGB just in case
                bar=bar.rotate(BC['rot'],expand=1) 
            #paste barcode onto canvas
                barbox=[round(BC['c'][0]*tag.size[0]),round(BC['c'][1]*tag.size[1]),0,0]
                barbox[2]=barbox[0]+bar.size[0]
                barbox[3]=barbox[1]+bar.size[1]
                tag.paste(bar,barbox)
            if 'category' in kw.keys():
                if 'category' in TEMPLATES[s].keys():
                    CT=TEMPLATES[s]['category'][0]
                    CT['text']=kw['category']
        for t in TEMPLATES[side.upper()].keys():
            for field in TEMPLATES[side.upper()][t]:
                if 'text' in field.keys():
                    centertext(TEMPLATES[side.upper()][t])
        
#    else:
#        print(side)
#    if side=='front':
#        frnt=TEMPLATES['FRONT']
##        centertext(frnt['fs'],  font=) 
##        centertext(frnt['fyn'],  font=)
##        centertext(frnt['frontbtm'],  )
##        centertext(frnt['frontfields'],  font=ImageFont.truetype(ubuntum,12))
#        centertext(frnt['lbltxt'],  font=ImageFont.truetype(ubuntum,15))
#    elif side=='back':
#        bck=TEMPLATES['BACK']
#        centertext(bck['backmgmt'],  font=ImageFont.truetype(ubuntum,9),justify='center') 
#        centertext(bck['backfields'],  font=ImageFont.truetype(ubuntum,9),justify='center') 
#        centertext(bck['backblurb'],  font=ImageFont.truetype(ubuntum,9),justify='center') 
#        
        
    else:
        return None
    
    
    return tag 
示例#20
0
def stickers_simple(col = 3, rows = 7, skip = 0, comp = [], store = None, pozice = None):
    page = 0
    page_cols = col
    page_rows = rows
    page_cells = page_cols * page_rows
    cell_w = 210/page_cols
    cell_h = 297/page_rows

    stock_identificator = store

    print ("pozadovany format je 70x42")
    pdf = FPDF('P', 'mm', format='A4')

    pdf.add_font('pt_sans', '', 'static/pt_sans/PT_Sans-Web-Regular.ttf', uni=True)
    pdf.add_font('pt_sans-bold', '', 'static/pt_sans/PT_Sans-Web-Bold.ttf', uni=True)
    pdf.set_font('pt_sans-bold', '', 12)

    pdf.set_auto_page_break(False)
    pdf.add_page()

    for i, component in enumerate(comp):
        i += skip
        #   id = component['name'].strip().replace('/', '_')
        id = str(component['_id'])
        barcode = str(int(id, 16))
        code128.image(barcode).save("static/tmp/barcode/%s.png"%(id))

        if i != 0 and i%(page_cells) == 0:
            page += 1
            pdf.add_page()
            print("New PAGE --- ", i, i%page_cells)

        row = int(i/page_cols)-page*page_rows
        column = i%page_cols
        cell_x = column*cell_w
        cell_y = row*cell_h

        pdf.set_xy(cell_x+3, cell_y+6.75)
        if len(component['name'])<23:
            pdf.set_font('pt_sans-bold', '', 14)
        else:
            pdf.set_font('pt_sans-bold', '', 10)
        pdf.cell(cell_w-10, 0, component['name'][:35])
        pdf.set_xy(cell_x+1, cell_y+9)
        pdf.image('static/tmp/barcode/%s.png'%(id), w = cell_w-2, h=6)

        pdf.set_font('pt_sans', '', 9.5)
        pdf.set_xy(cell_x+3, cell_y+22)
        try:
            pdf.multi_cell(cell_w-6, 3.4, component['description'][:190])
        except Exception as e:
            pdf.multi_cell(cell_w-10, 5, "ERR" + repr(e))

        #pdf.set_xy(cell_x+3, cell_y+12)
        #pdf.set_font('pt_sans', '', 7.5)
        #pdf.cell(cell_w-10, 10, id + " | " + str(datetime.date.today()) )

        pos = pozice(bson.ObjectId(id), stock = stock_identificator['_id'], primary = True)
        if len(pos) > 0:
            pos = pos[0]['info'][0]['name']
            print("POZ", pos)
        else:
            pos = ""
        pdf.set_font('pt_sans', '', 7.5)
        #pdf.set_xy(cell_x+3, cell_y+15)
        #pdf.cell(cell_w-10, 10, str(stock_identificator['code']) + " | " + str(pos) + " | " + ','.join(component['category']))

        pdf.set_xy(cell_x+3, cell_y+12)
        pdf.cell(cell_w-10, 10, str(datetime.date.today()) + " | " + ','.join(component['category']))

        pdf.set_xy(cell_x+3, cell_y+15)
        pdf.cell(cell_w-10, 10, str(stock_identificator['code']) + " | " + str(pos))

        print("Generovani pozice...")
    return pdf
示例#21
0
    def get(self, data = None):
        out_type = self.get_argument('type', 'html')
        components = []
        components = self.get_query_arguments('action[]', [])
        multiply = int(self.get_argument('multiply', 5))
        layout = self.get_argument('template', '70x40_simple')
        skip = int(self.get_argument('skip', 0))
        #print("Soucastky..",components)
        if len(components) > 0:
            comp = list(self.mdb.stock.find({'_id' : {'$in' : components}}))
        else:
            comp = list(self.mdb.stock.find().sort([("category", 1), ("_id",1)]))
        page = 0
        #print("Budeme tisknout:", comp)

        if layout == 'souhrn_01':
            autori = self.get_query_argument('autor', None)
            if not autori: autori = ['autory vlozite pridanim autoru do adresy s parametrem "autor"', 'autoru muze byt vice, pouzijte vice parametru', 'Například pridanim tohoto na konec adresy: &autor=Tester První']
            datum = self.get_argument('datum', ">>pro specifikovani pridejte parametr 'datum' do GET parametru<<")
            page = 1
            money_sum = 0
            Err = []

            print ("pozadovany format je:", layout)
            pdf = FPDF('P', 'mm', format='A4')
            pdf.set_auto_page_break(False)

            pdf.add_font('pt_sans', '', 'static/pt_sans/PT_Sans-Web-Regular.ttf', uni=True)
            pdf.add_font('pt_sans-bold', '', 'static/pt_sans/PT_Sans-Web-Bold.ttf', uni=True)
            pdf.set_font('pt_sans', '', 12)
            pdf.add_page()

            pdf.set_xy(0, 40)
            pdf.cell(pdf.w, 0, 'Celkový přehled skladu', align='C', ln=2)
            pdf.set_xy(0, 46)
            pdf.cell(pdf.w, 0, 'Universal Scientific Technologies s.r.o.', align='C', ln=2)

            pdf.set_xy(20, 200)
            pdf.cell(1,0, 'Inventuru provedli:', ln=2)
            for x in autori:
                pdf.cell(1,20, x, ln=2)

            pdf.set_font('pt_sans', '', 8)
            pdf.set_xy(120, 288)
            pdf.cell(10, 0, "Generováno %s, strana %s z %s" %(datetime.datetime.now(), page, pdf.alias_nb_pages()) )

            pdf.add_page()


            data = self.mdb.stock.aggregate([
                    {'$addFields': {'count': {'$sum': '$history.bilance'}}}
                ])


            gen_time = datetime.datetime(2018, 10, 1)
            lastOid = ObjectId.from_datetime(gen_time)


            for i, component in enumerate(data):
            #for i, component in enumerate(list(data)[:30]):
                print(i, "=============================")
                print(component['_id'])
                try:
                    ## Pokud je konec stránky
                    if pdf.get_y() > pdf.h-20:
                        pdf.line(10, pdf.get_y()+0.5, pdf.w-10, pdf.get_y()+0.5)

                        pdf.set_font('pt_sans', '', 10)
                        pdf.set_xy(150, pdf.get_y()+1)
                        pdf.cell(100, 5, 'Součet strany: {:6.2f} Kč'.format(page_sum))

                        pdf.add_page()

                    ## Pokud je nová strana
                    if page != pdf.page_no():
                        pdf.set_font('pt_sans', '', 8)
                        page = pdf.page_no()
                        pdf.set_xy(120, 288)
                        pdf.cell(10, 0, "Generováno %s, strana %s z %s" %(datetime.datetime.now(), page, pdf.alias_nb_pages()) )

                        pdf.set_font('pt_sans', '', 11)
                        pdf.set_xy(10, 10)
                        pdf.cell(100, 5, 'Skladová položka')
                        pdf.set_x(95)
                        pdf.cell(10, 5, "Počet kusů", align='R')
                        pdf.set_x(120)
                        pdf.cell(10, 5, "Cena za 1ks", align='R')
                        pdf.set_x(180)
                        pdf.cell(10, 5, "Cena položky (bez DPH)", align='R', ln=2)
                        pdf.line(10, 15, pdf.w-10, 15)
                        pdf.set_y(18)
                        page_sum = 0

                    pdf.set_font('pt_sans', '', 10)

                    count = component['count']

                    if count >0:
                        price = 0
                        price_ks = 0
                        first_price = 0


                        pdf.set_x(10)
                        pdf.cell(100, 5, component['_id'])

                        pdf.set_x(95)
                        pdf.cell(10, 5, "%5.d" %(count), align='R')

                    pdf.set_x(10)
                    pdf.cell(100, 5, "{:5.0f}  {}".format(i, component['_id']))


                    inventura = False
                    for x in reversed(component.get('history', [])):
                        if x.get('operation', None) == 'inventory':
                            print("inventura", x)
                            if x['_id'].generation_time > lastOid.generation_time:
                                print("#############")
                                inventura = True
                                count = x['absolute']

                                pdf.set_x(110)
                                pdf.cell(1, 5, "i")
                                break;

                    pdf.set_font('pt_sans', '', 10)
                    pdf.set_x(95)
                    pdf.cell(10, 5, "{} j".format(count), align='R')

                    rest = count

                    for x in reversed(component.get('history', [])):

                        if x.get('price', 0) > 0:
                            if first_price == 0:
                                first_price = x['price']
                            if x['bilance'] > 0:
                                if x['bilance'] <= rest:
                                    price += x['price']*x['bilance']
                                    rest -= x['bilance']
                                else:
                                    price += x['price']*rest
                                    rest = 0

                    print("Zbývá", rest, "ks, secteno", count-rest, "za cenu", price)
                    if(count-rest): price += rest*first_price
                    money_sum += price
                    page_sum +=price

                    if price == 0.0 and x.get('count', 0) > 0:
                        Err.append('Polozka >%s< nulová cena, nenulový počet' %(component['_id']))

                    pdf.set_x(120)
                    if count > 0: pdf.cell(10, 5, "%6.2f Kč" %(price/count), align='R')
                    else: pdf.cell(10, 5, "%6.2f Kč" %(0), align='R')

                    pdf.set_font('pt_sans-bold', '', 10)
                    pdf.set_x(180)
                    pdf.cell(10, 5, "%6.2f Kč" %(price), align='R')


                except Exception as e:
                    Err.append('Err' + repr(e) + component['_id'])
                    print(e)

                pdf.set_y(pdf.get_y()+4)

            pdf.line(10, pdf.get_y(), pdf.w-10, pdf.get_y())
            pdf.set_font('pt_sans', '', 8)
            pdf.set_x(180)
            pdf.cell(10, 5, "Konec souhrnu", align='R')

            pdf.set_font('pt_sans', '', 10)
            pdf.set_xy(150, pdf.get_y()+3)
            pdf.cell(100, 5, 'Součet strany: {:6.2f} Kč'.format(page_sum))

            pdf.page = 1
            pdf.set_xy(20,175)
            pdf.set_font('pt_sans', '', 12)
            pdf.cell(20,20, "Cena skladových zásob k %s je %0.2f Kč (bez DPH)" %(datum, money_sum))
            if len(Err) > 0:
                pdf.set_xy(30,80)
                pdf.cell(1,6,"Pozor, chyby ve skladu:", ln=2)
                pdf.set_x(32)
                for ch in Err:
                    pdf.cell(1,5,ch,ln=2)
            pdf.page = page

            print(autori)



        if layout == '105x74_simple':
            page = 0
            page_cols = 2
            page_rows = 4
            page_cells = page_cols * page_rows
            cell_w = 105
            cell_h = 75

            print ("pozadovany format je:", layout)
            pdf = FPDF('P', 'mm', format='A4')

            pdf.add_font('pt_sans', '', 'static/pt_sans/PT_Sans-Web-Regular.ttf', uni=True)
            pdf.add_font('pt_sans-bold', '', 'static/pt_sans/PT_Sans-Web-Bold.ttf', uni=True)
            pdf.set_font('pt_sans-bold', '', 12)

            pdf.set_auto_page_break(False)
            pdf.add_page()

            for i, component in enumerate(comp):
                i += skip
                id = component['_id'].strip().replace('/', '')
                code128.image(component['_id']).save("static/barcode/%s.png"%(id))

                if i != 0 and i%(page_cells) == 0:
                    page += 1
                    pdf.add_page()
                    print("New PAGE --- ", i, i%page_cells)

                row = int(i/page_cols)-page*page_rows
                column = i%page_cols
                cell_x = column*cell_w
                cell_y = row*cell_h

                print(component)
                pdf.set_font('pt_sans-bold', '', 14)
                pdf.set_xy(cell_x+5, cell_y+5)
                pdf.cell(cell_w-10, 0, component['_id'])
                pdf.set_xy(cell_x, cell_y+10)
                pdf.image('static/barcode/%s.png'%(id), w = cell_w, h=10)

                pdf.set_font('pt_sans', '', 11)
                pdf.set_xy(cell_x+5, cell_y+23)
                try:
                    pdf.multi_cell(cell_w-10, 5, component['description'])
                except Exception as e:
                    pdf.multi_cell(cell_w-10, 5, "ERR" + repr(e))


                pdf.set_xy(cell_x+5, cell_y+cell_h-15)
                pdf.set_font('pt_sans', '', 8)
                pdf.cell(cell_w-10, 10, ', '.join(component['category']) + "  |  " + str(datetime.datetime.now()) + "  |  " + "UST")


        if layout == '70x42-3_simple':
            page = 0
            page_cols = 3
            page_rows = 7
            page_cells = page_cols * page_rows
            cell_w = 210/page_cols
            cell_h = 297/page_rows


            print ("pozadovany format je:", layout)
            pdf = FPDF('P', 'mm', format='A4')

            pdf.add_font('pt_sans', '', 'static/pt_sans/PT_Sans-Web-Regular.ttf', uni=True)
            pdf.add_font('pt_sans-bold', '', 'static/pt_sans/PT_Sans-Web-Bold.ttf', uni=True)
            pdf.set_font('pt_sans-bold', '', 12)

            pdf.set_auto_page_break(False)
            pdf.add_page()

            for i, component in enumerate(comp):
                i += skip
                id = component['name'].strip().replace('/', '_')
                code128.image(component['_id']).save("static/barcode/%s.png"%(id))

                if i != 0 and i%(page_cells) == 0:
                    page += 1
                    pdf.add_page()
                    print("New PAGE --- ", i, i%page_cells)

                row = int(i/page_cols)-page*page_rows
                column = i%page_cols
                cell_x = column*cell_w
                cell_y = row*cell_h

                pdf.set_xy(cell_x+5, cell_y+6.75)
                if len(component['name'])<23:
                    pdf.set_font('pt_sans-bold', '', 14)
                else:
                    pdf.set_font('pt_sans-bold', '', 10)
                pdf.cell(cell_w-10, 0, component['name'][:35])
                pdf.set_xy(cell_x+2.5, cell_y+9)
                pdf.image('static/barcode/%s.png'%(id), w = cell_w-5, h=7)

                pdf.set_font('pt_sans', '', 11)
                pdf.set_xy(cell_x+4, cell_y+20)
                try:
                    pdf.multi_cell(cell_w-8, 4, component['description'][:185])
                except Exception as e:
                    pdf.multi_cell(cell_w-10, 5, "ERR" + repr(e))


                pdf.set_xy(cell_x+5, cell_y+cell_h-7)
                pdf.set_xy(cell_x+5, cell_y+13)
                pdf.set_font('pt_sans', '', 7.5)
                pdf.cell(cell_w-10, 10, ', '.join(component['category']) + " |" + str(datetime.date.today()) + "| " + component['_id'])



        if layout == '105x48_simple':
            page = 0
            page_cols = 2
            page_rows = 6
            page_cells = page_cols * page_rows
            #cell_w = 105
            #cell_h = 48
            cell_w = 210/page_cols
            cell_h = 297/page_rows

            print ("pozadovany format je:", layout)
            pdf = FPDF('P', 'mm', format='A4')

            pdf.add_font('pt_sans', '', 'static/pt_sans/PT_Sans-Web-Regular.ttf', uni=True)
            pdf.add_font('pt_sans-bold', '', 'static/pt_sans/PT_Sans-Web-Bold.ttf', uni=True)
            pdf.set_font('pt_sans-bold', '', 12)

            pdf.set_auto_page_break(False)
            pdf.add_page()

            for i, component in enumerate(comp):
                i += skip
                id = component['_id'].strip().replace('/', '')
                code128.image(component['_id']).save("static/barcode/%s.png"%(id))

                if i != 0 and i%(page_cells) == 0:
                    page += 1
                    pdf.add_page()
                    print("New PAGE --- ", i, i%page_cells)

                row = int(i/page_cols)-page*page_rows
                column = i%page_cols
                cell_x = column*cell_w
                cell_y = row*cell_h

                print(component)
                pdf.set_font('pt_sans-bold', '', 14)
                pdf.set_xy(cell_x+5, cell_y+5)
                pdf.cell(cell_w-10, 0, component['_id'])
                pdf.set_xy(cell_x, cell_y+10)
                pdf.image('static/barcode/%s.png'%(id), w = cell_w, h=10)

                pdf.set_font('pt_sans', '', 10)
                pdf.set_xy(cell_x+5, cell_y+20)
                try:
                    pdf.multi_cell(cell_w-10, 4, component['description'][:275])
                except Exception as e:
                    pdf.multi_cell(cell_w-10, 4, "ERR" + repr(e))


                pdf.set_xy(cell_x+5, cell_y+cell_h-10)
                pdf.set_font('pt_sans', '', 8)
                pdf.cell(cell_w-10, 10, ', '.join(component['category']) + "  |  " + str(datetime.datetime.now()) + "  |  " + "UST")


        elif layout == '105x48_panorama':
            page = 0
            page_cols = 6
            page_rows = 2
            page_cells = page_cols * page_rows
            cell_w = 48
            cell_h = 105

            print ("pozadovany format je:", layout)
            pdf = FPDF('L', 'mm', format='A4')

            pdf.add_font('pt_sans', '', 'static/pt_sans/PT_Sans-Web-Regular.ttf', uni=True)
            pdf.add_font('pt_sans-bold', '', 'static/pt_sans/PT_Sans-Web-Bold.ttf', uni=True)
            pdf.set_font('pt_sans-bold', '', 12)

            pdf.set_auto_page_break(False)
            pdf.add_page()

            for i, component in enumerate(comp):
                i += skip
                id = component['_id'].strip().replace('/', '')
                code128.image(component['_id']).save("static/barcode/%s.png"%(id))

                if i != 0 and i%(page_cells) == 0:
                    page += 1
                    pdf.add_page()
                    print("New PAGE --- ", i, i%page_cells)

                row = int(i/page_cols)-page*page_rows
                column = i%page_cols
                cell_x = column*cell_w
                cell_y = row*cell_h

                print(component)
                pdf.set_font('pt_sans-bold', '', 14)
                pdf.set_xy(cell_x+5, cell_y+5)
                pdf.cell(cell_w-10, 0, component['_id'])
                pdf.set_xy(cell_x, cell_y+cell_h)
                pdf.rotate(90)
                pdf.image('static/barcode/%s.png'%(id), w = cell_h-5, h=10)
                pdf.rotate(0)

                pdf.set_font('pt_sans', '', 11)
                pdf.set_xy(cell_x+8, cell_y+20)
                try:
                    pdf.multi_cell(cell_w-10, 5, component['description'])
                except Exception as e:
                    pdf.multi_cell(cell_w-10, 5, "ERR" + repr(e))


                pdf.set_xy(cell_x+5, cell_y+cell_h-15)
                pdf.set_font('pt_sans', '', 8)
                pdf.cell(cell_w-10, 10, ', '.join(component['category']) + "  |  " + str(datetime.datetime.now()) + "  |  " + "UST")



        pdf.output("static/tmp/sestava.pdf")
        with open('static/tmp/sestava.pdf', 'rb') as f:
            self.set_header("Content-Type", 'application/pdf; charset="utf-8"')
            self.set_header("Content-Disposition", "inline; filename=UST_tiskova_sestava.pdf")
            self.write(f.read())
        f.close()