I'm trying to set a .pptx presentation to loop until Escape is pressed. Usually this is done in Powerpoint in the Set up Slide Show Dialog, but I'm doing it with the python pptx module. I have tested with opc-diag and determined that the only difference when that option is selected is that there is a tag like this in the /ppt/presProps.xml part of the powerpoint file: <p:showPr loop="1" showNarration="1">
Now, in my python code, I have tried something to this extent with no success:
def xpath(el, query):
nsmap = {'p': 'http://schemas.openxmlformats.org/presentationml/2006/main'}
return etree.ElementBase.xpath(el, query, namespaces=nsmap)
presentation = Presentation()
p = "http://schemas.openxmlformats.org/presentationml/2006/main"
ele = etree.Element(etree.QName(p, "showPr"), attrib={'loop': '1'})
# this does not work... Expecting element, getting presentation.
xpath(presentation, './/p:presentationPr')[0].getparent().insert(-1, ele)
I need to append the element for showPr to the root element of the presentation, but the xpath function is expecting an element, where I have just the presentation being passed. I do not know how to access the root node to append the showPr loop bit.
Any help would be appreciated.
I've tried the above code, which I was expecting to produce my desired result of setting <p:showPr loop="1" showNarration="1">
inside the /ppt/presProps.xml file but it is expecting an element, and I'm passing the presentation object. I don't know how to proceed.
You're on the right track, but there are a few more steps:
PresentationProperties
"part", which is an XML document distinct from the Presentation
part. (The files inside the .pptx zip archive are called parts in the OPC lingo.)from pptx.opc.constants import RELATIONSHIP_TYPE as RT
prs_part = presentation.part
prs_props_part = prs_part.part_related_by(RT.PML_PRES_PROPS)
from pptx.oxml import parse_xml
presentationPr = parse_xml(prs_props_part.blob)
Then you should be able to run your XPath expressions against that presentationPr
element.
This should work to print the XML out to have a look at it, which will confirm the steps so far have worked:
from pptx.oxml.xmlchemy import serialize_for_reading
print(serialize_for_reading(presentationPr))