mirror of https://github.com/apache/poi.git
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
This commit is contained in:
parent
0147917c9a
commit
36bf732641
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue