f8f7dc37cb
https://svn.apache.org/repos/asf/poi/trunk ........ r682620 | yegor | 2008-08-05 09:05:54 +0100 (Tue, 05 Aug 2008) | 1 line when a new RowRecord is created, the default row height shoud be 0xFF. The DEFAULT_HEIGHT_BIT (0x8000) is optional, some clients like OpenOffice 2.3 and earlier don't understand it ........ r682621 | yegor | 2008-08-05 09:06:50 +0100 (Tue, 05 Aug 2008) | 1 line fixed bug #44692: HSSFPicture.resize() stretched image when there was a text next to it ........ git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@682760 13f79535-47bb-0310-9956-ffa450edef68
669 lines
25 KiB
XML
669 lines
25 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!--
|
|
====================================================================
|
|
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.
|
|
====================================================================
|
|
-->
|
|
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.1//EN" "../dtd/document-v11.dtd">
|
|
|
|
<document>
|
|
<header>
|
|
<title>Busy Developers' Guide to HSLF drawing layer</title>
|
|
<authors>
|
|
<person email="yegor@dinom.ru" name="Yegor Kozlov" id="CO"/>
|
|
</authors>
|
|
</header>
|
|
<body>
|
|
<section><title>Busy Developers' Guide to HSLF drawing layer</title>
|
|
<section><title>Index of Features</title>
|
|
<ul>
|
|
<li><link href="#NewPresentation">How to create a new presentation and add new slides to it</link></li>
|
|
<li><link href="#PageSize">How to retrieve or change slide size</link></li>
|
|
<li><link href="#GetShapes">How to get shapes contained in a particular slide</link></li>
|
|
<li><link href="#Shapes">Drawing a shape on a slide</link></li>
|
|
<li><link href="#Pictures">How to work with pictures</link></li>
|
|
<li><link href="#SlideTitle">How to set slide title</link></li>
|
|
<li><link href="#Fill">How to work with slide/shape background</link></li>
|
|
<li><link href="#Bullets">How to create bulleted lists</link></li>
|
|
<li><link href="#Hyperlinks">Hyperlinks</link></li>
|
|
<li><link href="#Tables">Tables</link></li>
|
|
<li><link href="#RemoveShape">How to remove shapes</link></li>
|
|
<li><link href="#OLE">How to retrieve embedded OLE objects</link></li>
|
|
<li><link href="#Sound">How to retrieve embedded sounds</link></li>
|
|
<li><link href="#Freeform">How to create shapes of arbitrary geometry</link></li>
|
|
<li><link href="#Graphics2D">Shapes and Graphics2D</link></li>
|
|
<li><link href="#Render">How to convert slides into images</link></li>
|
|
<li><link href="#HeadersFooters">Headers / Footers</link></li>
|
|
</ul>
|
|
</section>
|
|
<section><title>Features</title>
|
|
<anchor id="NewPresentation"/>
|
|
<section><title>New Presentation</title>
|
|
<source>
|
|
//create a new empty slide show
|
|
SlideShow ppt = new SlideShow();
|
|
|
|
//add first slide
|
|
Slide s1 = ppt.createSlide();
|
|
|
|
//add second slide
|
|
Slide s2 = ppt.createSlide();
|
|
|
|
//save changes in a file
|
|
FileOutputStream out = new FileOutputStream("slideshow.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
</source>
|
|
</section>
|
|
<anchor id="PageSize"/>
|
|
<section><title>How to retrieve or change slide size</title>
|
|
<source>
|
|
SlideShow ppt = new SlideShow(new HSLFSlideShow("slideshow.ppt"));
|
|
//retrieve page size. Coordinates are expressed in points (72 dpi)
|
|
java.awt.Dimension pgsize = ppt.getPageSize();
|
|
int pgx = pgsize.width; //slide width
|
|
int pgy = pgsize.height; //slide height
|
|
|
|
//set new page size
|
|
ppt.setPageSize(new java.awt.Dimension(1024, 768));
|
|
//save changes
|
|
FileOutputStream out = new FileOutputStream("slideshow.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
</source>
|
|
</section>
|
|
<anchor id="GetShapes"/>
|
|
<section><title>How to get shapes contained in a particular slide</title>
|
|
<p>
|
|
The following code demonstrates how to iterate over shapes for each slide.
|
|
</p>
|
|
<source>
|
|
SlideShow ppt = new SlideShow(new HSLFSlideShow("slideshow.ppt"));
|
|
//get slides
|
|
Slide[] slide = ppt.getSlides();
|
|
for (int i = 0; i < slide.length; i++){
|
|
Shape[] sh = slide[i].getShapes();
|
|
for (int j = 0; j < sh.length; j++){
|
|
//name of the shape
|
|
String name = sh[j].getShapeName();
|
|
|
|
//shapes's anchor which defines the position of this shape in the slide
|
|
java.awt.Rectangle anchor = sh[j].getAnchor();
|
|
|
|
if (sh[j] instanceof Line){
|
|
Line line = (Line)sh[j];
|
|
//work with Line
|
|
} else if (sh[j] instanceof AutoShape){
|
|
AutoShape shape = (AutoShape)sh[j];
|
|
//work with AutoShape
|
|
} else if (sh[j] instanceof TextBox){
|
|
TextBox shape = (TextBox)sh[j];
|
|
//work with TextBox
|
|
} else if (sh[j] instanceof Picture){
|
|
Picture shape = (Picture)sh[j];
|
|
//work with Picture
|
|
}
|
|
}
|
|
}
|
|
</source>
|
|
</section>
|
|
<anchor id="Shapes"/>
|
|
<section><title>Drawing a shape on a slide</title>
|
|
<warning>
|
|
To work with graphic objects HSLF uses Java2D classes
|
|
that may throw exceptions if graphical environment is not available. In case if graphical environment
|
|
is not available, you must tell Java that you are running in headless mode and
|
|
set the following system property: <code> java.awt.headless=true </code>
|
|
(either via <code>-Djava.awt.headless=true</code> startup parameter or via <code>System.setProperty("java.awt.headless", "true")</code>).
|
|
</warning>
|
|
<p>
|
|
When you add a shape, you usually specify the dimensions of the shape and the position
|
|
of the upper left corner of the bounding box for the shape relative to the upper left
|
|
corner of the slide. Distances in the drawing layer are measured in points (72 points = 1 inch).
|
|
</p>
|
|
<source>
|
|
SlideShow ppt = new SlideShow();
|
|
|
|
Slide slide = ppt.createSlide();
|
|
|
|
//Line shape
|
|
Line line = new Line();
|
|
line.setAnchor(new java.awt.Rectangle(50, 50, 100, 20));
|
|
line.setLineColor(new Color(0, 128, 0));
|
|
line.setLineStyle(Line.LINE_DOUBLE);
|
|
slide.addShape(line);
|
|
|
|
//TextBox
|
|
TextBox txt = new TextBox();
|
|
txt.setText("Hello, World!");
|
|
txt.setAnchor(new java.awt.Rectangle(300, 100, 300, 50));
|
|
|
|
//use RichTextRun to work with the text format
|
|
RichTextRun rt = txt.getTextRun().getRichTextRuns()[0];
|
|
rt.setFontSize(32);
|
|
rt.setFontName("Arial");
|
|
rt.setBold(true);
|
|
rt.setItalic(true);
|
|
rt.setUnderlined(true);
|
|
rt.setFontColor(Color.red);
|
|
rt.setAlignment(TextBox.AlignRight);
|
|
|
|
slide.addShape(txt);
|
|
|
|
//Autoshape
|
|
//32-point star
|
|
AutoShape sh1 = new AutoShape(ShapeTypes.Star32);
|
|
sh1.setAnchor(new java.awt.Rectangle(50, 50, 100, 200));
|
|
sh1.setFillColor(Color.red);
|
|
slide.addShape(sh1);
|
|
|
|
//Trapezoid
|
|
AutoShape sh2 = new AutoShape(ShapeTypes.Trapezoid);
|
|
sh2.setAnchor(new java.awt.Rectangle(150, 150, 100, 200));
|
|
sh2.setFillColor(Color.blue);
|
|
slide.addShape(sh2);
|
|
|
|
FileOutputStream out = new FileOutputStream("slideshow.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
|
|
</source>
|
|
</section>
|
|
<anchor id="Pictures"/>
|
|
<section><title>How to work with pictures</title>
|
|
|
|
<p>
|
|
Currently, HSLF API supports the following types of pictures:
|
|
</p>
|
|
<ul>
|
|
<li>Windows Metafiles (WMF)</li>
|
|
<li>Enhanced Metafiles (EMF)</li>
|
|
<li>JPEG Interchange Format</li>
|
|
<li>Portable Network Graphics (PNG)</li>
|
|
<li>Macintosh PICT</li>
|
|
</ul>
|
|
|
|
<source>
|
|
SlideShow ppt = new SlideShow(new HSLFSlideShow("slideshow.ppt"));
|
|
|
|
//extract all pictures contained in the presentation
|
|
PictureData[] pdata = ppt.getPictureData();
|
|
for (int i = 0; i < pdata.length; i++){
|
|
PictureData pict = pdata[i];
|
|
|
|
// picture data
|
|
byte[] data = pict.getData();
|
|
|
|
int type = pict.getType();
|
|
String ext;
|
|
switch (type){
|
|
case Picture.JPEG: ext=".jpg"; break;
|
|
case Picture.PNG: ext=".png"; break;
|
|
case Picture.WMF: ext=".wmf"; break;
|
|
case Picture.EMF: ext=".emf"; break;
|
|
case Picture.PICT: ext=".pict"; break;
|
|
default: continue;
|
|
}
|
|
FileOutputStream out = new FileOutputStream("pict_"+i + ext);
|
|
out.write(data);
|
|
out.close();
|
|
|
|
}
|
|
|
|
// add a new picture to this slideshow and insert it in a new slide
|
|
int idx = ppt.addPicture(new File("clock.jpg"), Picture.JPEG);
|
|
|
|
Picture pict = new Picture(idx);
|
|
|
|
//set image position in the slide
|
|
pict.setAnchor(new java.awt.Rectangle(100, 100, 300, 200));
|
|
|
|
Slide slide = ppt.createSlide();
|
|
slide.addShape(pict);
|
|
|
|
//now retrieve pictures containes in the first slide and save them on disk
|
|
slide = ppt.getSlides()[0];
|
|
Shape[] sh = slide.getShapes();
|
|
for (int i = 0; i < sh.length; i++){
|
|
if (sh[i] instanceof Picture){
|
|
Picture pict = (Picture)sh[i];
|
|
PictureData pictData = pict.getPictureData();
|
|
byte[] data = pictData.getData();
|
|
int type = pictData.getType();
|
|
if (type == Picture.JPEG){
|
|
FileOutputStream out = new FileOutputStream("slide0_"+i+".jpg");
|
|
out.write(data);
|
|
out.close();
|
|
} else if (type == Picture.PNG){
|
|
FileOutputStream out = new FileOutputStream("slide0_"+i+".png");
|
|
out.write(data);
|
|
out.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
FileOutputStream out = new FileOutputStream("slideshow.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
|
|
</source>
|
|
</section>
|
|
<anchor id="SlideTitle"/>
|
|
<section><title>How to set slide title</title>
|
|
<source>
|
|
SlideShow ppt = new SlideShow();
|
|
Slide slide = ppt.createSlide();
|
|
TextBox title = slide.addTitle();
|
|
title.setText("Hello, World!");
|
|
|
|
//save changes
|
|
FileOutputStream out = new FileOutputStream("slideshow.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
</source>
|
|
<p>
|
|
Below is the equivalent code in PowerPoint VBA:
|
|
</p>
|
|
<source>
|
|
Set myDocument = ActivePresentation.Slides(1)
|
|
myDocument.Shapes.AddTitle.TextFrame.TextRange.Text = "Hello, World!"
|
|
</source>
|
|
</section>
|
|
<anchor id="Fill"/>
|
|
<section><title>How to modify background of a slide master</title>
|
|
<source>
|
|
SlideShow ppt = new SlideShow();
|
|
SlideMaster master = ppt.getSlidesMasters()[0];
|
|
|
|
Fill fill = master.getBackground().getFill();
|
|
int idx = ppt.addPicture(new File("background.png"), Picture.PNG);
|
|
fill.setFillType(Fill.FILL_PICTURE);
|
|
fill.setPictureData(idx);
|
|
</source>
|
|
</section>
|
|
<section><title>How to modify background of a slide</title>
|
|
<source>
|
|
SlideShow ppt = new SlideShow();
|
|
Slide slide = ppt.createSlide();
|
|
|
|
//This slide has its own background.
|
|
//Without this line it will use master's background.
|
|
slide.setFollowMasterBackground(false);
|
|
Fill fill = slide.getBackground().getFill();
|
|
int idx = ppt.addPicture(new File("background.png"), Picture.PNG);
|
|
fill.setFillType(Fill.FILL_PATTERN);
|
|
fill.setPictureData(idx);
|
|
</source>
|
|
</section>
|
|
<section><title>How to modify background of a shape</title>
|
|
<source>
|
|
SlideShow ppt = new SlideShow();
|
|
Slide slide = ppt.createSlide();
|
|
|
|
Shape shape = new AutoShape(ShapeTypes.Rectangle);
|
|
shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200));
|
|
Fill fill = shape.getFill();
|
|
fill.setFillType(Fill.FILL_SHADE);
|
|
fill.setBackgroundColor(Color.red);
|
|
fill.setForegroundColor(Color.green);
|
|
|
|
slide.addShape(shape);
|
|
</source>
|
|
</section>
|
|
<anchor id="Bullets"/>
|
|
<section><title>How to create bulleted lists</title>
|
|
<source>
|
|
SlideShow ppt = new SlideShow();
|
|
|
|
Slide slide = ppt.createSlide();
|
|
|
|
TextBox shape = new TextBox();
|
|
RichTextRun rt = shape.getTextRun().getRichTextRuns()[0];
|
|
shape.setText(
|
|
"January\r" +
|
|
"February\r" +
|
|
"March\r" +
|
|
"April");
|
|
rt.setFontSize(42);
|
|
rt.setBullet(true);
|
|
rt.setBulletOffset(0); //bullet offset
|
|
rt.setTextOffset(50); //text offset (should be greater than bullet offset)
|
|
rt.setBulletChar('\u263A'); //bullet character
|
|
slide.addShape(shape);
|
|
|
|
shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); //position of the text box in the slide
|
|
slide.addShape(shape);
|
|
|
|
FileOutputStream out = new FileOutputStream("bullets.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
</source>
|
|
</section>
|
|
<anchor id="Hyperlinks"/>
|
|
<section><title>How to read hyperlinks from a slide show</title>
|
|
<source>
|
|
FileInputStream is = new FileInputStream("slideshow.ppt");
|
|
SlideShow ppt = new SlideShow(is);
|
|
is.close();
|
|
|
|
Slide[] slide = ppt.getSlides();
|
|
for (int j = 0; j < slide.length; j++) {
|
|
|
|
//read hyperlinks from the text runs
|
|
TextRun[] txt = slide[j].getTextRuns();
|
|
for (int k = 0; k < txt.length; k++) {
|
|
String text = txt[k].getText();
|
|
Hyperlink[] links = txt[k].getHyperlinks();
|
|
if(links != null) for (int l = 0; l < links.length; l++) {
|
|
Hyperlink link = links[l];
|
|
String title = link.getTitle();
|
|
String address = link.getAddress();
|
|
String substring = text.substring(link.getStartIndex(), link.getEndIndex()-1); //in ppt end index is inclusive
|
|
}
|
|
}
|
|
|
|
//in PowerPoint you can assign a hyperlink to a shape without text,
|
|
//for example to a Line object. The code below demonstrates how to
|
|
//read such hyperlinks
|
|
Shape[] sh = slide[j].getShapes();
|
|
for (int k = 0; k < sh.length; k++) {
|
|
Hyperlink link = sh[k].getHyperlink();
|
|
if(link != null) {
|
|
String title = link.getTitle();
|
|
String address = link.getAddress();
|
|
}
|
|
}
|
|
}
|
|
</source>
|
|
</section>
|
|
<anchor id="Tables"/>
|
|
<section><title>How to create tables</title>
|
|
<source>
|
|
//table data
|
|
String[][] data = {
|
|
{"INPUT FILE", "NUMBER OF RECORDS"},
|
|
{"Item File", "11,559"},
|
|
{"Vendor File", "300"},
|
|
{"Purchase History File", "10,000"},
|
|
{"Total # of requisitions", "10,200,038"}
|
|
};
|
|
|
|
SlideShow ppt = new SlideShow();
|
|
|
|
Slide slide = ppt.createSlide();
|
|
//create a table of 5 rows and 2 columns
|
|
Table table = new Table(5, 2);
|
|
for (int i = 0; i < data.length; i++) {
|
|
for (int j = 0; j < data[i].length; j++) {
|
|
TableCell cell = table.getCell(i, j);
|
|
cell.setText(data[i][j]);
|
|
|
|
RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];
|
|
rt.setFontName("Arial");
|
|
rt.setFontSize(10);
|
|
|
|
cell.setVerticalAlignment(TextBox.AnchorMiddle);
|
|
cell.setHorizontalAlignment(TextBox.AlignCenter);
|
|
}
|
|
}
|
|
|
|
//set table borders
|
|
Line border = table.createBorder();
|
|
border.setLineColor(Color.black);
|
|
border.setLineWidth(1.0);
|
|
table.setAllBorders(border);
|
|
|
|
//set width of the 1st column
|
|
table.setColumnWidth(0, 300);
|
|
//set width of the 2nd column
|
|
table.setColumnWidth(1, 150);
|
|
|
|
slide.addShape(table);
|
|
table.moveTo(100, 100);
|
|
|
|
FileOutputStream out = new FileOutputStream("hslf-table.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
|
|
</source>
|
|
</section>
|
|
|
|
<anchor id="RemoveShape"/>
|
|
<section><title>How to remove shapes from a slide</title>
|
|
<source>
|
|
|
|
Shape[] shape = slide.getShapes();
|
|
for (int i = 0; i < shape.length; i++) {
|
|
|
|
//remove the shape
|
|
boolean ok = slide.removeShape(shape[i]);
|
|
if(ok){
|
|
//the shape was removed. Do something.
|
|
}
|
|
}
|
|
</source>
|
|
</section>
|
|
<anchor id="OLE"/>
|
|
<section><title>How to retrieve embedded OLE objects</title>
|
|
<source>
|
|
|
|
Shape[] shape = slide.getShapes();
|
|
for (int i = 0; i < shape.length; i++) {
|
|
if (shape[i] instanceof OLEShape) {
|
|
OLEShape ole = (OLEShape) shape[i];
|
|
ObjectData data = ole.getObjectData();
|
|
String name = ole.getInstanceName();
|
|
if ("Worksheet".equals(name)) {
|
|
HSSFWorkbook wb = new HSSFWorkbook(data.getData());
|
|
} else if ("Document".equals(name)) {
|
|
HWPFDocument doc = new HWPFDocument(data.getData());
|
|
}
|
|
}
|
|
}
|
|
</source>
|
|
</section>
|
|
|
|
<anchor id="Sound"/>
|
|
<section><title>How to retrieve embedded sounds</title>
|
|
<source>
|
|
|
|
FileInputStream is = new FileInputStream(args[0]);
|
|
SlideShow ppt = new SlideShow(is);
|
|
is.close();
|
|
|
|
SoundData[] sound = ppt.getSoundData();
|
|
for (int i = 0; i < sound.length; i++) {
|
|
//save *WAV sounds on disk
|
|
if(sound[i].getSoundType().equals(".WAV")){
|
|
FileOutputStream out = new FileOutputStream(sound[i].getSoundName());
|
|
out.write(sound[i].getData());
|
|
out.close();
|
|
}
|
|
}
|
|
</source>
|
|
</section>
|
|
|
|
<anchor id="Freeform"/>
|
|
<section><title>How to create shapes of arbitrary geometry</title>
|
|
<source>
|
|
|
|
SlideShow ppt = new SlideShow();
|
|
Slide slide = ppt.createSlide();
|
|
|
|
java.awt.geom.GeneralPath path = new java.awt.geom.GeneralPath();
|
|
path.moveTo(100, 100);
|
|
path.lineTo(200, 100);
|
|
path.curveTo(50, 45, 134, 22, 78, 133);
|
|
path.curveTo(10, 45, 134, 56, 78, 100);
|
|
path.lineTo(100, 200);
|
|
path.closePath();
|
|
|
|
Freeform shape = new Freeform();
|
|
shape.setPath(path);
|
|
slide.addShape(shape);
|
|
</source>
|
|
</section>
|
|
|
|
<anchor id="Graphics2D"/>
|
|
<section><title>How to draw into a slide using Graphics2D</title>
|
|
<warning>
|
|
Current implementation of the PowerPoint Graphics2D driver is not fully compliant with the java.awt.Graphics2D specification.
|
|
Some features like clipping, drawing of images are not yet supported.
|
|
</warning>
|
|
<source>
|
|
SlideShow ppt = new SlideShow();
|
|
Slide slide = ppt.createSlide();
|
|
|
|
//draw a simple bar graph
|
|
//bar chart data. The first value is the bar color, the second is the width
|
|
Object[] def = new Object[]{
|
|
Color.yellow, new Integer(100),
|
|
Color.green, new Integer(150),
|
|
Color.gray, new Integer(75),
|
|
Color.red, new Integer(200),
|
|
};
|
|
|
|
//all objects are drawn into a shape group so we need to create one
|
|
|
|
ShapeGroup group = new ShapeGroup();
|
|
//define position of the drawing in the slide
|
|
Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);
|
|
//if you want to draw in the entire slide area then define the anchor as follows:
|
|
//Dimension pgsize = ppt.getPageSize();
|
|
//java.awt.Rectangle bounds = new java.awt.Rectangle(0, 0, pgsize.width, pgsize.height);
|
|
|
|
group.setAnchor(bounds);
|
|
slide.addShape(group);
|
|
|
|
//draw a simple bar chart
|
|
Graphics2D graphics = new PPGraphics2D(group);
|
|
int x = bounds.x + 50, y = bounds.y + 50;
|
|
graphics.setFont(new Font("Arial", Font.BOLD, 10));
|
|
for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {
|
|
graphics.setColor(Color.black);
|
|
int width = ((Integer)def[i+1]).intValue();
|
|
graphics.drawString("Q" + idx, x-20, y+20);
|
|
graphics.drawString(width + "%", x + width + 10, y + 20);
|
|
graphics.setColor((Color)def[i]);
|
|
graphics.fill(new Rectangle(x, y, width, 30));
|
|
y += 40;
|
|
}
|
|
graphics.setColor(Color.black);
|
|
graphics.setFont(new Font("Arial", Font.BOLD, 14));
|
|
graphics.draw(bounds);
|
|
graphics.drawString("Performance", x + 70, y + 40);
|
|
|
|
FileOutputStream out = new FileOutputStream("hslf-graphics2d.ppt");
|
|
ppt.write(out);
|
|
out.close();
|
|
|
|
</source>
|
|
</section>
|
|
|
|
<anchor id="Render"/>
|
|
<section><title>Export PowerPoint slides into java.awt.Graphics2D</title>
|
|
<p>
|
|
HSLF provides a way to export slides into images. You can capture slides into java.awt.Graphics2D object (or any other)
|
|
and serialize it into a PNG or JPEG format. Please note, although HSLF attempts to render slides as close to PowerPoint as possible,
|
|
the output may look differently from PowerPoint due to the following reasons:
|
|
</p>
|
|
<ul>
|
|
<li>Java2D renders fonts differently vs PowerPoint. There are always some differences in the way the font glyphs are painted</li>
|
|
<li>HSLF uses java.awt.font.LineBreakMeasurer to break text into lines. PowerPoint may do it in a different way.</li>
|
|
<li>If a font from the presentation is not avaiable, then the JDK default font will be used.</li>
|
|
</ul>
|
|
<p>
|
|
Current Limitations:
|
|
</p>
|
|
<ul>
|
|
<li>Some types of shapes are not yet supported (WordArt, complex auto-shapes)</li>
|
|
<li>Only Bitmap images (PNG, JPEG, DIB) can be rendered in Java</li>
|
|
</ul>
|
|
<source>
|
|
FileInputStream is = new FileInputStream("slideshow.ppt");
|
|
SlideShow ppt = new SlideShow(is);
|
|
is.close();
|
|
|
|
Dimension pgsize = ppt.getPageSize();
|
|
|
|
Slide[] slide = ppt.getSlides();
|
|
for (int i = 0; i < slide.length; i++) {
|
|
|
|
BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
|
|
Graphics2D graphics = img.createGraphics();
|
|
//clear the drawing area
|
|
graphics.setPaint(Color.white);
|
|
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
|
|
|
|
//render
|
|
slide[i].draw(graphics);
|
|
|
|
//save the output
|
|
FileOutputStream out = new FileOutputStream("slide-" + (i+1) + ".png");
|
|
javax.imageio.ImageIO.write(img, "png", out);
|
|
out.close();
|
|
}
|
|
|
|
</source>
|
|
</section>
|
|
|
|
</section>
|
|
<anchor id="HeadersFooters"/>
|
|
<section><title>How to extract Headers / Footers from an existing presentation</title>
|
|
<source>
|
|
|
|
FileInputStream is = new FileInputStream("slideshow.ppt");
|
|
SlideShow ppt = new SlideShow(is);
|
|
is.close();
|
|
Slide[] slides = ppt.getSlides();
|
|
|
|
//presentation-scope headers / footers
|
|
HeadersFooters hdd = ppt.getSlideHeadersFooters();
|
|
if(hdd.isFooterVisible()) {
|
|
String footerText = hdd.getFooterText();
|
|
}
|
|
|
|
//per-slide headers / footers
|
|
for (int i=0; i < slides.length; i++){
|
|
HeadersFooters hdd2 = slides[i].getHeadersFooters();
|
|
if(hdd2.isFooterVisible()) {
|
|
String footerText = hdd2.getFooterText();
|
|
}
|
|
if(hdd2.isUserDateVisible()) {
|
|
String customDate = hdd2.getDateTimeText();
|
|
}
|
|
if(hdd2.isSlideNumberVisible()){
|
|
int slideNUm = slides[i].getSlideNumber();
|
|
}
|
|
|
|
}
|
|
</source>
|
|
</section>
|
|
<section><title>How to set Headers / Footers</title>
|
|
<source>
|
|
|
|
SlideShow ppt = new SlideShow();
|
|
|
|
//presentation-scope headers / footers
|
|
HeadersFooters hdd = ppt.getSlideHeadersFooters();
|
|
hdd.setSlideNumberVisible(true);
|
|
hdd.setFootersText("Created by POI-HSLF");
|
|
</source>
|
|
</section>
|
|
</section>
|
|
</body>
|
|
</document>
|