'How to extract FREEFORM shapes from ppt and save it in png file using pptx

I have a ppt file that contains some maps(for eg. world map) tagged as freeform shape in xml file. I want to decode the freeform object and extract it in png or any appropriate format.

ppt_name = file_name + ".pptx"
prs = Presentation(ppt_name)
for slide_number, slide in enumerate(prs.slides):
    for i, shape in enumerate(slide.shapes):
        if shape.shape_type == MSO_SHAPE_TYPE.FREEFORM:
            #now i want to save this freeform object in appropriate format.
            Process_freeform_obj(shape)


Can anyone help on how to extract freeform tag in xml file. Like the example below. how to decode this Freeform object.

            <p:sp>
              <p:nvSpPr>
                <p:cNvPr id="1914" name="Freeform 1506"/>
                <p:cNvSpPr>
                  <a:spLocks/>
                </p:cNvSpPr>
                <p:nvPr/>
              </p:nvSpPr>
              <p:spPr bwMode="auto">
                <a:xfrm>
                  <a:off x="3130" y="2669"/>
                  <a:ext cx="14" cy="30"/>
                </a:xfrm>
                <a:custGeom>
                  <a:avLst/>
                  <a:gdLst>
                    <a:gd name="T0" fmla="*/ 12 w 14"/>
                    <a:gd name="T1" fmla="*/ 0 h 30"/>
                    <a:gd name="T2" fmla="*/ 12 w 14"/>
                    <a:gd name="T3" fmla="*/ 2 h 30"/>
                    <a:gd name="T4" fmla="*/ 14 w 14"/>
                    <a:gd name="T5" fmla="*/ 16 h 30"/>
                    <a:gd name="T6" fmla="*/ 10 w 14"/>
                    <a:gd name="T7" fmla="*/ 30 h 30"/>
                    <a:gd name="T8" fmla="*/ 8 w 14"/>
                    <a:gd name="T9" fmla="*/ 28 h 30"/>
                    <a:gd name="T10" fmla="*/ 6 w 14"/>
                    <a:gd name="T11" fmla="*/ 28 h 30"/>
                    <a:gd name="T12" fmla="*/ 4 w 14"/>
                    <a:gd name="T13" fmla="*/ 28 h 30"/>
                    <a:gd name="T14" fmla="*/ 4 w 14"/>
                    <a:gd name="T15" fmla="*/ 26 h 30"/>
                    <a:gd name="T16" fmla="*/ 4 w 14"/>
                    <a:gd name="T17" fmla="*/ 24 h 30"/>
                    <a:gd name="T18" fmla="*/ 2 w 14"/>
                    <a:gd name="T19" fmla="*/ 24 h 30"/>
                    <a:gd name="T20" fmla="*/ 2 w 14"/>
                    <a:gd name="T21" fmla="*/ 18 h 30"/>
                    <a:gd name="T22" fmla="*/ 0 w 14"/>
                    <a:gd name="T23" fmla="*/ 16 h 30"/>
                    <a:gd name="T24" fmla="*/ 0 w 14"/>
                    <a:gd name="T25" fmla="*/ 12 h 30"/>
                    <a:gd name="T26" fmla="*/ 2 w 14"/>
                    <a:gd name="T27" fmla="*/ 8 h 30"/>
                    <a:gd name="T28" fmla="*/ 2 w 14"/>
                    <a:gd name="T29" fmla="*/ 8 h 30"/>
                    <a:gd name="T30" fmla="*/ 4 w 14"/>
                    <a:gd name="T31" fmla="*/ 8 h 30"/>
                    <a:gd name="T32" fmla="*/ 8 w 14"/>
                    <a:gd name="T33" fmla="*/ 6 h 30"/>
                    <a:gd name="T34" fmla="*/ 10 w 14"/>
                    <a:gd name="T35" fmla="*/ 6 h 30"/>
                    <a:gd name="T36" fmla="*/ 12 w 14"/>
                    <a:gd name="T37" fmla="*/ 4 h 30"/>
                    <a:gd name="T38" fmla="*/ 12 w 14"/>
                    <a:gd name="T39" fmla="*/ 0 h 30"/>
                    <a:gd name="T40" fmla="*/ 12 w 14"/>
                    <a:gd name="T41" fmla="*/ 0 h 30"/>
                    <a:gd name="T42" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T43" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T44" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T45" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T46" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T47" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T48" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T49" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T50" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T51" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T52" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T53" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T54" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T55" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T56" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T57" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T58" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T59" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T60" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T61" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T62" fmla="*/ 0 60000 65536"/>
                    <a:gd name="T63" fmla="*/ 0 w 14"/>
                    <a:gd name="T64" fmla="*/ 0 h 30"/>
                    <a:gd name="T65" fmla="*/ 14 w 14"/>
                    <a:gd name="T66" fmla="*/ 30 h 30"/>
                  </a:gdLst>
                  <a:ahLst/>
                  <a:cxnLst>
                    <a:cxn ang="T42">
                      <a:pos x="T0" y="T1"/>
                    </a:cxn>
                    <a:cxn ang="T43">
                      <a:pos x="T2" y="T3"/>
                    </a:cxn>
                    <a:cxn ang="T44">
                      <a:pos x="T4" y="T5"/>
                    </a:cxn>
                    <a:cxn ang="T45">
                      <a:pos x="T6" y="T7"/>
                    </a:cxn>
                    <a:cxn ang="T46">
                      <a:pos x="T8" y="T9"/>
                    </a:cxn>
                    <a:cxn ang="T47">
                      <a:pos x="T10" y="T11"/>
                    </a:cxn>
                    <a:cxn ang="T48">
                      <a:pos x="T12" y="T13"/>
                    </a:cxn>
                    <a:cxn ang="T49">
                      <a:pos x="T14" y="T15"/>
                    </a:cxn>
                    <a:cxn ang="T50">
                      <a:pos x="T16" y="T17"/>
                    </a:cxn>
                    <a:cxn ang="T51">
                      <a:pos x="T18" y="T19"/>
                    </a:cxn>
                    <a:cxn ang="T52">
                      <a:pos x="T20" y="T21"/>
                    </a:cxn>
                    <a:cxn ang="T53">
                      <a:pos x="T22" y="T23"/>
                    </a:cxn>
                    <a:cxn ang="T54">
                      <a:pos x="T24" y="T25"/>
                    </a:cxn>
                    <a:cxn ang="T55">
                      <a:pos x="T26" y="T27"/>
                    </a:cxn>
                    <a:cxn ang="T56">
                      <a:pos x="T28" y="T29"/>
                    </a:cxn>
                    <a:cxn ang="T57">
                      <a:pos x="T30" y="T31"/>
                    </a:cxn>
                    <a:cxn ang="T58">
                      <a:pos x="T32" y="T33"/>
                    </a:cxn>
                    <a:cxn ang="T59">
                      <a:pos x="T34" y="T35"/>
                    </a:cxn>
                    <a:cxn ang="T60">
                      <a:pos x="T36" y="T37"/>
                    </a:cxn>
                    <a:cxn ang="T61">
                      <a:pos x="T38" y="T39"/>
                    </a:cxn>
                    <a:cxn ang="T62">
                      <a:pos x="T40" y="T41"/>
                    </a:cxn>
                  </a:cxnLst>
                  <a:rect l="T63" t="T64" r="T65" b="T66"/>
                  <a:pathLst>
                    <a:path w="14" h="30">
                      <a:moveTo>
                        <a:pt x="12" y="0"/>
                      </a:moveTo>
                      <a:lnTo>
                        <a:pt x="12" y="2"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="14" y="16"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="10" y="30"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="8" y="28"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="6" y="28"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="4" y="28"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="4" y="26"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="4" y="24"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="2" y="24"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="2" y="18"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="0" y="16"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="0" y="12"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="2" y="8"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="4" y="8"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="8" y="6"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="10" y="6"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="12" y="4"/>
                      </a:lnTo>
                      <a:lnTo>
                        <a:pt x="12" y="0"/>
                      </a:lnTo>
                      <a:close/>
                    </a:path>
                  </a:pathLst>
                </a:custGeom>
                <a:grpFill/>
                <a:ln w="6350">
                  <a:solidFill>
                    <a:schemeClr val="bg2">
                      <a:lumMod val="85000"/>
                    </a:schemeClr>
                  </a:solidFill>
                  <a:round/>
                  <a:headEnd/>
                  <a:tailEnd/>
                </a:ln>
              </p:spPr>
              <p:txBody>
                <a:bodyPr/>
                <a:lstStyle/>
                <a:p>
                  <a:endParaRPr lang="en-US" dirty="0">
                    <a:latin typeface="+mn-lt"/>
                  </a:endParaRPr>
                </a:p>
              </p:txBody>
            </p:sp>

this type of image can be seen in ppt file. enter image description here



Solution 1:[1]

You could run a macro through all all slides and look for freeform (msoFreeform) and use the save mechanism (ShapeRange().Export with ppShapeFormatPNG).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1