我正在尝试构建一个相当粗糙的工具,将 ppt/pptx 文件转换为 HTML 格式。
我发现,不幸的是,apache poi 没有提供用于处理 power point 文件的统一编程模型,并且必须编写代码来解析每种格式。
感觉 pptx 文件支持比 ppt 支持受限很多。我面临的一个问题是获取有关 pptx 幻灯片的背景(颜色、图案、背景图像)的信息。
我发现 XSLFBackground (pptx api) 类比其对应的 Background 类 (ppt api) 更受限制。
有没有人设法获取有关使用 apache poi 的 pptx 幻灯片背景的信息?
也有人可以请我指出一些关于这个主题的好资源。我发现 apache poi javadoc 几乎无法使用,并且 poi 网站上的示例仅涵盖基本功能。
最好的问候,塞尔吉乌
问问题
1933 次
1 回答
4
背景元素的内容在Office Open Schema中进行了描述- 检查底部的 zip-link和里面的 pml-slide.xsd。
有了手中的模式,您将了解用户模型界面下方的 XML bean。
首先,这是一个读取背景图像以及将幻灯片导出为 png 的示例(可能对您的 html 导出有用?):
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
public class PptxBackground {
public static void main(String[] args) throws Exception {
// sorry for the content, but it was one of the first non-commercial google matches ...
URL url = new URL("http://newkilpatrickblog.typepad.com/files/sunday_june_03_2012_trinity_and_majesty_communion.pptx");
InputStream is = url.openStream();
XMLSlideShow ss = new XMLSlideShow(is);
is.close();
XSLFSlide sld = ss.getSlides()[0];
XSLFBackground bg = sld.getBackground();
CTBackground xmlBg = (CTBackground)bg.getXmlObject();
String relId = xmlBg.getBgPr().getBlipFill().getBlip().getEmbed();
XSLFPictureData pic = (XSLFPictureData)sld.getRelationById(relId);
String filename = pic.getFileName();
byte fileBytes[] = pic.getData();
/***** or convert the slides to images ****/
double zoom = 2; // magnify it by 2
AffineTransform at = new AffineTransform();
at.setToScale(zoom, zoom);
Dimension pgsize = ss.getPageSize();
XSLFSlide slides[] = ss.getSlides();
for (int i = 0; i < slides.length; i++) {
BufferedImage img = new BufferedImage((int)Math.ceil(pgsize.width*zoom), (int)Math.ceil(pgsize.height*zoom), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setTransform(at);
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
slides[i].draw(graphics);
FileOutputStream out = new FileOutputStream("slide-" + (i+1) + ".png");
javax.imageio.ImageIO.write(img, "png", out);
out.close();
}
}
}
于 2013-08-19T22:06:55.040 回答