如何在 pptx4j 中获取 slideLayout 的名称?
How to get name of slideLayout in pptx4j?
我使用 pptx4j 加载现有的演示文稿,我需要每个布局的名称。使用以下代码,我认为它应该可以工作:
// 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);
}
但是我得到了 layoutPart.getJaxbElement()
的 NullPointerException。这是错误的方法还是为什么会出现此错误?
整个异常:
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)
因为添加内容 slideLayout1.xml
存在,我可以用它来创建新幻灯片。
希望有人能给我提示。如果需要其他信息,请询问。
更新
我使用的是 3.0.1 版本,所以我更新到 3.2.1 并稍微更改了我的代码。现在 NullPointerException 消失了,但我仍然得到 layoutPart.getContents().getCSld()
:
的 IllegalArgumentException
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
看来您正在正确访问部件集合。
假设 layoutPart 不为 null,但 layoutPart.getJaxbElement() 为 null,那么问题是您尚未向布局部分添加任何内容。
做类似的事情:
layoutPart.setJaxbElement(new SldLayout() )
请注意,getCSld() 也将 return 为 null,除非您先给它一个值。
附带说明一下,您可以随时将 pptx 上传到 http://webapp.docx4java.org/OnlineDemo/PartsList.html 以交互方式检查其内容。
问题是我使用的库之间存在某些依赖关系。不幸的是,我不能说是哪个图书馆。现在只有 saxon
和 docx4j
才有效。如果我能重现我的问题,我会在这里添加它。
@JasonPlutext 感谢您的回答和提示!
我使用 pptx4j 加载现有的演示文稿,我需要每个布局的名称。使用以下代码,我认为它应该可以工作:
// 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);
}
但是我得到了 layoutPart.getJaxbElement()
的 NullPointerException。这是错误的方法还是为什么会出现此错误?
整个异常:
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)
因为添加内容 slideLayout1.xml
存在,我可以用它来创建新幻灯片。
希望有人能给我提示。如果需要其他信息,请询问。
更新
我使用的是 3.0.1 版本,所以我更新到 3.2.1 并稍微更改了我的代码。现在 NullPointerException 消失了,但我仍然得到 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
看来您正在正确访问部件集合。
假设 layoutPart 不为 null,但 layoutPart.getJaxbElement() 为 null,那么问题是您尚未向布局部分添加任何内容。
做类似的事情:
layoutPart.setJaxbElement(new SldLayout() )
请注意,getCSld() 也将 return 为 null,除非您先给它一个值。
附带说明一下,您可以随时将 pptx 上传到 http://webapp.docx4java.org/OnlineDemo/PartsList.html 以交互方式检查其内容。
问题是我使用的库之间存在某些依赖关系。不幸的是,我不能说是哪个图书馆。现在只有 saxon
和 docx4j
才有效。如果我能重现我的问题,我会在这里添加它。
@JasonPlutext 感谢您的回答和提示!