def __init__(self, name): self.name = name self.document = OpenDocumentText() self.current_page = None self.photo_style = Style(name="Photo", family="graphic") self.document.styles.addElement(self.photo_style) self.font_styles = [] self.page_layouts = [] self.page_masters = [] self.page_styles = [] self.temp_images = [] frame_style = Style(name='FrameStyle', family = 'graphic') frame_style.addElement(GraphicProperties(borderlinewidth='none')) self.document.styles.addElement(frame_style) frame_style_rotated = Style(name='FrameStyleRotated', family = 'graphic') frame_style_rotated.addElement(GraphicProperties(fill = 'none', stroke = 'none', verticalpos = 'from-top', verticalrel = 'paragraph')) self.document.automaticstyles.addElement(frame_style_rotated)
class OdtGenerator(DocumentGenerator): def __init__(self, name): self.name = name self.document = OpenDocumentText() self.current_page = None self.photo_style = Style(name="Photo", family="graphic") self.document.styles.addElement(self.photo_style) self.font_styles = [] self.page_layouts = [] self.page_masters = [] self.page_styles = [] self.temp_images = [] frame_style = Style(name='FrameStyle', family = 'graphic') frame_style.addElement(GraphicProperties(borderlinewidth='none')) self.document.styles.addElement(frame_style) frame_style_rotated = Style(name='FrameStyleRotated', family = 'graphic') frame_style_rotated.addElement(GraphicProperties(fill = 'none', stroke = 'none', verticalpos = 'from-top', verticalrel = 'paragraph')) self.document.automaticstyles.addElement(frame_style_rotated) def addText(self, data_box): text = data_box.getText() frame_style = Style(name='FrameStyle', family = 'graphic') debug('Angle: ', data_box.text_data.angle) angle = data_box.text_data.angle if angle: frame_style = Style(name='FrameStyleRotated', family = 'graphic') x, y, width, height = data_box.getBoundsPrintSize(self.current_page_resolution) frame = Frame(stylename = frame_style, width = str(width) + 'in', height = str(height) + 'in', x = str(x) + 'in', y = str(y) + 'in', anchortype = 'paragraph') if angle: frame.addAttribute('transform', 'rotate (%s) translate (%scm %scm)' % (abs(math.radians(angle)), x, y)) self.current_page.addElement(frame) textbox = TextBox() frame.addElement(textbox) for line in text.split('\n'): textbox.addElement(P(stylename = self.__handleFrameStyle(data_box.text_data), text = line)) def addImage(self, data_box): format = 'PNG' image_file = tempfile.mkstemp(dir = ConfigurationManager.TEMPORARY_FOLDER, suffix = '.' + format)[1] data_box.image.save(image_file, format = format) x, y, width, height = data_box.getBoundsPrintSize(self.current_page_resolution) photo_frame = Frame(stylename=self.photo_style, x = '%sin' % x, y = '%sin' % y, width = '%sin' % width, height = '%sin' % height, anchortype='paragraph') self.current_page.addElement(photo_frame) location = self.document.addPicture(image_file) photo_frame.addElement(Image(href=location)) self.temp_images.append(image_file) def newPage(self, page_data): master_name = self.__handlePageMaster(page_data) page_style_name = '%sPage' % master_name if not page_style_name in self.page_styles: page_style = Style(name = page_style_name, family = 'paragraph', masterpagename = master_name) page_style.addElement(ParagraphProperties(breakbefore = 'page')) self.document.automaticstyles.addElement(page_style) new_page = P(stylename = page_style_name) self.document.text.addElement(new_page) return new_page def addPage(self, page_data): self.current_page = self.newPage(page_data) self.current_page_resolution = page_data.resolution self.addBoxes(page_data.data_boxes) def save(self): name = self.name if not name.lower().endswith('.odt'): name += '.odt' self.document.save(name) for image in self.temp_images: try: os.unlink(image) except: debug('Error removing image: %s' % image) def __handlePageMaster(self, page_data): layout_name = 'Page%s%s' % (page_data.width, page_data.height) if not layout_name in self.page_layouts: page_layout = PageLayout(name = layout_name) page_layout.addElement(PageLayoutProperties(margintop = '0in', marginbottom = '0in', marginleft = '0in', marginright = '0in', pagewidth = '%sin' % page_data.width, pageheight = '%sin' % page_data.height)) self.document.automaticstyles.addElement(page_layout) self.page_layouts.append(layout_name) master_name = layout_name + 'Master' if not master_name in self.page_masters: master_page = MasterPage(name = master_name, pagelayoutname = layout_name) self.document.masterstyles.addElement(master_page) self.page_masters.append(master_name) return master_name def __handleFrameStyle(self, text_data): style_name = 'box%s%s%s%s%s' % (text_data.face, text_data.size, text_data.line_space, text_data.letter_space, text_data.justification) if not style_name in self.font_styles: frame_style = Style(name = style_name, family = 'paragraph') frame_style.addElement(ParagraphProperties(linespacing = '%spt' % text_data.line_space, textalign = self.convertTextAlign(text_data.justification))) frame_style.addElement(TextProperties(letterspacing = '%spt' % text_data.letter_space, fontstyle = self.convertFontStyle(text_data.style), fontweight = self.convertFontWeight(text_data.weight), fontsize = '%spt' % text_data.size, fontfamily = str(text_data.face))) self.document.styles.addElement(frame_style) self.font_styles.append(style_name) return style_name def __handleFrameStyleRotated(self, text_data): style_name = 'box%s%s%s%s%sRotated' % (text_data.face, text_data.size, text_data.line_space, text_data.letter_space, text_data.justification) if not style_name in self.font_styles: frame_style = Style(name = style_name, family = 'paragraph') frame_style.addElement(ParagraphProperties(linespacing = '%spt' % text_data.line_space, textalign = self.convertTextAlign(text_data.justification))) frame_style.addElement(TextProperties(letterspacing = '%spt' % text_data.letter_space, fontstyle = self.convertFontStyle(text_data.style), fontweight = self.convertFontWeight(text_data.weight), fontsize = '%spt' % text_data.size, fontfamily = str(text_data.face))) self.document.automaticstyles.addElement(frame_style) self.font_styles.append(style_name) return style_name def convertFontStyle(self, style): if style == STYLE_OBLIQUE: return 'oblique' elif style == STYLE_ITALIC: return 'italic' return 'normal' def convertFontWeight(self, weight): if weight == WEIGHT_BOLD: return 'bold' return 'normal'
class OdtGenerator(DocumentGenerator): def __init__(self, name): self.name = name self.document = OpenDocumentText() self.current_page = None self.photo_style = Style(name="Photo", family="graphic") self.document.styles.addElement(self.photo_style) self.font_styles = [] self.page_layouts = [] self.page_masters = [] self.page_styles = [] self.temp_images = [] frame_style = Style(name='FrameStyle', family='graphic') frame_style.addElement(GraphicProperties(borderlinewidth='none')) self.document.styles.addElement(frame_style) frame_style_rotated = Style(name='FrameStyleRotated', family='graphic') frame_style_rotated.addElement( GraphicProperties(fill='none', stroke='none', verticalpos='from-top', verticalrel='paragraph')) self.document.automaticstyles.addElement(frame_style_rotated) def addText(self, data_box): text = data_box.getText() frame_style = Style(name='FrameStyle', family='graphic') debug('Angle: %s' % data_box.text_data.angle) angle = data_box.text_data.angle if angle: frame_style = Style(name='FrameStyleRotated', family='graphic') x, y, width, height = data_box.getBoundsPrintSize( self.current_page_resolution) frame = Frame(stylename=frame_style, width=str(width) + 'in', height=str(height) + 'in', x=str(x) + 'in', y=str(y) + 'in', anchortype='paragraph') if angle: frame.addAttribute( 'transform', 'rotate (%s) translate (%scm %scm)' % (abs(math.radians(angle)), x, y)) self.current_page.addElement(frame) textbox = TextBox() frame.addElement(textbox) for line in text.split('\n'): textbox.addElement( P(stylename=self.__handleFrameStyle(data_box.text_data), text=line)) def addImage(self, data_box): format = 'PNG' image_file = tempfile.mkstemp( dir=ConfigurationManager.TEMPORARY_FOLDER, suffix='.' + format)[1] data_box.image.save(image_file, format=format) x, y, width, height = data_box.getBoundsPrintSize( self.current_page_resolution) photo_frame = Frame(stylename=self.photo_style, x='%sin' % x, y='%sin' % y, width='%sin' % width, height='%sin' % height, anchortype='paragraph') self.current_page.addElement(photo_frame) location = self.document.addPicture(image_file) photo_frame.addElement(Image(href=location)) self.temp_images.append(image_file) def newPage(self, page_data): master_name = self.__handlePageMaster(page_data) page_style_name = '%sPage' % master_name if not page_style_name in self.page_styles: page_style = Style(name=page_style_name, family='paragraph', masterpagename=master_name) page_style.addElement(ParagraphProperties(breakbefore='page')) self.document.automaticstyles.addElement(page_style) new_page = P(stylename=page_style_name) self.document.text.addElement(new_page) return new_page def addPage(self, page_data): self.current_page = self.newPage(page_data) self.current_page_resolution = page_data.resolution self.addBoxes(page_data.data_boxes) def save(self): name = self.name if not name.lower().endswith('.odt'): name += '.odt' self.document.save(name) for image in self.temp_images: try: os.unlink(image) except: debug('Error removing image: %s' % image) def __handlePageMaster(self, page_data): layout_name = 'Page%s%s' % (page_data.width, page_data.height) if not layout_name in self.page_layouts: page_layout = PageLayout(name=layout_name) page_layout.addElement( PageLayoutProperties(margintop='0in', marginbottom='0in', marginleft='0in', marginright='0in', pagewidth='%sin' % page_data.width, pageheight='%sin' % page_data.height)) self.document.automaticstyles.addElement(page_layout) self.page_layouts.append(layout_name) master_name = layout_name + 'Master' if not master_name in self.page_masters: master_page = MasterPage(name=master_name, pagelayoutname=layout_name) self.document.masterstyles.addElement(master_page) self.page_masters.append(master_name) return master_name def __handleFrameStyle(self, text_data): style_name = 'box%s%s%s%s%s' % ( text_data.face, text_data.size, text_data.line_space, text_data.letter_space, text_data.justification) if not style_name in self.font_styles: frame_style = Style(name=style_name, family='paragraph') frame_style.addElement( ParagraphProperties(linespacing='%spt' % text_data.line_space, textalign=self.convertTextAlign( text_data.justification))) frame_style.addElement( TextProperties( letterspacing='%spt' % text_data.letter_space, fontstyle=self.convertFontStyle(text_data.style), fontweight=self.convertFontWeight(text_data.weight), fontsize='%spt' % text_data.size, fontfamily=str(text_data.face))) self.document.styles.addElement(frame_style) self.font_styles.append(style_name) return style_name def __handleFrameStyleRotated(self, text_data): style_name = 'box%s%s%s%s%sRotated' % ( text_data.face, text_data.size, text_data.line_space, text_data.letter_space, text_data.justification) if not style_name in self.font_styles: frame_style = Style(name=style_name, family='paragraph') frame_style.addElement( ParagraphProperties(linespacing='%spt' % text_data.line_space, textalign=self.convertTextAlign( text_data.justification))) frame_style.addElement( TextProperties( letterspacing='%spt' % text_data.letter_space, fontstyle=self.convertFontStyle(text_data.style), fontweight=self.convertFontWeight(text_data.weight), fontsize='%spt' % text_data.size, fontfamily=str(text_data.face))) self.document.automaticstyles.addElement(frame_style) self.font_styles.append(style_name) return style_name def convertFontStyle(self, style): if style == Pango.Style.OBLIQUE: return 'oblique' elif style == Pango.Style.ITALIC: return 'italic' return 'normal' def convertFontWeight(self, weight): if weight == Pango.Weight.BOLD: return 'bold' return 'normal'