apache-poi/content/components/slideshow/ppt-wmf-emf-renderer.html
2026-02-16 20:14:18 +01:00

773 lines
31 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="Apache Forrest" name="Generator">
<meta name="Forrest-version" content="0.9">
<meta name="Forrest-skin-name" content="pelt">
<title>Rendering slideshows, WMF, EMF and EMF+</title>
<link type="text/css" href="../../skin/basic.css" rel="stylesheet">
<link media="screen" type="text/css" href="../../skin/screen.css" rel="stylesheet">
<link media="print" type="text/css" href="../../skin/print.css" rel="stylesheet">
<link type="text/css" href="../../skin/profile.css" rel="stylesheet">
<script src="../../skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="../../skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="../../skin/fontsize.js" language="javascript" type="text/javascript"></script>
<link rel="shortcut icon" href="../../images/favicon.ico">
</head>
<body onload="init()">
<script type="text/javascript">ndeSetTextSize();</script>
<div id="top">
<!--+
|breadtrail
+-->
<div class="breadtrail">
<a href="https://www.apache.org">Apache Software Foundation</a> &gt; <a href="https://poi.apache.org">Apache POI</a><script src="../../skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
</div>
<!--+
|header
+-->
<div class="header">
<!--+
|start group logo
+-->
<div class="grouplogo">
<a href="https://www.apache.org"><img class="logoImage" alt="Apache Software Foundation" src="../../images/asflogo_horizontal_color.svg" title="The Apache Software Foundation is a cornerstone of the modern Open Source software ecosystem &ndash; supporting some of the most widely used and important software solutions powering today's Internet economy."></a>
</div>
<!--+
|end group logo
+-->
<!--+
|start Project Logo
+-->
<div class="projectlogo">
<a href="https://poi.apache.org"><img class="logoImage" alt="Apache POI" src="../../images/project-header.png" title="Apache POI is well-known in the Java field as a library for reading and writing Microsoft Office file formats, such as Excel, PowerPoint, Word, Visio, Publisher and Outlook. It supports both the older (OLE2) and new (OOXML - Office Open XML) formats."></a>
</div>
<!--+
|end Project Logo
+-->
<!--+
|start Search
+-->
<div class="searchbox">
<form action="https://www.google.com/search" method="get" class="roundtopsmall">
<input value="poi.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp;
<input name="Search" value="Search" type="submit">
</form>
</div>
<!--+
|end search
+-->
<!--+
|start Tabs
+-->
<ul id="tabs">
<li>
<a class="unselected" href="../../index.html">Home</a>
</li>
<li>
<a class="unselected" href="../../help/index.html">Help</a>
</li>
<li class="current">
<a class="selected" href="../../components/index.html">Component APIs</a>
</li>
<li>
<a class="unselected" href="../../devel/index.html">Getting Involved</a>
</li>
</ul>
<!--+
|end Tabs
+-->
</div>
</div>
<div id="main">
<div id="publishedStrip">
<!--+
|start Subtabs
+-->
<div id="level2tabs"></div>
<!--+
|end Endtabs
+-->
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<!--+
|breadtrail
+-->
<div class="breadtrail">
&nbsp;
</div>
<!--+
|start Menu, mainarea
+-->
<!--+
|start Menu
+-->
<div id="menu">
<div onclick="SwitchMenu('menu_selected_1.1', '../../skin/')" id="menu_selected_1.1Title" class="menutitle" style="background-image: url('../../skin/images/chapter_open.gif');">Component APIs</div>
<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
<div class="menuitem">
<a href="../../components/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../../apidocs/index.html">Javadocs</a>
</div>
<div onclick="SwitchMenu('menu_1.1.3', '../../skin/')" id="menu_1.1.3Title" class="menutitle">Excel (HSSF/XSSF)</div>
<div id="menu_1.1.3" class="menuitemgroup">
<div class="menuitem">
<a href="../../components/spreadsheet/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/quick-guide.html">Quick Guide</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/how-to.html">HOWTO</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/converting.html">HSSF to SS Converting</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/formula.html">Formula Support</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/eval.html">Formula Evaluation</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/eval-devguide.html">Eval Dev Guide</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/examples.html">Examples</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/use-case.html">Use Case</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/diagrams.html">Pictorial Docs</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/limitations.html">Limitations</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/user-defined-functions.html">User Defined Functions</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/excelant.html">ExcelAnt Tests</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/hacking-hssf.html">Hacking HSSF</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/record-generator.html">Record Generator</a>
</div>
<div class="menuitem">
<a href="../../components/spreadsheet/chart.html">Charts</a>
</div>
</div>
<div onclick="SwitchMenu('menu_selected_1.1.4', '../../skin/')" id="menu_selected_1.1.4Title" class="menutitle" style="background-image: url('../../skin/images/chapter_open.gif');">PowerPoint (HSLF/XSLF)</div>
<div id="menu_selected_1.1.4" class="selectedmenuitemgroup" style="display: block;">
<div class="menuitem">
<a href="../../components/slideshow/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../../components/slideshow/quick-guide.html">Quick Guide</a>
</div>
<div class="menuitem">
<a href="../../components/slideshow/how-to-shapes.html">HSLF Cookbook</a>
</div>
<div class="menuitem">
<a href="../../components/slideshow/xslf-cookbook.html">XSLF Cookbook</a>
</div>
<div class="menupage">
<div class="menupagetitle">Render SL/WMF/EMF</div>
</div>
<div class="menuitem">
<a href="../../components/slideshow/ppt-file-format.html">PPT File Format</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.1.5', '../../skin/')" id="menu_1.1.5Title" class="menutitle">Word (HWPF/XWPF)</div>
<div id="menu_1.1.5" class="menuitemgroup">
<div class="menuitem">
<a href="../../components/document/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../../components/document/quick-guide.html">HWPF Quick Guide</a>
</div>
<div class="menuitem">
<a href="../../components/document/quick-guide-xwpf.html">XWPF Quick Guide</a>
</div>
<div class="menuitem">
<a href="../../components/document/docoverview.html">HWPF Format</a>
</div>
<div class="menuitem">
<a href="../../components/document/projectplan.html">HWPF Project plan</a>
</div>
</div>
<div class="menuitem">
<a href="../../components/hsmf/index.html">Outlook (HSMF)</a>
</div>
<div class="menuitem">
<a href="../../components/diagram/index.html">Visio (HDGF+XDGF)</a>
</div>
<div onclick="SwitchMenu('menu_1.1.8', '../../skin/')" id="menu_1.1.8Title" class="menutitle">Publisher (HPBF)</div>
<div id="menu_1.1.8" class="menuitemgroup">
<div class="menuitem">
<a href="../../components/hpbf/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../../components/hpbf/file-format.html">File Format</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.1.9', '../../skin/')" id="menu_1.1.9Title" class="menutitle">OLE2 Filesystem (POIFS)</div>
<div id="menu_1.1.9" class="menuitemgroup">
<div class="menuitem">
<a href="../../components/poifs/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../../components/poifs/how-to.html">How To</a>
</div>
<div class="menuitem">
<a href="../../components/poifs/embeded.html">Embedded Documents</a>
</div>
<div class="menuitem">
<a href="../../components/poifs/fileformat.html">File System Documentation</a>
</div>
<div class="menuitem">
<a href="../../components/poifs/usecases.html">Use Cases</a>
</div>
<div class="menuitem">
<a href="../../components/poifs/design.html">Design</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.1.10', '../../skin/')" id="menu_1.1.10Title" class="menutitle">OLE2 Document Props (HPSF)</div>
<div id="menu_1.1.10" class="menuitemgroup">
<div class="menuitem">
<a href="../../components/hpsf/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../../components/hpsf/how-to.html">How To</a>
</div>
<div class="menuitem">
<a href="../../components/hpsf/thumbnails.html">Thumbnails</a>
</div>
<div class="menuitem">
<a href="../../components/hpsf/internals.html">Internals</a>
</div>
<div class="menuitem">
<a href="../../components/hpsf/todo.html">To Do</a>
</div>
</div>
<div class="menuitem">
<a href="../../components/hmef/index.html">TNEF (HMEF) for winmail.dat</a>
</div>
<div class="menuitem">
<a href="../../components/oxml4j/index.html">OpenXML4J (OOXML)</a>
</div>
<div class="menuitem">
<a href="../../components/logging.html">Logging framework</a>
</div>
<div class="menuitem">
<a href="../../components/configuration.html">Configuration</a>
</div>
</div>
<div id="credit"></div>
<div id="roundbottom">
<img style="display: none" class="corner" height="15" width="15" alt="" src="../../skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
<!--+
|alternative credits
+-->
<div id="credit2">
<a href="https://donate.apache.org/"><img border="0" title="Support Apache" alt="Support Apache - logo" src="../../images/support-asf.png" style="width: 125px;height: 125px;"></a><a href="https://www.apache.org/foundation/press/kit/#poweredby"><img border="0" title="powered by POI" alt="powered by POI - logo" src="../../images/poweredby-poi-logo.png" style="width: 125px;height: 125px;"></a>
</div>
</div>
<!--+
|end Menu
+-->
<!--+
|start content
+-->
<div id="content">
<h1>Rendering slideshows, WMF, EMF and EMF+</h1>
<div id="front-matter"></div>
<div class="note">
<div class="label">Note</div>
<div class="content">Please be aware, that the documentation on this page reflects the current development, which might not
have been released. If you rely on an unreleased feature, either use a
<a href="../../download.html">nightly development build</a> or feel free to ask on the
<a href="../../help/index.html">mailing list</a> for the release schedule.</div>
</div>
<a name="Rendering+slideshows%2C+WMF%2C+EMF+and+EMF%2B"></a>
<h2 class="boxed">Rendering slideshows, WMF, EMF and EMF+</h2>
<div class="section">
<p>
For rendering slideshow (HSLF/XSLF), WMF, EMF and EMF+ pictures, POI provides an utility class
<a href="https://github.com/apache/poi/tree/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java?view=markup">
PPTX2PNG</a>:
</p>
<div class="code">
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Usage: PPTX2PNG [options] &lt;.ppt/.pptx/.emf/.wmf file or 'stdin'&gt;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Options:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -scale &lt;float&gt; scale factor</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -fixSide &lt;side&gt; specify side (long,short,width,height) to fix - use &lt;scale&gt; as amount of pixels</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -slide &lt;integer&gt; 1-based index of a slide to render</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -format &lt;type&gt; png,gif,jpg,svg,pdf (log,null for testing)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -outdir &lt;dir&gt; output directory, defaults to origin of the ppt/pptx file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -outfile &lt;file&gt; output filename, defaults to "${basename}-${slideno}.${format}"</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -outpat &lt;pattern&gt; output filename pattern, defaults to "${basename}-${slideno}.${format}"</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> patterns: basename, slideno, format, ext</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -dump &lt;file&gt; dump the annotated records to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -quiet do not write to console (for normal processing)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -ignoreParse ignore parsing error and continue with the records read until the error</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -extractEmbedded extract embedded parts</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -inputType &lt;type&gt; default input file type (OLE2,WMF,EMF), default is OLE2 = Powerpoint</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> some files (usually wmf) don't have a header, i.e. an identifiable file magic</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -textAsShapes text elements are saved as shapes in SVG, necessary for variable spacing</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> often found in math formulas</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -charset &lt;cs&gt; sets the default charset to be used, defaults to Windows-1252</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -emfHeaderBounds force the usage of the emf header bounds to calculate the bounding box</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -fontdir &lt;dir&gt; (PDF only) font directories separated by ";" - use $HOME for current users home dir</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> defaults to the usual plattform directories</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -fontTtf &lt;regex&gt; (PDF only) regex to match the .ttf filenames</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> -fontMap &lt;map&gt; ";"-separated list of font mappings &lt;typeface from&gt;:&lt;typeface to&gt;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<a name="Instructions+to+run"></a>
<h3 class="boxed">Instructions to run</h3>
<p>
Download the <a href="https://ci-builds.apache.org/job/POI/job/POI-DSL-1.8/lastSuccessfulBuild/artifact/build/dist/">current nightly</a>
and for SVG/PDF the <a href="../../components/index.html#components">additional dependencies</a>.</p>
<p>Execute the java command (Unix-paths needs to be replaced for Windows - use "-charset" for non-western WMF/EMFs):</p>
<div class="code">
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">java -cp poi-5.5.1.jar:poi-ooxml-5.5.1.jar:poi-ooxml-lite-5.5.1.jar:poi-scratchpad-5.5.1.jar:lib/*:ooxml-lib/*:auxiliary/* org.apache.poi.xslf.util.PPTX2PNG -format png -fixside long -scale 1000 -charset GBK file.pptx</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<p>
If you want to use the renderer on the module path (JPMS) there a currently a few more steps necessary:
</p>
<ul>
<li>Create a build project using Maven, Gradle or your favorite build tool.</li>
<li>Alternatively, download the jars from https://repo1.maven.org/maven2/org/apache/poi/</li>
<li>Exclude poi-ooxml-full-5.5.1.jar,poi-javadoc-5.5.1.jar and auxiliary/xml-apis-1.4.01.jar (Java 11+) into new subdirectory "unused"</li>
<li>Move all other jars in current directory into a new subdirectory "poi"</li>
<li>Invoke PPTX2PNG:
<div class="code">
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">java --module-path poi:lib:auxiliary:ooxml-lib --module org.apache.poi.ooxml/org.apache.poi.xslf.util.PPTX2PNG -format png -fixside long -scale 1000 file.pptx</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
</li>
</ul>
<div class="note">
<div class="label">Note</div>
<div class="content">
JDK 1.8 is by default using the PiscesRenderingEngine and affected by
<a href="https://github.com/AdoptOpenJDK/openjdk-build/issues/716">Busy loop hangs</a>.
To workaround this, use the MarlinRenderingEngine which is experimental provided starting from
<a href="https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8143849">openjdk8u252 (JDK-8143849)</a>
via <span class="codefrag">-Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine</span> or for older jdk builds,
<a href="https://github.com/bourgesl/marlin-renderer/wiki/How-to-use">preload the marlin jar</a>.
</div>
</div>
</div>
<a name="Integrate+rendering+in+your+code"></a>
<h2 class="boxed">Integrate rendering in your code</h2>
<div class="section">
<a name="%231+-+Use+PPTX2PNG+via+file+or+stdin"></a>
<h3 class="boxed">#1 - Use PPTX2PNG via file or stdin</h3>
<p>For file system access, you need to save your slideshow/WMF/EMF/EMF+ first to disc and then call <span class="codefrag">
PPTX2PNG.main()
</span> with the corresponding parameters.
</p>
<p>for stdin access, you need to redirect <span class="codefrag">System.in</span> before:
</p>
<div class="code">
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">/* the file content */</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">InputStream is = ...;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">/* Save and set System.in */</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">InputStream oldIn = System.in;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.setIn(is);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> String[] args = {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "-format", "png", // png,gif,jpg,svg or null for test</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "-outdir", new File("out/").getCanonicalPath(),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "-outfile", "export.png",</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "-fixside", "long",</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "-scale", "800",</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "-ignoreParse",</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "stdin"</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> };</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> PPTX2PNG.main(args);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">} finally {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.setIn(oldIn);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<a name="%232+-+Render+WMF+%2F+EMF+%2F+EMF%2B+via+the+*Picture+classes"></a>
<h3 class="boxed">#2 - Render WMF / EMF / EMF+ via the *Picture classes</h3>
<div class="code">
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">File f = samples.getFile("santa.wmf");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (FileInputStream fis = new FileInputStream(f)) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // for WMF</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HwmfPicture wmf = new HwmfPicture(fis);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // for EMF / EMF+</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HemfPicture emf = new HemfPicture(fis);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Dimension dim = wmf.getSize();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> int width = Units.pointsToPixel(dim.getWidth());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // keep aspect ratio for height</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> int height = Units.pointsToPixel(dim.getHeight());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> double max = Math.max(width, height);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (max &gt; 1500) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> width *= 1500/max;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> height *= 1500/max;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Graphics2D g = bufImg.createGraphics();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wmf.draw(g, new Rectangle2D.Double(0,0,width,height));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> g.dispose();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> ImageIO.write(bufImg, "PNG", new File("bla.png"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<a name="%233+-+Render+slideshows+directly"></a>
<h3 class="boxed">#3 - Render slideshows directly</h3>
<div class="code">
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">File file = new File("example.pptx");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">double scale = 1.5;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (SlideShow&lt;?, ?&gt; ss = SlideShowFactory.create(file, null, true)) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Dimension pgsize = ss.getPageSize();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> int width = (int) (pgsize.width * scale);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> int height = (int) (pgsize.height * scale);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (Slide&lt;?, ?&gt; slide : ss.getSlides()) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Graphics2D graphics = img.createGraphics();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // default rendering options</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> graphics.setRenderingHint(Drawable.BUFFERED_IMAGE, new WeakReference&lt;&gt;(img));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> graphics.scale(scale, scale);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // draw stuff</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> slide.draw(graphics);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> ImageIO.write(img, "PNG", new File("output.png"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> graphics.dispose();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> img.flush();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
</div>
</div>
<!--+
|end content
+-->
<div class="clearboth">&nbsp;</div>
</div>
<div id="footer">
<!--+
|start bottomstrip
+-->
<div class="lastmodified">
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<div class="copyright">
Copyright &copy;
2001-2026 <a href="https://www.apache.org/">The Apache Software Foundation</a>
<br>
Apache POI, POI, Apache, the Apache logo, and the Apache
POI project logo are trademarks of The Apache Software Foundation.
</div>
<div id="feedback">
Send feedback about the website to:
<a id="feedbackto" href="mailto:dev@poi.apache.org?subject=Feedback%C2%A0components/slideshow/ppt-wmf-emf-renderer.html">dev@poi.apache.org</a>
</div>
<!--+
|end bottomstrip
+-->
</div>
</body>
</html>