Пример #1
0
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
Пример #2
0
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
Пример #3
0
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