Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.pptx4j.convert.out.svginhtml;
  
  
 
 import org.pptx4j.Box;
 
 public class SvgExporter {
 	
 	public static class SvgSettings extends AbstractConversionSettings {
 		public static final String IMAGE_TARGET_URI = "imageTargetUri";
 		
 		public void setImageTargetUri(String imageTargetUri) {
 			.put(imageTargetUri);
 		}
 		
 		public String getImageTargetUri() {
 		}
 	}
 	
 	// NB: file suffix must end with .xhtml in order to see the SVG in a browser
 	
 	protected static Logger log = LoggerFactory.getLogger(SvgExporter.class);	
 
 	public static JAXBContext jcSVG;	
     static ObjectFactory oFactory;
 	static Templates xslt;			
 	static {
 		
 		try {
 			 = JAXBContext.newInstance("org.plutext.jaxb.svg11");
 			 = new ObjectFactory();
 
 			Source xsltSource = new StreamSource(
 						org.docx4j.utils.ResourceUtils.getResource(
 								"org/pptx4j/convert/out/svginhtml/pptx2svginhtml.xslt"));
 			 = XmlUtils.getTransformerTemplate(xsltSource);
 		} catch (Exception e) {
 		} 
 	}
 	
 	private static String imageDirPath;
 	public static void setImageDirPath(String _imageDirPath) {
 		 = _imageDirPath;
 	}


Create an HTML (with SVG) page representing the slide.

Parameters:
presentationMLPackage
slide
Returns:
Throws:
java.lang.Exception
	public static String svg(PresentationMLPackage presentationMLPackage,
			SlidePart slidethrows Exception {
		return svg(presentationMLPackageslidenull);
	}

Create an HTML (with SVG) page representing the slide.

Parameters:
presentationMLPackage
slide
settings
Returns:
Throws:
java.lang.Exception
	public static String svg(PresentationMLPackage presentationMLPackage,
			SlidePart slideSvgSettings settingsthrows Exception {
    	ResolvedLayout rl = ((SlidePart)slide).getResolvedLayout();	
//    	System.out.println( XmlUtils.marshaltoString(rl.getShapeTree(), false, true, Context.jcPML,
//		"http://schemas.openxmlformats.org/presentationml/2006/main", "spTree", GroupShape.class) );
    	
    	return SvgExporter.svg(presentationMLPackagerlsettings);
	}

Parameters:
presentationMLPackage
layout
Returns:
Throws:
java.lang.Exception
	private static String svg(PresentationMLPackage presentationMLPackage,
			ResolvedLayout layoutSvgSettings settingsthrows Exception {
		Result intermediateResult =  new StreamResultintermediate );
		svg(presentationMLPackagelayoutintermediateResultsettings);
		return intermediate.toString("UTF-8");
		//log.info(svg);
	}
	private static void svg(PresentationMLPackage presentationMLPackage,
			SvgSettings settingsthrows Exception {
    SvgConversionContext context = null;			
				layout.getShapeTree(),
				"http://schemas.openxmlformats.org/presentationml/2006/main""spTree"GroupShape.class); 	
		if (settings == null) {
			settings = new SvgSettings();
		}
		if ((settings.getImageDirPath() == null) && ( != null)) {
		}
		context = new SvgConversionContext(settingspresentationMLPackagelayout);
		org.docx4j.XmlUtils.transform(doccontext.getXsltParameters(), result);
	}
	public static boolean isDebugEnabled() {
	}
    public static DocumentFragment createBlockForP
    		SvgConversionContext context,
    		String lvl,
    		String cNvPrName,
    		String phTypeNodeIterator childResultsNodeIterator lvlNpPr ) {
    	    	
    	
		StyleTree styleTree = null;
		try {
			styleTree = context.getPmlPackage().getStyleTree();
catch (InvalidFormatException e1) {
			// TODO Auto-generated catch block
		}
    	
		.debug("lvl:" +lvl);
		int level;
		if (lvl.equals("NaN")) {
			level = 1;
else {
			level = Integer.parseInt(lvl);
		}
		String pStyleVal;
    	
		..println("cNvPrName: " + cNvPrName + "; " + "phType: " + phType );
		if (cNvPrName.toLowerCase().indexOf("subtitle")>-1
				|| phType.toLowerCase().indexOf("subtitle")>-1) {
			// Subtitle on first page in default layout is styled as a Body.
				pStyleVal = "Lvl" + level + "Master" + context.getResolvedLayout().getMasterNumber() + "Body";
else if (cNvPrName.toLowerCase().indexOf("title")>-1
			|| phType.toLowerCase().indexOf("title")>-1) {
			pStyleVal = "Lvl" + level + "Master" + context.getResolvedLayout().getMasterNumber() + "Title";
else {
			// eg cNvPrName: TextBox 2; phType:
			pStyleVal = "Lvl" + level + "Master" + context.getResolvedLayout().getMasterNumber() + "Other";			
		}
		..println("--> " + pStyleVal );
        try {
        	
        	
            // Create a DOM builder and parse the fragment			
        	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        
			Document document = factory.newDocumentBuilder().newDocument();
			//log.info("Document: " + document.getClass().getName() );
			Node xhtmlP = document.createElement("p");			
			document.appendChild(xhtmlP);
									    
			// Set @class
			.debug(pStyleVal);
			Tree<AugmentedStylepTree = styleTree.getParagraphStylesTree();		
			org.docx4j.model.styles.Node<AugmentedStyleasn = pTree.get(pStyleVal);
			((Element)xhtmlP).setAttribute("class"
					StyleTree.getHtmlClassAttributeValue(pTreeasn)			
			);
			StringBuilder inlineStyle =  new StringBuilder();
			// Do we have CTTextParagraphProperties
			// <a:lvl?pPr>
			// Convert it to a WordML pPr
			if (lvlPPr!=null) {
				.debug("We have lvlPPr");
						XmlUtils.marshaltoString(lvlPPrtruetrue
								."FIXME""lvl1pPr",
						);
				PPr pPr = TextStyles.getWmlPPr(lvlPPr);
				if (pPr!=null) {
					HtmlCssHelper.createCss(context.getPmlPackage(), pPrinlineStylefalse);				
				}
				// TODO RPR
			}
			// Without this, top-margin is too large in Webkit (Midor).
			// Not tested elsewhere...
			inlineStyle.append("margin-left:3px; margin-top:3px;");
			if (!inlineStyle.toString().equals("") ) {
				((Element)xhtmlP).setAttribute("style"inlineStyle.toString() );
			}
			// Our fo:block wraps whatever result tree fragment
			// our style sheet produced when it applied-templates
			// to the child nodes
			// init
			Node n = childResults.nextNode();
			do {	
				// getNumberXmlNode creates a span node, which is empty
				// if there is no numbering.
				// Let's get rid of any such <span/>.
				// What we actually get is a document node
					.debug("handling DOCUMENT_NODE");
					// Do just enough of the handling here
	                NodeList nodes = n.getChildNodes();
	                if (nodes != null) {
	                    for (int i=0; i<nodes.getLength(); i++) {
	                    	
	        				if (((Node)nodes.item(i)).getLocalName().equals("span")
	        						&& ! ((Node)nodes.item(i)).hasChildNodes() ) {
	        					// ignore
	        					.debug(".. ignoring <span/> ");
	        				} else {
	        					XmlUtils.treeCopy( (Node)nodes.item(i),  xhtmlP );	        					
	        				}
	                    }
	                }					
else {
	//					log.info("Node we are importing: " + n.getClass().getName() );
	//					foBlockElement.appendChild(
	//							document.importNode(n, true) );
					/*
					 * Node we'd like to import is of type org.apache.xml.dtm.ref.DTMNodeProxy
					 * which causes
					 * org.w3c.dom.DOMException: NOT_SUPPORTED_ERR: The implementation does not support the requested type of object or operation.
					 * 
					 * See http://osdir.com/ml/text.xml.xerces-j.devel/2004-04/msg00066.html
					 * 
					 * So instead of importNode, use 
					 */
					XmlUtils.treeCopyn,  xhtmlP );
				}
				// next 
				n = childResults.nextNode();
while ( n !=null ); 
			docfrag.appendChild(document.getDocumentElement());
			return docfrag;
catch (Exception e) {
    	
    	return null;
    	
    }
	// Get the pPr node as a JAXB object,
	// so we can read it using our standard
	// methods.  Its a bit sad that we 
	// can't just adorn our DOM tree with the
	// original JAXB objects?
	try {
		//CTTextListStyle lstStyle = null;
		if (lvlNpPr!=null) {
			Node n = lvlNpPr.nextNode();
			String str = XmlUtils.w3CDomNodeToString(n);
			//log.debug("'" + str + "'");
			// Convert to String first ... 
			// unmarshalling the node directly doesn't work as expected
			// (see comment in XmlUtils) 
//			if (n!=null) {
//				return  (CTTextParagraphProperties)XmlUtils.unmarshal(n, Context.jcPML, 
//						CTTextParagraphProperties.class);
//			}
			if (!str.equals("")) {
			}
		}
catch (Exception e) {
		// TODO Auto-generated catch block
	return null;
			SvgConversionContext contextNodeIterator rPrNodeIt,
			NodeIterator childResults) {
		DocumentFragment docfrag = null;
		Document d = null;
		Element span = null;
		try {
			// Create a DOM builder and parse the fragment
			DocumentBuilderFactory factory = DocumentBuilderFactory
			span = d.createElement("span");
			d.appendChild(span);
					rPrNodeIt.nextNode(), CTTextCharacterProperties.class);
			RPr rPr = TextStyles.getWmlRPr(textCharProps);
			// Does our rPr contain anything else?
			StringBuilder inlineStyle = new StringBuilder();
			HtmlCssHelper.createCss(context.getPmlPackage(), rPrinlineStyle);
			if (!inlineStyle.toString().equals("")) {
				span.setAttribute("style"inlineStyle.toString());
			}
			Node n = childResults.nextNode();
			XmlUtils.treeCopy(nspan);
catch (Exception e) {
			// If something went wrong with the formatting,
			// still try to display the text!
			Node n = childResults.nextNode();
			XmlUtils.treeCopy(nspan);
		}
		// Machinery
		docfrag = d.createDocumentFragment();
		return docfrag;
	}
	//    public static CTTextListStyle unmarshalFormatting(NodeIterator lstStyleNodeIt ) {
//		
//    	// Get the pPr node as a JAXB object,
//    	// so we can read it using our standard
//    	// methods.  Its a bit sad that we 
//    	// can't just adorn our DOM tree with the
//    	// original JAXB objects?
//    	try {
//			CTTextListStyle lstStyle = null;
//			if (lstStyleNodeIt!=null) {
//				Node n = lstStyleNodeIt.nextNode();
//				if (n!=null) {
//					return  (CTTextListStyle)XmlUtils.unmarshal(n, Context.jcPML, CTTextListStyle.class);
//				}
//			}
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} 
//		return null;
//    	
//    }
    public static String getCssForStyles(SvgConversionContext context) {
    	
    	StringBuilder result = new StringBuilder();
    	
		StyleTree styleTree=null;
		try {
			styleTree = context.getPmlPackage().getStyleTree();
catch (InvalidFormatException e) {
			// TODO Auto-generated catch block
		}
		// Second iteration - paragraph level pPr *and rPr*
		result.append("\n /* PARAGRAPH STYLES */ \n");    	
		Tree<AugmentedStylepTree = styleTree.getParagraphStylesTree();		
    	for (org.docx4j.model.styles.Node<AugmentedStylen : pTree.toList() ) {
    		Style s = n.getData().getStyle();
    		result.append"."s.getStyleId()  + " {display:block;" );
        	if (s.getPPr()==null) {
        		.debug("null pPr for style " + s.getStyleId());
        	} else {
        		HtmlCssHelper.createCss(context.getPmlPackage(), s.getPPr(), resultfalse );
        	}
        	if (s.getRPr()==null) {
        		.debug("null rPr for style " + s.getStyleId());
        	} else {
        		HtmlCssHelper.createCss(context.getPmlPackage(), s.getRPr(), result);
        	}
        	result.append"}\n" );        	
    	}
		    	    	
    	if (.isDebugEnabled()) {
    		return result.toString();
    	} else {
    		String debug = result.toString();
    		return debug;
    	}
    }
    
    public static DocumentFragment shapeToSVG
    		SvgConversionContext context,
    		NodeIterator shapeIt ) {
    	
    	DocumentFragment docfrag=null;
    	Document d=null;
    	
    	try {
    		Object shape = null;    		
    		if (shapeIt!=null) {
    			Node n = shapeIt.nextNode();
    			if (n==null) {
    				d=makeErr"[null node?!]" );
    			} else {
	    			.debug("Handling " + n.getNodeName());
	    			
	    			if (n.getNodeName().equals("p:cxnSp") ) {
	    				
	    				shape = nodeToObjectModel(nCxnSp.class);    				
	    				d = CxnSpToSVG( (CxnSp)shape);
	    				
	    			} else {    			
		    			.info("** TODO " + n.getNodeName() );
	    				d=makeErr"[" + n.getNodeName() + "]" );
	    			}
    			}
    		}
    	} catch (Exception e) {
		}
    	
		// Machinery
		docfrag = d.createDocumentFragment();
		return docfrag;    	
    }
    
    
    
Connection (line)
    public static Document CxnSpToSVG(CxnSp cxnSp) {
    	
    	// Geometrical transforms
    	CTTransform2D xfrm = cxnSp.getSpPr().getXfrm();
    	Box b = new Box(xfrm.getOff().getX(), xfrm.getOff().getY(),
    			xfrm.getExt().getCx(), xfrm.getExt().getCy() );
    	
    	if (xfrm.getRot()!=0) {
    		b.rotate(xfrm.getRot());
    	}
    	if (xfrm.isFlipH() ) {
    		b.flipH();
    	}
    	if (xfrm.isFlipV() ) {
    		b.flipV();
    	}
    	
    	// Convert from EMU to pixels
    	b.toPixels();
    	// Wrap in a div positioning it on the page
    	Document document = createDocument();
		Element xhtmlDiv = document.createElement("div");
		// Firefox needs the following; Chrome doesn't
		xhtmlDiv.setAttribute("style"
				"position: absolute; width:100%; height:100%; left:0px; top:0px;");		
		Node n = document.appendChild(xhtmlDiv);
    	
    	// Convert the object itself to SVG
    	Line line = .createLine();
    	
    	line.setX1(b.getOffset().getXAsString() );
    	line.setY1(b.getOffset().getYAsString() );
    	
    	Point otherEnd = b.getOtherCorner();
    	
    	line.setX2otherEnd.getXAsString() );
    	line.setY2otherEnd.getYAsString() );
    	line.setStyle("stroke:rgb(99,99,99)");
    	// You can't see the line in Midori, unless you specify the color.
    	// width eg stroke-width:2 is optional
    	
    	Document d2 = XmlUtils.marshaltoW3CDomDocument(svg);   
    	XmlUtils.treeCopy(d2n);
    	return document;
    	
    }
    private static Document makeErr(String msg) {
    	Document d=null;
    	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        
		 try {
			// TODO Auto-generated catch block
		}
		Element span = d.createElement("span");
		span.setAttribute("style""color:red;");
		d.appendChild(span);
		Text err = d.createTextNodemsg );
		span.appendChild(err);
		return d;
    }
    public static Object nodeToObjectModel(Node nClass declaredTypethrows Docx4JException {
    	
    	if (n==null) {
    		throw new Docx4JException("null input");
    	}
    	
//    	if (log.isDebugEnabled() ) {
//    		System.out.println("IN: " + XmlUtils.w3CDomNodeToString(n));
//    	}
    	
		Object jaxb=null;
		try {
			jaxb = XmlUtils.unmarshal(n.declaredType); 
catch (JAXBException e1) {
			throw new Docx4JException("Couldn't unmarshall " + XmlUtils.w3CDomNodeToString(n), e1);
		}
		try {
			if (jaxb instanceof JAXBElement ) {
				JAXBElement jb = (JAXBElement)jaxb;
				if (jb.getDeclaredType().getName().equals(declaredType.getName() )) {
					return jb.getValue();
else {
    				.error("UNEXPECTED " +
    						XmlUtils.JAXBElementDebug(jb)
    						);
    				throw new Docx4JException("Expected " + declaredType.getName() + " but got " +
    						XmlUtils.JAXBElementDebug(jb) );
				}
else if (jaxb.getClass().getName().equals(declaredType.getName() )) {    				
				return jaxb;
else {
				.errorjaxb.getClass().getName() ); 
				throw new Docx4JException("Expected " + declaredType.getName() + " but got " +
						jaxb.getClass().getName() );
			}
catch (ClassCastException e) {
			throw new Docx4JException("Expected " + declaredType.getName() + " but got " +
					jaxb.getClass().getName(), e );
		}        	        			    	
    }
    
    public static Document createDocument() {
    	
    	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        
		Document document=null;
		try {
			document = factory.newDocumentBuilder().newDocument();
		}
		return document;
    }
New to GrepCode? Check out our FAQ X