Apache POI pptx背景/形状缺失

时间:2017-02-02 09:54:56

标签: java apache apache-poi powerpoint

我有一个问题,Apahe POI使用XSLF将演示幻灯片转换为图像。问题是,有时图片上缺少元素,大多数时候背景模板图像或某些模板形状。

使用以下代码进行转换:

package com.itpharma.videocall.poi;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xslf.usermodel.XMLSlideShow;

public class PPTX2PNG {

    public static void main(String[] args) {

        String prezName = "presentation";

        try {

            File fin = new File(prezName + ".pptx");
            FileInputStream fis = new FileInputStream(fin);
            XMLSlideShow ppt = new XMLSlideShow(fis);
            Dimension pptSize = ppt.getPageSize();

            System.out.println("Presentation size: " + pptSize.width + " x " + pptSize.height);

            ppt.getSlides().forEach(slide -> {

                System.out.println(slide.getSlideNumber() + ": " + slide.getTitle());

                BufferedImage img = new BufferedImage(pptSize.width, pptSize.height, 1);

                Graphics2D gfx = img.createGraphics();
                gfx.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                gfx.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                gfx.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
                gfx.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

                gfx.setColor(Color.WHITE);
                gfx.clearRect(0, 0, pptSize.width, pptSize.height);
                gfx.fill(new Rectangle2D.Float(0, 0, pptSize.width, pptSize.height));

                slide.draw(gfx);

                try {

                    File fout = new File(prezName + "-slide-" + slide.getSlideNumber() + ".png");
                    FileOutputStream fos = new FileOutputStream(fout);
                    javax.imageio.ImageIO.write(img, "png", fos);
                    fos.close();

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            });

            ppt.close();
            fis.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

我正在使用POI 3.15版本(最新稳定版),MacOS 10.12.2上的Eclipse Oxygen用于开发(生产将在ubuntu VPS上)并且我不知道出了什么问题,如果它是我的代码或我的系统或POI库或我的进口或我不知道。

我附上了几张图片,其中我使用相同的演示文稿,只更改了设计模板。图像的上半部分是PowerPoin截图,下半部分是生成缺失部分的图像。第三个模板确实产生了错误,没有图像。

第一个模板:

First template

第二个模板:

Second template

第三个模板:

Third template

使用上一个模板我会收到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: Relationship null doesn't start with this part /ppt/slides/slide1.xml
    at org.apache.poi.openxml4j.opc.PackagePart.getRelatedPart(PackagePart.java:469)
    at org.apache.poi.xslf.usermodel.XSLFShape$2.getPart(XSLFShape.java:392)
    at org.apache.poi.xslf.usermodel.XSLFShape$2.getImageData(XSLFShape.java:400)
    at org.apache.poi.sl.draw.DrawPaint.getTexturePaint(DrawPaint.java:135)
    at org.apache.poi.sl.draw.DrawPaint.getPaint(DrawPaint.java:112)
    at org.apache.poi.sl.draw.DrawTextParagraph.getAttributedString(DrawTextParagraph.java:530)
    at org.apache.poi.sl.draw.DrawTextParagraph.breakText(DrawTextParagraph.java:235)
    at org.apache.poi.sl.draw.DrawTextShape.drawParagraphs(DrawTextShape.java:158)
    at org.apache.poi.sl.draw.DrawTextShape.getTextHeight(DrawTextShape.java:219)
    at org.apache.poi.sl.draw.DrawTextShape.drawContent(DrawTextShape.java:102)
    at org.apache.poi.sl.draw.DrawSimpleShape.draw(DrawSimpleShape.java:93)
    at org.apache.poi.sl.draw.DrawSheet.draw(DrawSheet.java:67)
    at org.apache.poi.sl.draw.DrawSlide.draw(DrawSlide.java:39)
    at org.apache.poi.xslf.usermodel.XSLFSlide.draw(XSLFSlide.java:301)
    at com.itpharma.videocall.poi.PPTX2PNG.lambda$0(PPTX2PNG.java:48)
    at java.util.ArrayList.forEach(ArrayList.java:1249)
    at com.itpharma.videocall.poi.PPTX2PNG.main(PPTX2PNG.java:32)

我还测试了其他模板和一些定制的演示文稿,几乎每次都缺少一些形状或背景。

0 个答案:

没有答案