def from_file(cls, filename): # unzip vsdx file to temp. folder directory = './{}'.format(filename.rsplit('.', 1)[0]) with zipfile.ZipFile(filename, "r") as zip_ref: zip_ref.extractall(directory) # Read [Content_Types].xml content_types = ContentTypes.from_xml(directory + '/[Content_Types].xml') # Read relationships package_rels = Relationship.from_xml( '{}/_rels/.rels'.format(directory)) document_rels = Relationship.from_xml( '{}/visio/_rels/document.xml.rels'.format(directory)) # Read pages and relationships page_collection = PageCollection.from_xml(directory, content_types) # Remove extracted folder again shutil.rmtree(directory) return cls(page_collection=page_collection, package_rels=package_rels, document_rels=document_rels, content_types=content_types)
def from_xml(cls, dir, content_types): """Generate PageCollection from files :param dir: The directory of the extracted visio package :param content_types: Instance of :class:`ContentType` """ rel_dir = '{}/visio/pages/_rels/'.format(dir) page_dir = '{}/visio/pages/'.format(dir) pages = [] rels = Relationship.from_xml(rel_dir + 'pages.xml.rels') # Parse pages.xml for page info tree = ET.parse(page_dir + 'pages.xml') root = tree.getroot() for child in root: name = child.attrib.get('Name', '') id = child.attrib['ID'] # TODO Parse these namespaces properly rel_id = child[1].attrib[ '{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id'] pages.append( Page.from_xml(page_dir + rels.rels[rel_id][0], name, id, rel_id)) return cls(content_types, rels=rels, pages=pages)