blob: dbe089ac300ac2541a47ff4ece23a1a92e6e2c16 [file] [log] [blame]
/*
* ====================================================================
* 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());
}
}
}
}