Example #1
0
 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 __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'
Example #4
0
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'