2010-04-22 39 views
2

我尝试使用Apache POI项目将我的PPT转换为Images时出现问题。我的代码如下:使用APACHE POI将PPT转换为图像时,将中文字符转换为正方形

FileInputStream is = new FileInputStream("test.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(); 

它工作正常,但所有的中文单词都转换为一些方块。那我该如何解决这个问题?

+0

你确定你正在使用的字体是汉字的字形吗?只有当你使用的字体没有,你会看到类似的东西... – Gagravarr 2011-12-30 10:18:26

回答

1

问题在于FileOuputStream的用法,它将始终以默认系统编码将文件写入文件,这很可能是针对Windows的ISO-8859_1编码。这种编码不支持中文字符。您需要创建一个流,您可以使用需要创建读取器的UTF-8编码进行编写。我在看API,但没有找到任何方法以读者为参数。但检查是否ImageOutputStream可以帮助你。

+0

我会检查,谢谢。 – Young 2010-04-22 01:07:08

+0

它工作。你可以请你发布你的解决方案。我有同样的问题。 – abhinav 2013-04-09 13:15:11

2

的问题是不是在POI侧增加,但在JVM字体设置。

您需要在JVM字体列表(/usr/lib/jvm/jdk1.8.0_20/jre/lib/fonts或类似列表)中将字体设置为1,例如simsun.ttc。

XSLFTextShape[] phs = slide[i].getPlaceholders(); 
for (XSLFTextShape ts : phs) { 
    java.util.List<XSLFTextParagraph> tpl = ts.getTextParagraphs(); 
    for(XSLFTextParagraph tp: tpl) { 
    java.util.List<XSLFTextRun> trs = tp.getTextRuns(); 
    for(XSLFTextRun tr: trs) { 
     logger.info(tr.getFontFamily()); 
     tr.setFontFamily("SimSun"); 
    } 
    } 
} 
+0

这是非常混乱的措词;希望我的编辑能够澄清你的意思。 – 2014-12-21 06:11:32