def draw(self, c, dpi): self.c = c self.dpi = dpi set_background_color(c, self.w, self.h) nw, nh = dimensions_mm(dpi, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) self.draw_ruler_pair(c, dpi, mm(dpi, 20)) # Only calculate offsets if on an OLPC XO-1, 1.5, 1.75 # Not applicable to XO 3.0 if self.hw[0:2] == 'xo' and dpi in [200, 201]: self.offset_of_xo_side_from_screen = mm(dpi, -38.5) c.move_to(self.offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, 180) c.save() c.move_to(mm(dpi, 20), mm(dpi, 75)) write(c, _('Use this ruler from the outside edge of the computer.'), self.font, mm(dpi, 4)) c.restore() offset_of_molding_from_screen = mm(dpi, -0.4) c.move_to(offset_of_molding_from_screen, mm(dpi, 95)) self.draw_cm_ruler(c, dpi, 150) self.draw_custom_ruler(self.custom_unit_in_mm, int(nw / 10 * 10)) else: self.offset_of_xo_side_from_screen = mm(dpi, int(nw / 20)) c.move_to(self.offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, int(nw / 11 * 10)) self.draw_custom_ruler(self.custom_unit_in_mm, int(nw / 11 * 10))
def draw(self, c, dpi): set_background_color(c, self.w, self.h) nw, nh = dimensions_mm(dpi, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) self.draw_ruler_pair(c, dpi, mm(dpi, 20)) # only calculate offsets if on an OLPC XO-1 if self.hw[0:2] == 'XO': offset_of_xo_side_from_screen = mm(dpi, -38.5) #XXX needs checking c.move_to(offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, 180) c.save() c.move_to(mm(dpi, 20), mm(dpi, 75)) write(c, _('Use this ruler from the outside edge of the computer.'), self.font, mm(dpi, 4)) c.restore() offset_of_molding_from_screen = mm(dpi, -0.4) #XXX +- 0.2 ?? c.move_to(offset_of_molding_from_screen, mm(dpi, 95)) self.draw_cm_ruler(c, dpi, 150) else: offset_of_xo_side_from_screen = mm(dpi, 0) c.move_to(offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, int(nw / 10 * 10))
def draw(self, c, dpi): self.c = c self.dpi = dpi set_background_color(c, self.w, self.h) nw, nh = dimensions_mm(dpi, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) self.draw_ruler_pair(c, dpi, mm(dpi, 20)) # Only calculate offsets if on an OLPC XO-1, 1.5, 1.75 # Not applicable to XO 3.0 if self.hw[0:2] == 'xo' and dpi in [200, 201]: self.offset_of_xo_side_from_screen = mm(dpi, -38.5) c.move_to(self.offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, 180) c.save() c.move_to(mm(dpi, 20), mm(dpi, 75)) write(c, _('Use this ruler from the outside edge of the computer.'), self.font, mm(dpi, 4)) c.restore() offset_of_molding_from_screen = mm(dpi, -0.4) c.move_to(offset_of_molding_from_screen, mm(dpi, 95)) self.draw_cm_ruler(c, dpi, 150) self.draw_custom_ruler(self.custom_unit_in_mm, int(nw / 10 * 10)) else: self.offset_of_xo_side_from_screen = mm(dpi, 0) c.move_to(self.offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, int(nw / 10 * 10)) self.draw_custom_ruler(self.custom_unit_in_mm, int(nw / 10 * 10))
def draw_ruler_pair(self, c, dpi, y): c.move_to(mm(dpi, 10), y) self.connect_rulers(c, dpi) c.move_to(mm(dpi, 10), y) self.draw_cm_ruler(c, dpi) c.move_to(mm(dpi, 10), y+mm(dpi, 10)) self.draw_mm_ruler(c, dpi)
def connect_rulers(self, c, dpi): c.save() c.set_line_cap(cairo.LINE_CAP_SQUARE) c.translate(*c.get_current_point()) c.set_line_width(1) for xm in range(0, 130+1, 10): c.move_to(mm(dpi, xm), 0) c.rel_line_to(0, mm(dpi, 10)) c.stroke() c.set_line_width(2) c.move_to(0, 0) c.rel_line_to(0, mm(dpi, 10)) c.stroke() c.restore()
def draw_numbers(p, c, dpi, nw, nh, m=1, unit="cm"): c.save() v = 0.7 c.set_source_rgb(v, v, v) for n in range(1, 11): c.move_to(mm(dpi, n * 10), mm(dpi, n * 10)) c.rel_move_to(mm(dpi, 0), mm(dpi, 3)) write(c, "%d" % (n * m), p.font, mm(dpi, 4), centered=True) if n == 1: c.rel_move_to(mm(dpi, -0.5), mm(dpi, -0.5)) write(c, " "+unit, p.font, mm(dpi, 3)) c.restore()
def draw(self, c, dpi): set_background_color(c, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) nw, nh = dimensions_mm(dpi, self.w, self.h) if self.hw[0:2] == 'xo': scale = 1. else: scale = 200. / nh ox = mm(dpi, nw / 2) oy = mm(dpi, nh / 2) d = mm(dpi, 44 * scale) def xy(angle, m=d): return cos(-angle) * m + ox, sin(-angle) * m + oy def ray(angle, r0=0, r1=d): c.move_to(*xy(angle, r0)) c.line_to(*xy(angle, r1)) def annulus(a0, a1, r0, r1): c.move_to(*xy(a0, r0)) c.arc_to(ox, oy, r0, a0, a1) c.rel_line_to(*xy(a1, r1)) c.arc_to(ox, oy, r1, a1, a0) c.close_path() def rays(step, r0=0, r1=d, w=1): c.save() c.set_line_width(w) for a in range(0, 360, step): ray(d2r(a), r0, r1) c.stroke() c.restore() rays(1, mm(dpi, 35 * scale), w=2, r1=mm(dpi, 43 * scale)) rays(5, mm(dpi, 10 * scale), w=2) rays(10, mm(dpi, 10 * scale), w=4) # rays(10, mm(dpi, 3), mm(dpi, 20), w=2) c.save() #c.set_dash([mm(dpi, 5)]) set_color(c, 'dark gray') rays(45, 0, mm(dpi, 45 * scale), w=6) c.restore() rays(90, 0, mm(dpi, 45 * scale), w=6)
def draw(self, c, dpi): set_background_color(c, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) nw, nh = dimensions_mm(dpi, self.w, self.h) if self.hw[0:2] == 'xo': scale = 1. else: scale = 200./nh ox = mm(dpi, nw / 2) oy = mm(dpi, nh / 2) d = mm(dpi, 44 * scale) def xy(angle, m=d): return cos(-angle) * m + ox, sin(-angle) * m + oy def ray(angle, r0=0, r1=d): c.move_to(*xy(angle, r0)) c.line_to(*xy(angle, r1)) def annulus(a0, a1, r0, r1): c.move_to(*xy(a0, r0)) c.arc_to(ox, oy, r0, a0, a1) c.rel_line_to(*xy(a1, r1)) c.arc_to(ox, oy, r1, a1, a0) c.close_path() def rays(step, r0=0, r1=d, w=1): c.save() c.set_line_width(w) for a in range(0, 360, step): ray(d2r(a), r0, r1) c.stroke() c.restore() rays(1, mm(dpi, 35 * scale), w=2, r1=mm(dpi, 43 * scale)) rays(5, mm(dpi, 10 * scale), w=2) rays(10, mm(dpi, 10 * scale), w=4) # rays(10, mm(dpi, 3), mm(dpi, 20), w=2) c.save() #c.set_dash([mm(dpi, 5)]) set_color(c, 'dark gray') rays(45, 0, mm(dpi, 45 * scale), w=6) c.restore() rays(90, 0, mm(dpi, 45 * scale), w=6)
def lay_mm_grid(c, dpi, width_mm=152, height_mm=114, step_mm=1): c.save() z = mm(dpi, 1) c.scale(z, z) for x in range(0, width_mm, step_mm): c.move_to(x, 0) c.rel_line_to(0, height_mm) for y in range(0, height_mm, step_mm): c.move_to(0, y) c.rel_line_to(width_mm, 0) c.restore()
def draw_custom_ruler(self, units_per_mm, width=130): if not self.c: return self.c.set_source_rgb(255, 255, 255) self.c.rectangle(0, mm(self.dpi, 85), width, mm(self.dpi, 85) + 10) self.c.fill() self.c.set_source_rgb(0, 0, 0) self.c.move_to(self.offset_of_xo_side_from_screen, mm(self.dpi, 85)) self.c.save() self.c.set_line_cap(cairo.LINE_CAP_SQUARE) self.c.translate(*self.c.get_current_point()) self.c.set_line_width(5) self.c.move_to(0, 0) self.c.line_to(mm(self.dpi, width), 0) for x in [ mm(self.dpi, xm / 100.) for xm in xrange(0, (width + 1) * 100, int(units_per_mm * 100)) ]: self.c.move_to(x, 0) self.c.rel_line_to(0, mm(self.dpi, -3)) self.c.stroke() pt_list = [x / int(units_per_mm * 100) for x in \ range(0, (width + 1) * 100, int(units_per_mm * 100))] coord_list = [ mm(self.dpi, xm / 100) for xm in range(0, (width + 1) * 100, int(units_per_mm * 100)) ] if units_per_mm > 7: # Avoid overlapping labels for a in range(0, len(coord_list)): xm = pt_list[a] x = coord_list[a] n = xm self.c.move_to(x, mm(self.dpi, -4)) write(self.c, "%d" % n, self.font_bold, mm(self.dpi, 2.5), centered=True) self.c.restore()
def analyze_platesize(pdf): """ Функция принимает на входе имя файла, и на выходе выдает словарь, в котором ключ - номер страницы (начиная с 1), а значение - список (ширина, высота) в мм :param pdf: объект pdf :return: dict """ from PyPDF2 import PdfFileReader pdffile = PdfFileReader(open(pdf.abspath, "rb")) pages = pdffile.pages plate_sizes = {} for index, page in enumerate(pages, 1): start_x, start_y = page.mediaBox.lowerLeft end_x, end_y = page.mediaBox.upperRight w = mm(end_x - start_x) h = mm(end_y - start_y) if h > w: w, h = h, w plate_sizes[index] = (w, h) return plate_sizes
def draw_cm_ruler(self, c, dpi, width=130): c.save() c.set_line_cap(cairo.LINE_CAP_SQUARE) c.translate(*c.get_current_point()) c.set_line_width(5) c.move_to(0, 0) c.line_to(mm(dpi, width), 0) for x in [mm(dpi, xm) for xm in range(0, width+1, 10)]: c.move_to(x, 0) c.rel_line_to(0, mm(dpi, -3)) c.stroke() for x, xm in [(mm(dpi, xm), xm) for xm in range(0, width+1, 10)]: n = xm/10 c.move_to(x, mm(dpi, -4)) write(c, "%d" % n, self.font_bold, mm(dpi, 2.5), centered=True) c.move_to(mm(dpi, 1.5), mm(dpi, -4)) write(c, "cm", self.font_bold, mm(dpi, 2)) c.restore()
def draw_custom_ruler(self, units_per_mm, width=130): if not self.c: return self.c.set_source_rgb(255, 255, 255) self.c.rectangle(0, mm(self.dpi, 85), width, mm(self.dpi, 85) + 10) self.c.fill() self.c.set_source_rgb(0, 0, 0) self.c.move_to(self.offset_of_xo_side_from_screen, mm(self.dpi, 85)) self.c.save() self.c.set_line_cap(cairo.LINE_CAP_SQUARE) self.c.translate(*self.c.get_current_point()) self.c.set_line_width(5) self.c.move_to(0, 0) self.c.line_to(mm(self.dpi, width), 0) for x in [mm(self.dpi, xm / 100.) for xm in xrange( 0, (width + 1) * 100, int(units_per_mm * 100))]: self.c.move_to(x, 0) self.c.rel_line_to(0, mm(self.dpi, -3)) self.c.stroke() pt_list = [x / int(units_per_mm * 100) for x in \ range(0, (width + 1) * 100, int(units_per_mm * 100))] coord_list = [mm(self.dpi, xm / 100) for xm in range( 0, (width + 1) * 100, int(units_per_mm * 100))] if units_per_mm > 7: # Avoid overlapping labels for a in range(0, len(coord_list)): xm = pt_list[a] x = coord_list[a] n = xm self.c.move_to(x, mm(self.dpi, -4)) write(self.c, "%d" % n, self.font_bold, mm(self.dpi, 2.5), centered=True) self.c.restore()
def sq(x, y): c.rectangle(x, y, mm(dpi, 10), mm(dpi, 10)) c.fill()
def draw(self, c, dpi): set_background_color(c, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) nw, nh = dimensions_mm(dpi, self.w, self.h) def sq(x, y): c.rectangle(x, y, mm(dpi, 10), mm(dpi, 10)) c.fill() w = nw h = nh for xm in range(0, w, 20): for ym in range(0, h, 20): sq(mm(dpi, xm), mm(dpi, ym)) for xm in range(10, w, 20): for ym in range(10, h, 20): sq(mm(dpi, xm), mm(dpi, ym)) c.set_line_width(1) c.move_to(mm(dpi, 100), 0) c.rel_line_to(0, mm(dpi, 100)) c.rel_line_to(mm(dpi, -100), 0) c.stroke() c.set_line_width(3) v = 0.5 c.set_source_rgb(v, v, v) c.move_to(mm(dpi, 50), 0) c.rel_line_to(0, mm(dpi, 100)) c.move_to(0, mm(dpi, 50)) c.rel_line_to(mm(dpi, 100), 0) c.stroke()
def draw(self, c, dpi): set_background_color(c, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) nw, nh = dimensions_mm(dpi, self.w, self.h) if self.hw[0:2] == 'xo': scale = 1. else: scale = 200./nh ox = mm(dpi, 0) oy = mm(dpi, 99 * scale) d = mm(dpi, 90 * scale) def xy(angle, m=d): return cos(-angle) * m + ox, sin(-angle) * m + oy def ray(angle, r0=0, r1=d): c.move_to(*xy(angle, r0)) c.line_to(*xy(angle, r1)) lw = 6 c.set_line_width(lw) c.move_to(ox, oy + lw / 2) c.line_to(*xy(pi / 2)) ray(0) c.stroke() c.save() c.set_line_width(3) c.set_dash([mm(dpi, 5)]) ray(pi / 4) c.stroke() c.restore() c.set_line_width(4) for a in range(10, 81, 10): ray(d2r(a), mm(dpi, 10 * scale), mm(dpi, 85 * scale)) c.stroke() c.set_line_width(2) for a in range(10, 81, 10): ray(d2r(a), mm(dpi, 3 * scale), mm(dpi, 20 * scale)) c.stroke() c.set_line_width(2) for a in range(1, 90, 1): ray(d2r(a), mm(dpi, 70 * scale), mm(dpi, 80 * scale)) c.stroke() c.set_line_width(2) for a in range(0, 90, 5): ray(d2r(a), mm(dpi, 20 * scale), mm(dpi, 81 * scale)) c.stroke()
def draw(self, c, dpi): set_background_color(c, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) nw, nh = dimensions_mm(dpi, self.w, self.h) if self.hw[0:2] == 'xo': scale = 1. else: scale = 200. / nh ox = mm(dpi, 0) oy = mm(dpi, 99 * scale) d = mm(dpi, 90 * scale) def xy(angle, m=d): return cos(-angle) * m + ox, sin(-angle) * m + oy def ray(angle, r0=0, r1=d): c.move_to(*xy(angle, r0)) c.line_to(*xy(angle, r1)) lw = 6 c.set_line_width(lw) c.move_to(ox, oy + lw / 2) c.line_to(*xy(pi / 2)) ray(0) c.stroke() c.save() c.set_line_width(3) c.set_dash([mm(dpi, 5)]) ray(pi / 4) c.stroke() c.restore() c.set_line_width(4) for a in range(10, 81, 10): ray(d2r(a), mm(dpi, 10 * scale), mm(dpi, 85 * scale)) c.stroke() c.set_line_width(2) for a in range(10, 81, 10): ray(d2r(a), mm(dpi, 3 * scale), mm(dpi, 20 * scale)) c.stroke() c.set_line_width(2) for a in range(1, 90, 1): ray(d2r(a), mm(dpi, 70 * scale), mm(dpi, 80 * scale)) c.stroke() c.set_line_width(2) for a in range(0, 90, 5): ray(d2r(a), mm(dpi, 20 * scale), mm(dpi, 81 * scale)) c.stroke()
def crop(pdf): """ Кропит страницы pdf до размеров бумаги. Если размеры бумаги неизвестны, то высчитывает поля с помощью ghostscript bbox. Объект типа файл схраняется в свойство pdf.cropped_file. :param pdf: объект pdf :return: """ pdf.cropped_file = tempfile.NamedTemporaryFile(mode='w+b', dir=pdf.tmpdir, suffix='.pdf', delete=False) input = PdfFileReader(file(pdf.abspath, "rb")) output = PdfFileWriter() if pdf.paper_sizes: logger.info('') logger.info('――> Cropping [using signa paper]:') for index in range(1, pdf.complects + 1): paper_w = pdf.paper_sizes[index][1] paper_h = pdf.paper_sizes[index][2] plate_w = pdf.machines[index].plate_w plate_h = pdf.machines[index].plate_h page = input.getPage(index-1) """ EXAMLE # The resulting document has a trim box that is 200x200 points # and starts at 25,25 points inside the media box. # The crop box is 25 points inside the trim box. logger.debug('{} {}'.format(mm(page.mediaBox.getUpperRight_x()), mm(page.mediaBox.getUpperRight_y()))) page.trimBox.lowerLeft = (25, 25) page.trimBox.upperRight = (225, 225) page.cropBox.lowerLeft = (50, 50) page.cropBox.upperRight = (200, 200) """ x1 = pt((plate_w - paper_w)/2) # отступ слева y1 = pt(pdf.machines[index].klapan) # отступ снизу x2 = pt(paper_w + (plate_w - paper_w)/2) # ширина бумаги + отступ слева y2 = pt(paper_h + pdf.machines[index].klapan) # высота бумаги + отступ снизу page.mediaBox.lowerLeft = (x1, y1) page.mediaBox.upperRight = (x2, y2) logger.info('····page {} to paper {}x{}'.format(index, paper_w, paper_h)) output.addPage(page) else: logger.info('') logger.info('――> Cropping [using gs bbox]:') bbox = get_bbox(pdf.abspath) for index in range(1, pdf.complects + 1): page = input.getPage(index-1) page.mediaBox.lowerLeft = (bbox[index][0], bbox[index][1]) page.mediaBox.upperRight = (bbox[index][2], bbox[index][3]) paper_w = mm(bbox[index][2] - bbox[index][0]) paper_h = mm(bbox[index][3] - bbox[index][1]) logger.info('····page {} to paper {}x{}'.format(index, paper_w, paper_h)) output.addPage(page) outputstream = file(pdf.cropped_file.name, "wb") output.write(outputstream) outputstream.close() pdf.cropped_file.close()
def draw_mm_ruler(self, c, dpi, width=130): c.save() c.set_line_cap(cairo.LINE_CAP_SQUARE) c.translate(*c.get_current_point()) c.move_to(0, 0) c.set_line_width(4) c.line_to(mm(dpi, width), 0) for x in [mm(dpi, xm) for xm in range(0, width+1, 10)]: c.move_to(x, 0) c.rel_line_to(0, mm(dpi, 3)) c.stroke() c.set_line_width(3) for x in [mm(dpi, xm) for xm in range(0, width, 5)]: c.move_to(x, 0) c.rel_line_to(0, mm(dpi, 2.2)) for x in [mm(dpi, xm) for xm in range(0, width, 1)]: c.move_to(x, 0) c.rel_line_to(0, mm(dpi, 2)) c.stroke() base = mm(dpi, 7) for x, xm in [(mm(dpi, xm), xm) for xm in range(0, width+1, 10)]: c.move_to(x, base) write(c, "%d" % xm, self.font, mm(dpi, 2), centered=True) c.move_to(mm(dpi, 1.2), base) write(c, "mm", self.font, mm(dpi, 1.5)) c.restore()
def draw(self, c, dpi): set_background_color(c, self.w, self.h) c.set_antialias(cairo.ANTIALIAS_GRAY) nw, nh = dimensions_mm(dpi, self.w, self.h) def sq(x, y): c.rectangle(x, y, mm(dpi, 10), mm(dpi, 10)) c.fill() w=nw h=nh for xm in range(0, w, 20): for ym in range(0, h, 20): sq(mm(dpi, xm), mm(dpi, ym)) for xm in range(10, w, 20): for ym in range(10, h, 20): sq(mm(dpi, xm), mm(dpi, ym)) c.set_line_width(1) c.move_to(mm(dpi, 100), 0) c.rel_line_to(0, mm(dpi, 100)) c.rel_line_to(mm(dpi, -100), 0) c.stroke() c.set_line_width(3) v = 0.5 c.set_source_rgb(v, v, v) c.move_to(mm(dpi, 50), 0) c.rel_line_to(0, mm(dpi, 100)) c.move_to(0, mm(dpi, 50)) c.rel_line_to(mm(dpi, 100), 0) c.stroke()