Китайские иероглифы преобразуются в квадраты при использовании APACHE POI для преобразования PPT в изображение.

У меня возникла проблема, когда я пытаюсь использовать проект 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();

Работает нормально за исключением того, что все китайские слова преобразуются в какие-то квадраты. Тогда как я могу это исправить?


person Young    schedule 22.04.2010    source источник
comment
Убедились ли вы, что в используемом вами шрифте есть глифы для китайских иероглифов? Только если вы используете шрифт, которого нет, вы увидите что-то подобное...   -  person Gagravarr    schedule 30.12.2011


Ответы (3)


Кажется, это ошибка с POI apache. Я добавил это в bugzilla

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

person abhinav    schedule 24.04.2013

Проблема не на стороне 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");
    }
  }
}
person Wu Huajie    schedule 21.12.2014
comment
Это было очень запутанно сформулировано; надеюсь, мое редактирование проясняет ваш смысл. - person Nathan Tuggy; 21.12.2014

Проблема заключается в использовании FileOuputStream, который всегда будет записывать данные в файл в системной кодировке по умолчанию, которая, скорее всего, является ISO-8859_1 для Windows. Китайские символы не поддерживаются этой кодировкой. Вам нужно создать поток, в котором вы можете писать с использованием кодировки UTF-8, для которой требуется создание считывателя. Я просматривал API, но не нашел методов, использующих читатель в качестве аргумента. Но проверьте, может ли ImageOutputStream помочь вам.

person Fazal    schedule 22.04.2010
comment
Сработало ли это? Не могли бы вы опубликовать свое решение. У меня такая же проблема. - person abhinav; 09.04.2013