package org.pptx4j.convert.out.svginhtml; import javax.xml.bind.JAXBException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.docx4j.XmlUtils; import org.docx4j.dml.CTBlip; import org.docx4j.dml.CTPoint2D; import org.docx4j.dml.CTPositiveSize2D; import org.docx4j.model.images.AbstractWordXmlPicture; import org.docx4j.openpackaging.parts.Part; import org.w3c.dom.DocumentFragment; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.traversal.NodeIterator; public class PictureExporter extends AbstractWordXmlPicture { /** * <p:pic> <p:nvPicPr> <p:cNvPr id="1026" name="Picture 2"/> <p:cNvPicPr> <a:picLocks noChangeAspect="1" noChangeArrowheads="1"/> </p:cNvPicPr> <p:nvPr/> </p:nvPicPr> <p:blipFill> <a:blip r:embed="rId2"/> <----------------------- <a:srcRect/> <a:stretch> <a:fillRect/> </a:stretch> </p:blipFill> <p:spPr bwMode="auto"> <a:xfrm> <a:off x="1357290" y="3643314"/> <a:ext cx="619125" cy="742950"/> </a:xfrm> <a:prstGeom prst="rect"> <a:avLst/> </a:prstGeom> <a:noFill/> <a:ln w="9525"> <a:noFill/> <a:miter lim="800000"/> <a:headEnd/> <a:tailEnd/> </a:ln> <a:effectLst/> </p:spPr> </p:pic> */ protected static Logger log = LoggerFactory.getLogger(PictureExporter.class); public static DocumentFragment createHtmlImg( SvgConversionContext context, NodeIterator wpInline) { PictureExporter converter = createPicture(context, wpInline); DocumentFragment df = getHtmlDocumentFragment(converter); // Now wrap // <div style="position: absolute; width:300px; height:39px; left:360px; top:255px; border: red dashed;"> // around it CTPoint2D offset = converter.pic.getSpPr().getXfrm().getOff(); Dimensions xy = converter.readDimensions( offset.getX(), offset.getY() ); /* * TODO, USE: * * // 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(); * */ Element div = df.getOwnerDocument().createElement("div"); div.setAttribute("style", "position:absolute; left:" + xy.width + "px; top:" + xy.height + "px;"); Node img = df.getFirstChild(); df.removeChild(img); df.appendChild(div); div.appendChild(img); return df; } org.pptx4j.pml.Pic pic=null; public static PictureExporter createPicture(SvgConversionContext context, NodeIterator anchorOrInline) { PictureExporter converter = new PictureExporter(); try { Node n = anchorOrInline.nextNode(); converter.pic = (org.pptx4j.pml.Pic)XmlUtils.unmarshal(n, org.pptx4j.jaxb.Context.jcPML, org.pptx4j.pml.Pic.class); } catch (JAXBException e1) { e1.printStackTrace(); } log.info("** image: " + converter.pic.getClass().getName() ); if (converter.pic.getBlipFill()==null || converter.pic.getBlipFill().getBlip()==null) { log.error("blip missing!!"); return null; } CTBlip blip = converter.pic.getBlipFill().getBlip(); String imgRelId = blip.getEmbed(); if (imgRelId!=null) { converter.handleImageRel(context.getImageHandler(), imgRelId, (Part)context.getResolvedLayout().relationships.getSourceP()); } else if (blip.getLink()!=null) { converter.handleImageRel(context.getImageHandler(), blip.getLink(), (Part)context.getResolvedLayout().relationships.getSourceP()); } else { log.error("not linked or embedded?!"); } converter.dimensions = converter.readDimensions( converter.pic.getSpPr().getXfrm().getExt()); // TODO: <a:off x="1357290" y="3643314"/> return converter; } private final int extentToPixelConversionFactor = 9525; //12700; private Dimensions readDimensions(long x, long y) { Dimensions dimensions = new Dimensions(); dimensions.width= (int) x / extentToPixelConversionFactor; dimensions.widthUnit = "px"; dimensions.height= (int) y / extentToPixelConversionFactor; dimensions.heightUnit = "px"; return dimensions; } private Dimensions readDimensions(CTPositiveSize2D size2d) { /* <p:spPr bwMode="auto"> <a:xfrm> <a:off x="1357290" y="3643314"/> <a:ext cx="619125" cy="742950"/> </a:xfrm> */ if (size2d==null) { log.warn("wp:inline/wp:extent missing!"); return null; } return readDimensions(size2d.getCx(), size2d.getCy() ); } }