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 フォント設定にあります。

/usr/lib/jvm/jdk1.8.0_20/jre/lib/fontsフォントを、simsun.ttc などの JVM フォント (または類似のもの) のリストにある 1 つに設定する必要があります。

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を調べていましたが、リーダーを引数として使用するメソッドは見つかりませんでした。ただし、ImageOutputStreamが役立つかどうかを確認してください。

于 2010-04-22T01:03:51.967 に答える