0

I use pptx4j to load an existing presentation and I need the names of each layout. With the following code, it should work in my opinion:

    // loading layout
    SlideLayoutPart layoutPart = null;
    try {
        PartName partName = new PartName("/ppt/slideLayouts/slideLayout1.xml");
        layoutPart = (SlideLayoutPart) presentationMLPackage.getParts().getParts().get(partName);
        // get name
        String layoutName = layoutPart.getContents().getCSld().getName();
        log.debug("LayoutName: " + layoutName);
    } catch (InvalidFormatException e) {
        log.error("Error - Could not load layout: " + e);
    } catch (Docx4JException e) {
        log.error("Error - Could not get layoutName: " + e);
    }

But I get a NullPointerException for layoutPart.getJaxbElement(). Is this the wrong way or why am I getting this error?

The whole exception:

java.lang.IllegalArgumentException: Unknown type of result: class javax.xml.transform.dom.DOMResult 
        at net.sf.saxon.event.SerializerFactory.getReceiver(SerializerFactory.java:154)
        at net.sf.saxon.IdentityTransformerHandler.startDocument(IdentityTransformerHandler.java:94)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.DomLoader$State.<init>(DomLoader.java:67)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.DomLoader.startElement(DomLoader.java:102)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:45)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:486)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:60)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:229)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:266)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:235)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:266)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:235)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:266)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:235)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:266)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:235)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:112)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:95)
        at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:88)
        at com.sun.xml.internal.bind.v2.runtime.BinderImpl.associativeUnmarshal(BinderImpl.java:146)
        at com.sun.xml.internal.bind.v2.runtime.BinderImpl.unmarshal(BinderImpl.java:117)
        at org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.unmarshal(JaxbXmlPartXPathAware.java:316)
        at org.docx4j.openpackaging.parts.JaxbXmlPart.getJaxbElement(JaxbXmlPart.java:130)
        at pptx4j.PPTXConverter.create(Converter.java:83)
        at Starter.main(Starter.java:17)
Exception in thread "main" java.lang.NullPointerException
        at pptx4j.PPTXConverter.create(PPTXConverter.java:83)
        at Starter.main(Starter.java:17)

As addition slideLayout1.xml exists with content and i can use it to create a new slide.

I hope someone can give me a hint . If additional informations are necessary, ask please.

UPDATE

I used version 3.0.1, so I updated to 3.2.1 and changed my code a bit. Now the NullPointerException ist gone but I still get an IllegalArgumentException for layoutPart.getContents().getCSld():

INFO  JaxbXmlPart - Lazily unmarshalling /ppt/slideLayouts/slideLayout1.xml
INFO  JaxbXmlPartXPathAware - For org.docx4j.openpackaging.parts.PresentationML.SlideLayoutPart, unmarshall via binder
DEBUG JaxbXmlPartXPathAware - info: com.sun.xml.internal.bind.v2.runtime.BinderImpl
ERROR JaxbXmlPartXPathAware - Unknown type of result: class javax.xml.transform.dom.DOMResult
java.lang.IllegalArgumentException: Unknown type of result: class javax.xml.transform.dom.DOMResult
spilymp
  • 190
  • 2
  • 11

2 Answers2

1

The problem were certain dependencies between libraries that I use. Unfortunately, I can not say for which library. Only with saxon and docx4j it works now. If I can reproduce my problem, I will add it here.

@JasonPlutext Thank you for your answer and your hints!

spilymp
  • 190
  • 2
  • 11
0

Looks like you are accessing the parts collection correctly.

Assuming layoutPart is not null, but layoutPart.getJaxbElement() is null, then the problem is that you haven't added any content to your layout part.

Do something like:

layoutPart.setJaxbElement(new SldLayout() )

Note that getCSld() will also return null, unless you first give it a value.

As a side note, you can always upload your pptx to http://webapp.docx4java.org/OnlineDemo/PartsList.html to inspect its contents interactively.

JasonPlutext
  • 15,352
  • 4
  • 44
  • 84
  • Thank you for your answer but it does not solve my problem. If I use .setJaxbElement it overwrites the previous content. For testing I created a blank presentation with several default layouts. So content is already available in the "Layout Part". Or do I understand you wrong? Above, I have added the whole error message. Perhaps it is more helpful. – spilymp Mar 25 '15 at 13:17
  • Which version of docx4j are you using? Can you see the contents of your layout part using the PartsList app linked above? – JasonPlutext Mar 25 '15 at 20:46
  • I have updated my post above and I can see the contents of my layout part using the PartList app. – spilymp Mar 27 '15 at 13:11
  • OK, so we know the docx is OK. It must be your environment. What java -version are you using? Googling 'Unknown type of result class javax.xml.transform.dom.DOMResult' .. is saxon on your class path? – JasonPlutext Mar 27 '15 at 20:31