2

当我尝试使用 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();

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

4

3 回答 3

3

这似乎是 apache POI 的一个错误。我已经在 bugzilla 中添加了

https://issues.apache.org/bugzilla/show_bug.cgi?id=54880

于 2013-04-24T05:46:56.287 回答
2

问题不在于 POI 方面,而在于 JVM 字体设置。

您需要将字体设置为 JVM 字体(/usr/lib/jvm/jdk1.8.0_20/jre/lib/fonts或类似字体)列表中的一种,例如 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");
    }
  }
}
于 2014-12-21T05:59:36.473 回答
1

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

于 2010-04-22T01:03:51.967 回答