Hello,

I work on a project where we convert user-uploaded PPTX to our own document 
format. I’ve got feedback for a file where some lines are missing. I’ve gone 
down the rabbit hole and found where this comes down to:


        - The source file has a FreeFormShape defined in a master slide. That 
shape has a single CustomGeometry defined
        - When reading the shape geometry with XSLFFreeformShape.getGeometry(), 
it calls internally  PresetGeometries.convertCustomGeometry(). When the shape 
geometry is loaded with with p.parse(staxReader);, I can see in debug mode that 
2 geometries are created for "XSLFFreeFormShape Freeform 6”. One with name 
“noFill” that is completely empty (no paths, anchors etc.), and one with the 
name “custom” that contains the path of my shape as defined in the XML. I don’t 
know where the “noFill” geometry is coming from. There is an element  
<a:NoFill/> in the shape definition, but that’s not a geometry, so it looks 
like the parser is reading all elements until the end of the shape definition.
        - Then PresetGeometries.convertCustomGeometry(XMLStreamReader 
staxReader) selects the “first” value only (whatever that means, as there is no 
guaranteed order in hashMap.values().stream.findFirst()), and I end up with the 
“noFill” geometry, which has an empty path. And I can’t access the “real” 
geometry of the shape.

I have changed a bit the logic in 
PresetGeometries.convertCustomGeometry(XMLStreamReader staxReader) so it always 
return the CustomGeometry created in the constructor of PresetParser and then 
populated by the parser with the first xml element:

Existing code:

/**
 * Convert a single CustomGeometry object, i.e. from xmlbeans
 */
public static CustomGeometry convertCustomGeometry(XMLStreamReader staxReader) {
  try {
    PresetParser p = new PresetParser(PresetParser.Mode.SHAPE);
    p.parse(staxReader);
    return p.getGeom().values().stream().findFirst().orElse(null);
  } catch (XMLStreamException e) {
    LOG.log(POILogger.ERROR, "Unable to parse single custom geometry", e);
    return null;
  }
}
Proposed change:
/**
 * Convert a single CustomGeometry object, i.e. from xmlbeans
 */
public static CustomGeometry convertCustomGeometry(XMLStreamReader staxReader) {
  try {
    PresetParser p = new PresetParser(PresetParser.Mode.SHAPE);
    var geometry = Iterables.getOnlyElement(p.getGeom().values());
    p.parse(staxReader);
    return geometry;
  } catch (XMLStreamException e) {
    LOG.log(POILogger.ERROR, "Unable to parse single custom geometry", e);
    return null;
  }
}

Let me know if I am analysing this correctly, and whether you are interested to 
patch this, I’m happy to create the patch and send it for review.


Thanks,
Etienne Gautier.
-- 
**
** <https://www.canva.com/>Empowering the world to design
We're hiring, 
apply here <https://www.canva.com/careers/>! Check out the latest news and 
learnings from our team on the Canva Newsroom 
<https://www.canva.com/newsroom/news/>.
 <https://twitter.com/canva> 
<https://facebook.com/canva> <https://au.linkedin.com/company/canva> 
<https://twitter.com/canva>  <https://facebook.com/canva>  
<https://www.linkedin.com/company/canva> 
 <https://instagram.com/canva>



Attachment: Presentation-custom-geometry-parsing.pptx
Description: MS-Powerpoint 2007 presentation

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
For additional commands, e-mail: user-h...@poi.apache.org

Reply via email to