class Renderer(object): def __init__(self, page_width, page_height, crop_margin_width=0 * mm): self.page_width = page_width self.page_height = page_height self.margin_width = crop_margin_width self.include_crop_marks = bool(crop_margin_width) QApplication(['my-q-application']) f = QFontDatabase.addApplicationFont( '../../fonts/OldStandard-Regular.ttf') f = QFontDatabase.addApplicationFont('OldStandard-Italic.ttf') f = QFontDatabase.addApplicationFont('OldStandard-Bold.ttf') f = QFontDatabase.addApplicationFont('fonts/Inconsolata-Regular.ttf') f = QFontDatabase.addApplicationFont('fonts/UbuntuMono-R.ttf') f = QFontDatabase.addApplicationFont('../../fonts/GenBasB.ttf') f = QFontDatabase.addApplicationFont('../../fonts/GenBasR.ttf') #f = QFontDatabase.addApplicationFont('../../fonts/Inconsolata-Regular.ttf') # print(f) names = QFontDatabase.applicationFontFamilies(f) # print(names) self.writer = QPdfWriter('book.pdf') size = QSizeF(as_mm(2 * crop_margin_width + page_width), as_mm(2 * crop_margin_width + page_height)) print(size) self.writer.setPageSizeMM(size) margins = QMarginsF(as_mm(crop_margin_width), as_mm(crop_margin_width), as_mm(crop_margin_width), as_mm(crop_margin_width)) print(margins) self.writer.setPageMargins(margins, QPageLayout.Millimeter) self.painter = QPainter(self.writer) if self.include_crop_marks: self.draw_crop_marks() def new_page(self): self.writer.newPage() if self.include_crop_marks: self.draw_crop_marks() def draw_crop_marks(self): pt = 1200 / 72.0 m = self.margin_width * pt offset = 9 * pt weight = 0.25 painter = self.painter if m < 9: return pen = QPen(Qt.black, weight, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin) painter.setPen(pen) w = self.page_width * pt h = self.page_height * pt for x in 0, w: painter.drawLine(QPoint(x, -m), QPoint(x, -offset)) painter.drawLine(QPoint(x, h + m), QPoint(x, h + offset)) for y in 0, h: painter.drawLine(QPoint(-m, y), QPoint(-offset, y)) painter.drawLine(QPoint(w + m, y), QPoint(w + offset, y))
class Document(object): def __init__(self, page_width, page_height, margin_width=0): self.page_width = page_width self.page_height = page_height self.margin_width = margin_width self.include_crop_marks = bool(margin_width) QApplication(['my-q-application']) f = QFontDatabase.addApplicationFont('OldStandard-Regular.ttf') f = QFontDatabase.addApplicationFont('OldStandard-Italic.ttf') f = QFontDatabase.addApplicationFont('OldStandard-Bold.ttf') names = QFontDatabase.applicationFontFamilies(f) print(names) self.writer = QPdfWriter('book.pdf') size = QSizeF((2 * margin_width + page_width) * mm, (2 * margin_width + page_height) * mm) self.writer.setPageSizeMM(size) margins = QMarginsF(margin_width, margin_width, margin_width, margin_width) self.writer.setPageMargins(margins) self.painter = QPainter(self.writer) if self.include_crop_marks: self.draw_crop_marks() def new_page(self): self.writer.newPage() if self.include_crop_marks: self.draw_crop_marks() def draw_crop_marks(self): pt = 1200 / 72.0 m = self.margin_width * pt offset = 9 * pt weight = 0.25 painter = self.painter if m < 9: return pen = QPen(Qt.black, weight, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin) painter.setPen(pen) w = self.page_width * pt h = self.page_height * pt for x in 0, w: painter.drawLine(QPoint(x, -m), QPoint(x, -offset)) painter.drawLine(QPoint(x, h + m), QPoint(x, h + offset)) for y in 0, h: painter.drawLine(QPoint(-m, y), QPoint(-offset, y)) painter.drawLine(QPoint(w + m, y), QPoint(w + offset, y))
class Renderer: def __init__(self, path): self.painter = None self.writer = QPdfWriter(path) margins = QMarginsF(0, 0, 0, 0) self.writer.setPageMargins(margins, QPageLayout.Millimeter) def type_face(self, name): return TypeFace(name, self) def draw_ellipse(self, x, y, width, height, pen): self.painter.setPen(pen.qt_pen) self.painter.setBrush(pen.qt_brush) self.painter.drawEllipse(self.pts(x), self.pts(y), self.pts(width), self.pts(height)) def draw_image(self, x, y, width, height, path, crop=None): image = QImage(path) rect = QRectF(self.pts(x), self.pts(y), self.pts(width), self.pts(height)) if crop is None: self.painter.drawImage(rect, image) else: sx, sy, sw, sh = crop source_rect = QRectF( sx * image.width(), sy * image.height(), sw * image.width(), sh * image.height(), ) self.painter.drawImage(rect, image, source_rect) def draw_polyline(self, pen, *points): self.painter.setPen(pen.qt_pen) self.painter.setBrush(pen.qt_brush) self.painter.drawPolyline( [QPoint(self.pts(x), self.pts(y)) for x, y in points]) def draw_line(self, start, end, pen): self.painter.setPen(pen.qt_pen) self.painter.drawLine(self.pts(start[0]), self.pts(start[1]), self.pts(end[0]), self.pts(end[1])) def draw_rectangle(self, x, y, width, height, pen): self.painter.setPen(pen.qt_pen) self.painter.setBrush(pen.qt_brush) self.painter.drawRect(self.pts(x), self.pts(y), self.pts(width), self.pts(height)) def draw_text(self, x, y, font, string, indent=0 * mm): self.painter.setFont(font.qt_font) self.painter.setPen(Qt.black) self.painter.drawText(self.pts(x + indent), self.pts(y + font.ascent), string) def new_page(self, width, height): size = QSizeF(as_mm(width), as_mm(height)) self.writer.setPageSizeMM(size) if self.painter is None: self.painter = QPainter(self.writer) else: self.writer.newPage() def pen(self, width, color=(0, 0, 0), fill_color=None, round_cap=True, round_join=False): if fill_color is None: qt_brush = Qt.NoBrush else: qt_brush = QBrush(QColor(*fill_color)) if color is None: qt_pen = Qt.NoPen else: qt_pen = QPen( QBrush(QColor(*color)), as_pt(width), cap=Qt.RoundCap if round_cap else Qt.FlatCap, join=Qt.RoundJoin if round_join else Qt.BevelJoin, ) return Pen(qt_pen, qt_brush) def pts(self, distance): return as_inch(distance) * self.writer.resolution() def render(self, *pages, debug): for page in pages: if debug: print("Traversing page:") self.new_page(page.width, page.height) _draw(self, page, (0 * mm, 0 * mm), debug_indent=0 if debug else None) self.save() def save(self): self.painter.end() self.painter = None