如何从PPT中提取自由形状形状并使用PPTX将其保存在PNG文件中

发布于 2025-01-28 03:11:57 字数 11996 浏览 3 评论 0原文

我有一个ppt文件,其中包含一些地图(例如世界地图)在XML文件中标记为Freeform形状。我想解码自由形式对象,并以PNG或任何适当的格式提取它。

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)


任何人都可以帮助如何在XML文件中提取FreeForm标签。 如下面的示例。 如何解码此自由形式对象。

            <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>

这种类型的图像可以在PPT文件中看到。 在此处输入图像描述

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哭了丶谁疼 2025-02-04 03:11:57

您可以在所有幻灯片上运行一个宏,并查找FreeForm(MSOfreeform),并使用保存机制(Shaperange()。用pphapeformatpng导出)。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文