def analyze_papersize(pdf): """ Функция возвращает словарь: {номер страницы: машина, ширина листа, высота листа} Если файл не Сигновский, нет инфы о страницах, - то возвращается None :param pdf: объект pdf :return papersizes: dict """ if pdf.marks: machine_mark_name, machine_mark_regex = detect_mark(settings.MARKS_MACHINE, pdf.marks) paper_mark_name, paper_mark_regex = detect_mark(settings.MARKS_PAPER, pdf.marks) papersizes = {} for page, piece_info in pdf.marks.items(): page_number = page + 1 # `piece_info['Machine']` возвращает список: (u'Выведено: Speedmaster', 'pssMO14_1', 'TextMark') # далее regex извлекает нужную нам часть метки, - имя машины или размеры бумаги try: machine = re.findall(machine_mark_regex, piece_info[machine_mark_name][0])[0] except KeyError: logger.warning('Страница {} не содержит cигновской метки {}'.format(page_number, machine_mark_name)) machine = None try: paper = re.findall(paper_mark_regex, piece_info[paper_mark_name][0])[0] paper_w = int(round(float(paper[0].replace(',', '.')))) paper_h = int(round(float(paper[1].replace(',', '.')))) except KeyError: logger.warning('Страница {} не содержит cигновской метки {}'.format(page_number, paper_mark_name)) paper_w, paper_h = None, None #logger.info(page_number, machine.encode('utf-8'), paper) papersizes[page_number] = (machine, paper_w, paper_h) else: papersizes = None return papersizes
def detect_ctpbureau(pdf): """ Возвращает объект, соответствующий подрядчику вывода форм. :param pdf: объект pdf :return: outputter (instance of FTP_server) """ logger.info('――> Detect ctp bureau') try: # # Try detect via signa marks # outputter_mark_name, outputter_mark_regex = detect_mark(settings.MARKS_OUTPUTTER, pdf.marks) extracted_text = pdf.marks[0][outputter_mark_name][0] mark_content = re.findall(outputter_mark_regex, extracted_text)[0] # Может быть такое, что файл содержит сигна-метку, но она пустая, или по какой-то причине # выводильщика не удалось определить. Тогда возникает IndexError и выводильщик определяется по имени файла # if not mark_content: # raise TypeError for bureau in Ctpbureau.objects.all(): if bureau.name.lower() == mark_content.lower(): outputter = bureau except (TypeError, IndexError): # # try detect via filename # fname, fext = os.path.splitext(pdf.name) # Тут нужен unicode, потому что имя файла может содержать русские буквы, # и будет лажа при сравнении типа str (fname) с типом unicode (Outputter.objects.all()) parts = fname.decode('UTF-8').lower().split("_") for bureau in Ctpbureau.objects.all(): if bureau.name.lower() in parts: outputter = bureau if 'outputter' in locals(): logger.info('····detected: {}\n'.format(outputter)) else: logger.error('····FAILED: Outputter cant be detected.\nExit!') exit() return outputter
def analyze_machine(pdf): """ Функция определяет печатную машину. Возвращиет словарь, в котором ключ - номер страницы, значение - объект типа PrintingPress :param pdf: объект pdf :return: machine - словарь или None, если не удалось определить """ logger.info('\n') logger.info('――> Detect machine') machines = {} if pdf.marks: logger.info('····detecting by signa mark') machine_mark_name, machine_mark_regex = detect_mark(settings.MARKS_MACHINE, pdf.marks) for page, piece_info in pdf.marks.items(): page_number = page + 1 # `piece_info['Machine']` возвращает список: (u'Выведено: Speedmaster', 'pssMO14_1', 'TextMark') # далее regex извлекает нужную нам часть метки try: machine_mark_text = re.findall(machine_mark_regex, piece_info[machine_mark_name][0])[0] except KeyError: logger.warning('····Страница {} не содержит cигновской метки {}'.format(page_number, machine_mark_name)) machine = None if 'machine_mark_text' in locals(): for press in PrintingPress.objects.all(): if press.name == machine_mark_text: machine = press if 'machine' in locals(): machines[page_number] = machine else: machines[page_number] = None else: logger.info('····signa mark missed, trying detect by plate size') # Если первый способ провалился, пробуем определить машину, основываясь на размере пластины. # Тут есть проблема - что делать с двумя машинами с одинаковыми форматами, например Speedmaster и FS_Speedmaster? # Пока в голову приходит только прибить гвоздями определенные машины, по одной для каждого формата пластин. # В будущем можно добавить поле какое-то в базу, типа приоритета. # TODO прибито гвоздями. Хотя, это все равно обходное решение в отсутствии сигна-метки. primary_machines = PrintingPress.objects.filter(name__in=['Speedmaster', 'Dominant', 'Planeta']) # Теперь сравниваем полученные размеры с известными, для каждой странцы for page, plate in pdf.platesize.items(): for press in primary_machines: #logger.debug('press.plate_w={}, pdf.platesize[page][0]={}, press.plate_h={}, pdf.platesize[page][1]={}'.format(press.plate_w, pdf.platesize[page][0], press.plate_h, pdf.platesize[page][1] )) if (press.plate_w == pdf.platesize[page][0]) and (press.plate_h == pdf.platesize[page][1]): machines[page] = press #Check if machine detected #----------------------------------------------------------------- if machines: logger.info('····Detected [by 1st page]: {}'.format(machines[1].name)) else: os.unlink(pdf.abspath) os.removedirs(pdf.tmpdir) logger.error('Cant detect machine for {}'.format(pdf.name)) exit() return machines