From 36bf732641cfc928f90d379189d7489040cfaa3e Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Thu, 3 Dec 2020 19:00:37 +0000 Subject: [PATCH] add example to link video to slideshow PPTX2SVG.txt is not necessary anymore with PPTX2PNG providing that function git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1884075 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/examples/xslf/LinkVideoToPptx.java | 98 ++++++++++ .../org/apache/poi/examples/xslf/PPTX2SVG.txt | 176 ------------------ 2 files changed, 98 insertions(+), 176 deletions(-) create mode 100644 src/examples/src/org/apache/poi/examples/xslf/LinkVideoToPptx.java delete mode 100644 src/examples/src/org/apache/poi/examples/xslf/PPTX2SVG.txt diff --git a/src/examples/src/org/apache/poi/examples/xslf/LinkVideoToPptx.java b/src/examples/src/org/apache/poi/examples/xslf/LinkVideoToPptx.java new file mode 100644 index 0000000000..4d52698966 --- /dev/null +++ b/src/examples/src/org/apache/poi/examples/xslf/LinkVideoToPptx.java @@ -0,0 +1,98 @@ +package org.apache.poi.examples.xslf; + +import static org.apache.poi.openxml4j.opc.PackageRelationshipTypes.CORE_PROPERTIES_ECMA376_NS; + +import java.awt.Rectangle; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import javax.xml.namespace.QName; + +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.openxml4j.opc.TargetMode; +import org.apache.poi.sl.usermodel.PictureData; +import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.apache.poi.xslf.usermodel.XSLFPictureData; +import org.apache.poi.xslf.usermodel.XSLFPictureShape; +import org.apache.poi.xslf.usermodel.XSLFSlide; +import org.apache.xmlbeans.XmlCursor; +import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink; +import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps; +import org.openxmlformats.schemas.presentationml.x2006.main.CTExtension; +import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; +import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide; +import org.openxmlformats.schemas.presentationml.x2006.main.CTTLCommonMediaNodeData; +import org.openxmlformats.schemas.presentationml.x2006.main.CTTLCommonTimeNodeData; +import org.openxmlformats.schemas.presentationml.x2006.main.CTTimeNodeList; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeIndefinite; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeFillType; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeRestartType; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeType; + +public class LinkVideoToPptx { + public static void main(String[] args) throws IOException, URISyntaxException { + XMLSlideShow pptx = new XMLSlideShow(); + + String videoFileName = "file_example_MP4_640_3MG.mp4"; + XSLFSlide slide1 = pptx.createSlide(); + + PackagePart pp = slide1.getPackagePart(); + URI mp4uri = new URI("./"+videoFileName); + PackageRelationship prsEmbed1 = pp.addRelationship(mp4uri, TargetMode.EXTERNAL, "http://schemas.microsoft.com/office/2007/relationships/media"); + PackageRelationship prsExec1 = pp.addRelationship(mp4uri, TargetMode.EXTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/video"); + + + File previewJpg = new File("preview.jpg"); + XSLFPictureData snap = pptx.addPicture(previewJpg, PictureData.PictureType.JPEG); + XSLFPictureShape pic1 = slide1.createPicture(snap); + pic1.setAnchor(new Rectangle(100, 100, 500, 400)); + + CTPicture xpic1 = (CTPicture)pic1.getXmlObject(); + CTHyperlink link1 = xpic1.getNvPicPr().getCNvPr().addNewHlinkClick(); + link1.setId(""); + link1.setAction("ppaction://media"); + + + CTApplicationNonVisualDrawingProps nvPr = xpic1.getNvPicPr().getNvPr(); + nvPr.addNewVideoFile().setLink(prsExec1.getId()); + CTExtension ext = nvPr.addNewExtLst().addNewExt(); + ext.setUri("{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}"); + + String p14Ns = "http://schemas.microsoft.com/office/powerpoint/2010/main"; + XmlCursor cur = ext.newCursor(); + cur.toEndToken(); + cur.beginElement(new QName(p14Ns, "media", "p14")); + cur.insertNamespace("p14", p14Ns); + cur.insertAttributeWithValue(new QName(CORE_PROPERTIES_ECMA376_NS, "link"), prsEmbed1.getId()); + cur.dispose(); + + + CTSlide xslide = slide1.getXmlObject(); + CTTimeNodeList ctnl; + if (!xslide.isSetTiming()) { + CTTLCommonTimeNodeData ctn = xslide.addNewTiming().addNewTnLst().addNewPar().addNewCTn(); + ctn.setDur(STTLTimeIndefinite.INDEFINITE); + ctn.setRestart(STTLTimeNodeRestartType.NEVER); + ctn.setNodeType(STTLTimeNodeType.TM_ROOT); + ctnl = ctn.addNewChildTnLst(); + } else { + ctnl = xslide.getTiming().getTnLst().getParArray(0).getCTn().getChildTnLst(); + } + CTTLCommonMediaNodeData cmedia = ctnl.addNewVideo().addNewCMediaNode(); + cmedia.setVol(80000); + CTTLCommonTimeNodeData ctn = cmedia.addNewCTn(); + ctn.setFill(STTLTimeNodeFillType.HOLD); + ctn.setDisplay(false); + ctn.addNewStCondLst().addNewCond().setDelay(STTLTimeIndefinite.INDEFINITE); + cmedia.addNewTgtEl().addNewSpTgt().setSpid(""+pic1.getShapeId()); + + + try (FileOutputStream fos = new FileOutputStream("mp4test/mp4test-poi.pptx")) { + pptx.write(fos); + } + } +} diff --git a/src/examples/src/org/apache/poi/examples/xslf/PPTX2SVG.txt b/src/examples/src/org/apache/poi/examples/xslf/PPTX2SVG.txt deleted file mode 100644 index dbe089ac30..0000000000 --- a/src/examples/src/org/apache/poi/examples/xslf/PPTX2SVG.txt +++ /dev/null @@ -1,176 +0,0 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ==================================================================== - */ - -package org.apache.poi.xslf.usermodel; - -import org.apache.batik.dom.svg.SVGDOMImplementation; -import org.apache.batik.svggen.SVGGraphics2D; -import org.apache.batik.transcoder.wmf.tosvg.WMFPainter; -import org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore; -import org.apache.poi.openxml4j.opc.OPCPackage; -import org.apache.poi.openxml4j.opc.PackagePart; -import org.w3c.dom.DOMImplementation; -import org.w3c.dom.Document; - -import javax.imageio.ImageIO; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.io.DataInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; - -/** - * Convert each slide of a .pptx presentation into SVG - * - * @author Yegor Kozlov - */ -public class PPTX2SVG { - - static void usage() { - System.out.println("Usage: PPTX2SVG "); - } - - public static void main(String[] args) throws Exception { - if (args.length == 0) { - usage(); - return; - } - - String file = args[0]; - - System.out.println("Processing " + file); - - // read the .pptx file - XMLSlideShow ppt = new XMLSlideShow(OPCPackage.open(file)); - - Dimension pgsize = ppt.getPageSize(); - - // convert each slide into a .svg file - XSLFSlide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - // Create initial SVG DOM - DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation(); - Document doc = domImpl.createDocument("http://www.w3.org/2000/svg", "svg", null); - //Use Batik SVG Graphics2D driver - SVGGraphics2D graphics = new SVGGraphics2D(doc); - graphics.setRenderingHint(XSLFRenderingHint.IMAGE_RENDERER, new WMFImageRender()); - graphics.setSVGCanvasSize(pgsize); - - String title = slide[i].getTitle(); - System.out.println("Rendering slide " + (i + 1) + (title == null ? "" : ": " + title)); - - // draw stuff. All the heavy-lifting happens here - slide[i].draw(graphics); - - // save the result. - int sep = file.lastIndexOf("."); - String fname = file.substring(0, sep == -1 ? file.length() : sep) + "-" + (i + 1) + ".svg"; - OutputStreamWriter out = - new OutputStreamWriter(new FileOutputStream(fname), "UTF-8"); - DOMSource domSource = new DOMSource(graphics.getRoot()); - StreamResult streamResult = new StreamResult(out); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer serializer = tf.newTransformer(); - serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); - serializer.setOutputProperty(OutputKeys.INDENT, "yes"); - serializer.transform(domSource, streamResult); - out.flush(); - out.close(); - } - System.out.println("Done"); - } - - /** - * Image renderer with support for .wmf images - */ - static class WMFImageRender extends XSLFImageRendener { - - /** - * Use Apache Batik to render WMF, - * delegate all other types of images to the javax.imageio framework - */ - @Override - public boolean drawImage(Graphics2D graphics, XSLFPictureData data, - Rectangle2D anchor) { - try { - // see what type of image we are - PackagePart part = data.getPackagePart(); - String contentType = part.getContentType(); - if (contentType.equals("image/x-wmf")) { - WMFRecordStore currentStore = new WMFRecordStore(); - currentStore.read(new DataInputStream(part.getInputStream())); - int wmfwidth = currentStore.getWidthPixels(); - float conv = (float) anchor.getWidth() / wmfwidth; - - // Build a painter for the RecordStore - WMFPainter painter = new WMFPainter(currentStore, - (int) anchor.getX(), (int) anchor.getY(), conv); - painter.paint(graphics); - } else { - BufferedImage img = ImageIO.read(data.getPackagePart().getInputStream()); - graphics.drawImage(img, - (int) anchor.getX(), (int) anchor.getY(), - (int) anchor.getWidth(), (int) anchor.getHeight(), null); - } - } catch (Exception e) { - return false; - } - return true; - } - - /** - * Convert data form the supplied package part into a BufferedImage. - * This method is used to create texture paint. - */ - @Override - public BufferedImage readImage(PackagePart packagePart) throws IOException { - String contentType = packagePart.getContentType(); - if (contentType.equals("image/x-wmf")) { - try { - WMFRecordStore currentStore = new WMFRecordStore(); - currentStore.read(new DataInputStream(packagePart.getInputStream())); - int wmfwidth = currentStore.getWidthPixels(); - int wmfheight = currentStore.getHeightPixels(); - - BufferedImage img = new BufferedImage(wmfwidth, wmfheight, BufferedImage.TYPE_INT_RGB); - Graphics2D graphics = img.createGraphics(); - - // Build a painter for the RecordStore - WMFPainter painter = new WMFPainter(currentStore, 0, 0, 1.0f); - painter.paint(graphics); - - return img; - } catch (IOException e) { - return null; - } - } else { - return ImageIO.read(packagePart.getInputStream()); - } - } - - } -} -- 2.39.5