├── .gitignore ├── requirements.txt ├── input.txt ├── README.md └── generator.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pptx -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | anytree 2 | python-pptx -------------------------------------------------------------------------------- /input.txt: -------------------------------------------------------------------------------- 1 | Slide 1 2 | Slide 1.1 3 | Slide 1.2 4 | Slide 1.3 5 | Slide 1.4 6 | Slide 2 7 | Slide 2.1 8 | Slide 2.1.1 9 | Slide 2.1.2 10 | Slide 2.2 11 | Slide 2.2.1 12 | Slide 2.2.2 13 | Slide 2.2.3 14 | Slide 2.2.4 15 | Slide 2.2.5 16 | Slide 2.2.5.1 17 | Slide n -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PPT Generator 2 | #### Requirements 3 | ``` 4 | python-pptx 5 | anytree 6 | ``` 7 | 8 | #### Installation 9 | ``` 10 | pip install -r requirements.txt 11 | git clone https://github.com/c0fec0de/anytree 12 | cd anytree 13 | sudo python setup.py install 14 | ``` 15 | 16 | #### Usage 17 | ``` 18 | ➜ PPT-Generator git:(master) python generator.py 19 | Usage: 20 | python generator.py [INPUT] [OUTPUT] 21 | Example: 22 | python generator.py input.txt output.pptx 23 | ``` 24 | 25 | #### Example 26 | ``` 27 | ➜ PPT-Generator git:(master) cat input.txt 28 | Slide 1 29 | Slide 1.1 30 | Slide 1.2 31 | Slide 1.3 32 | Slide 1.4 33 | Slide 2 34 | Slide 2.1 35 | Slide 2.1.1 36 | Slide 2.1.2 37 | Slide 2.2 38 | Slide 2.2.1 39 | Slide 2.2.2 40 | Slide 2.2.3 41 | Slide 2.2.4 42 | Slide 2.2.5 43 | Slide 2.2.5.1 44 | Slide n 45 | ➜ PPT-Generator git:(master) python generator.py input.txt output.pptx 46 | root 47 | ├── Slide 1 48 | │ ├── Slide 1.1 49 | │ ├── Slide 1.2 50 | │ ├── Slide 1.3 51 | │ └── Slide 1.4 52 | ├── Slide 2 53 | │ ├── Slide 2.1 54 | │ │ ├── Slide 2.1.1 55 | │ │ └── Slide 2.1.2 56 | │ └── Slide 2.2 57 | │ ├── Slide 2.2.1 58 | │ ├── Slide 2.2.2 59 | │ ├── Slide 2.2.3 60 | │ ├── Slide 2.2.4 61 | │ └── Slide 2.2.5 62 | │ └── Slide 2.2.5.1 63 | └── Slide n 64 | ``` 65 | 66 | ![image.png](https://upload-images.jianshu.io/upload_images/2355077-2a1ecdfca171a2e7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 67 | ![image.png](https://upload-images.jianshu.io/upload_images/2355077-16fe4b49f622e2cd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 68 | 69 | #### Acknownledgement 70 | Thanks for the great support of these repos: 71 | 72 | * https://github.com/c0fec0de/anytree 73 | * https://github.com/scanny/python-pptx 74 | -------------------------------------------------------------------------------- /generator.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # encoding: utf-8 3 | 4 | import sys 5 | from anytree.importer import IndentedStringImporter 6 | from pptx import Presentation 7 | from anytree import RenderTree 8 | from anytree import LevelOrderIter 9 | 10 | def ascii_tree(tree): 11 | for pre, fill, node in RenderTree(tree): 12 | print("%s%s" % (pre, node.name.decode("utf-8"))) 13 | 14 | def create_slide(ppt, nodes): 15 | bullet_slide_layout = ppt.slide_layouts[1] 16 | slide = ppt.slides.add_slide(bullet_slide_layout) 17 | shapes = slide.shapes 18 | title_shape = shapes.title 19 | if nodes[0].parent.parent != None: 20 | title_shape.text = "%s · %s" % (nodes[0].parent.name, nodes[0].name) 21 | else: 22 | title_shape.text = "%s" % (nodes[0].name) 23 | body_shape = slide.shapes.placeholders 24 | body_shape = slide.shapes.placeholders 25 | for i in nodes[1:]: 26 | new_paragraph = body_shape[1].text_frame.add_paragraph() 27 | new_paragraph.text = i.name 28 | new_paragraph.level = 1 29 | 30 | def walk(tree): 31 | slide = [] 32 | for i in LevelOrderIter(tree, maxlevel=2): 33 | slide.append(i) 34 | return slide 35 | 36 | def run(ppt, tree): 37 | if len(tree.children) == 0: 38 | return 39 | titles = walk(tree) 40 | for i in titles[1:]: 41 | t = walk(i) 42 | create_slide(ppt, t) 43 | run(ppt, i) 44 | 45 | def main(): 46 | if len(sys.argv) != 3: 47 | print("Usage: ") 48 | print("\tpython %s [INPUT] [OUTPUT]" % (sys.argv[0])) 49 | print("Example: ") 50 | print("\tpython %s input.txt output.pptx" % (sys.argv[0])) 51 | exit(1) 52 | input_file = sys.argv[1] 53 | output_file = sys.argv[2] 54 | ppt = Presentation() 55 | data = open(input_file).read() 56 | importer = IndentedStringImporter() 57 | root = importer.import_(data) 58 | ascii_tree(root) 59 | run(ppt, root) 60 | ppt.save(output_file) 61 | 62 | if __name__ == '__main__': 63 | main() 64 | 65 | --------------------------------------------------------------------------------