Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ApachePOI将幻灯片转换为图像时,Ppt背景为黑色_Java_Apache_Apache Poi_Powerpoint - Fatal编程技术网

Java 使用ApachePOI将幻灯片转换为图像时,Ppt背景为黑色

Java 使用ApachePOI将幻灯片转换为图像时,Ppt背景为黑色,java,apache,apache-poi,powerpoint,Java,Apache,Apache Poi,Powerpoint,我正在使用下面的代码将ppt幻灯片转换为图像 BufferedImage imBuff = new BufferedImage(pgsize.width, (pgsize.height) * slides.size(), BufferedImage.TYPE_INT_RGB); Graphics g = imBuff.getGraphics(); Graphics2D graphics = img.createGraphics(); graphics.setRenderingHint(Drawa

我正在使用下面的代码将ppt幻灯片转换为图像

BufferedImage imBuff = new BufferedImage(pgsize.width, (pgsize.height) * slides.size(), BufferedImage.TYPE_INT_RGB);
Graphics g = imBuff.getGraphics();
Graphics2D graphics = img.createGraphics();
graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
graphics.setPaint(TRANSPARENT);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
slides.get(i).draw(graphics);
g.drawImage(img, 0, i * (pgsize.height), null);

对于某些.ppt文件,背景显示为黑色。有人知道原因是什么以及如何解决这个问题吗?我怀疑用于创建.ppt文件的office软件可能是一个因素,但我无法确认。

感谢您抽出时间将示例上载到我们的bugzilla-请参阅

如中所述,可以替换图像的透明部分,当然首先需要使用ARGB颜色模型

我在示例中添加了Arial Unicode字体,但您可能需要一个包含所有使用字符的字体

完整示例:

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.sl.usermodel.SlideShowFactory;
import org.junit.Test;

public class TestRendering {

    @Test
    public void bug61112() throws Exception {
        Font font = Font.createFont(Font.TRUETYPE_FONT, new File("arialuni.ttf"));
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(font);

        SlideShow<?,?> ppt = SlideShowFactory.create(new File("bug61112.ppt"), null, true);
        double scale = 1;
        Dimension pgsize = ppt.getPageSize();
        int width = (int) (pgsize.width * scale);
        int height = (int) (pgsize.height * scale);

        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D graphics = img.createGraphics();
        DrawFactory.getInstance(graphics).fixFonts(graphics);

        // default rendering options
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

        Map<String,String> fallbackMap = new HashMap<String,String>();
        fallbackMap.put("*", font.getFamily());
        graphics.setRenderingHint(Drawable.FONT_FALLBACK, fallbackMap);

        ppt.getSlides().get(0).draw(graphics);

        // Replace the transparent parts of the image
        // Set composite rules to paint "behind"
        graphics.setComposite(AlphaComposite.DstOver);
        graphics.setPaint(Color.WHITE);
        graphics.fillRect(0, 0, width, height);

        ImageIO.write(img, "PNG", new File("bla.png"));

        graphics.dispose();
        img.flush();


    }
}
导入java.awt.AlphaComposite;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.Graphics2D;
导入java.awt.GraphicsEnvironment;
导入java.awt.RenderingHints;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.util.HashMap;
导入java.util.Map;
导入javax.imageio.imageio;
导入org.apache.poi.sl.usermodel.SlideShow;
导入org.apache.poi.sl.usermodel.SlideShowFactory;
导入org.junit.Test;
公共类测试呈现{
@试验
public void bug61112()引发异常{
Font Font=Font.createFont(Font.TRUETYPE_Font,新文件(“arialuni.ttf”);
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
注册方(字体);
SlideShow ppt=SlideShowFactory.create(新文件(“bug61112.ppt”),null,true);
双刻度=1;
维度pgsize=ppt.getPageSize();
整数宽度=(整数)(pgsize.width*比例);
整数高度=(整数)(pgsize.height*比例);
BuffereImage img=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_ARGB);
Graphics2D graphics=img.createGraphics();
DrawFactory.getInstance(图形)、fixFonts(图形);
//默认渲染选项
graphics.setRenderingHint(RenderingHints.KEY\u抗锯齿,RenderingHints.VALUE\u抗锯齿开);
graphics.setRenderingHint(RenderingHints.KEY\u RENDERING,RenderingHints.VALUE\u RENDER\u QUALITY);
graphics.setRenderingHint(renderingHits.KEY\u插值,renderingHits.VALUE\u插值双三次);
graphics.setRenderingHint(renderingHits.KEY_-partitionlmetrics,renderingHits.VALUE_-partitionlmetrics_-ON);
Map fallbackMap=newhashmap();
fallbackMap.put(“*”,font.getFamily());
graphics.setRenderingHint(Drawable.FONT\u FALLBACK,fallbackMap);
getSlides().get(0).draw(图形);
//替换图像的透明部分
//将复合规则设置为“后面”绘制
图形.setComposite(AlphaComposite.DstOver);
图形.setPaint(颜色.白色);
fillRect(0,0,宽度,高度);
write(img,“PNG”,新文件(“bla.PNG”);
graphics.dispose();
img.flush();
}
}

我猜,它是透明的。。。但是为了验证它,你能提供.ppt吗?(提示:添加一个条目到我们的…)我删除了“graphics.setPaint(TRANSPARENT);”但结果是一样的。