diff options
author | Yegor Kozlov <yegor@apache.org> | 2011-11-07 13:22:04 +0000 |
---|---|---|
committer | Yegor Kozlov <yegor@apache.org> | 2011-11-07 13:22:04 +0000 |
commit | b0a7faba08c6dccb4ce7e35663dbaf75fa060dbe (patch) | |
tree | 4b358d9a4c60da7427181255fea1325ae3c1f70b /src/examples | |
parent | 8a841f238053e4b58b7776dfd468e9d6c163f11a (diff) | |
download | poi-b0a7faba08c6dccb4ce7e35663dbaf75fa060dbe.tar.gz poi-b0a7faba08c6dccb4ce7e35663dbaf75fa060dbe.zip |
keep rat-check quiet, also started writing xslf docs
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1198722 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/examples')
-rw-r--r-- | src/examples/src/org/apache/poi/xslf/usermodel/PPTX2SVG.txt | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/PPTX2SVG.txt b/src/examples/src/org/apache/poi/xslf/usermodel/PPTX2SVG.txt new file mode 100644 index 0000000000..dbe089ac30 --- /dev/null +++ b/src/examples/src/org/apache/poi/xslf/usermodel/PPTX2SVG.txt @@ -0,0 +1,176 @@ +/* + * ==================================================================== + * 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()); + } + } + + } +} |