]> source.dussan.org Git - poi.git/commitdiff
add example to link video to slideshow
authorAndreas Beeker <kiwiwings@apache.org>
Thu, 3 Dec 2020 19:00:37 +0000 (19:00 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Thu, 3 Dec 2020 19:00:37 +0000 (19:00 +0000)
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

src/examples/src/org/apache/poi/examples/xslf/LinkVideoToPptx.java [new file with mode: 0644]
src/examples/src/org/apache/poi/examples/xslf/PPTX2SVG.txt [deleted file]

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 (file)
index 0000000..4d52698
--- /dev/null
@@ -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 (file)
index dbe089a..0000000
+++ /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  <pptx file>");
-    }
-
-    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());
-            }
-        }
-
-    }
-}