Hi, folks!
I'm trying to convert pptx slides to images with the code
<http://poi.apache.org/slideshow/how-to-shapes.html>:
FileInputStream is = new FileInputStream("slideshow.pptx");
XMLSlideShow ppt = new XMLSlideShow(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();
}
If background image is bigger than a slide, then it's cropped to a slide
width and height. So you get left top corner of an image as a result. If
background image is smaller, then it takes only a part of slide's area(see
the attached files). I haven't found that error in bugtracker
<https://issues.apache.org/bugzilla/buglist.cgi?product=POI>. So the
intention of this letter is only to submit a bug.
BTW, I've made theese changes to eliminate the issue:
>From 45ff683c719eb84612808d120e0a8498710bd791 Mon Sep 17 00:00:00 2001
From: Artyom Nikiforov <[email protected]>
Date: Mon, 15 Dec 2014 11:58:18 +0300
Subject: [PATCH] Resize background picture to slide size.
---
.../apache/poi/xslf/usermodel/XSLFBackground.java | 26 ++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
index 604c9df..f1cbec1 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
@@ -23,6 +23,10 @@ import
org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
+import java.awt.image.AffineTransformOp;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.awt.TexturePaint;
import java.awt.Color;
import java.awt.Dimension;
@@ -81,9 +85,31 @@ public class XSLFBackground extends XSLFSimpleShape {
fill = rShape.selectPaint(graphics, bgStyle, phClr,
theme.getPackagePart());
}
+ if(fill.getClass().getName().equals("java.awt.TexturePaint")) {
+ BufferedImage bufImage2 =
this.transformImageToSlideSize(((TexturePaint)fill).getImage());
+ fill = new TexturePaint(bufImage2, this.getAnchor());
+ }
+
return fill;
}
+ private BufferedImage transformImageToSlideSize(BufferedImage inBufImage) {
+ Dimension pg = this.getSheet().getSlideShow().getPageSize();
+ double outHeight = pg.getHeight();
+ double outWidth = pg.getWidth();
+ double inHeight = inBufImage.getHeight();
+ double inWeight = inBufImage.getWidth();
+
+ double scaleX = outWidth / inWeight;
+ double scaleY = outHeight / inHeight;
+
+ BufferedImage outBufImage = new BufferedImage((int)outWidth,
(int)outHeight, BufferedImage.TYPE_INT_ARGB);
+ AffineTransform at = new AffineTransform();
+ at.scale(scaleX, scaleY);
+ AffineTransformOp scaleOp = new AffineTransformOp(at,
AffineTransformOp.TYPE_BILINEAR);
+ return scaleOp.filter(inBufImage, outBufImage);
+ }
+
@Override
public Color getFillColor(){
Paint p = getPaint(null);
--
2.1.3
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]