2016-11-14 16 views
0

ライブラリAPACHE POIについてお聞きしたいと思います。私は.pptxファイルを持っていて、私がインターネット上で見つけた例では、各スライドを別々の画像に分割しています。これは、スライドが.png、.jpegイメージを含むときにはうまくいきますが、スライドに.emfファイルがあるとすぐに、このイメージは消えます。だから私はスライドの同じコピーを持っていますが、.emfファイルも持っています。これは可能ですか?apache poi ppt to emf

バージョン:ApacheのPOI 3.12

どうもありがとう

+0

アップグレードして、再試行してください? – Gagravarr

+0

私はそれをしましたが、この機能をサポートしていないと思われます。 – tralalaUlalal

+0

EMFは現在、アウトオブボックスでサポートされていません。 FreeHepライブラリの助けを借りて、独自のImageRendererを提供する必要があります。 [FreeHepの使用例]を参照してください(http://apache-poi.1045710.n5.nabble.com/ImageRender-for-EMF-convert-PPTX-slides-include-EMF-images-into- PNG-td5717773.html)と[自分のImageRendererの提供方法](http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/draw/ImageRenderer.java ?view = markup) 私はかもしれません:)すぐに詳細な回答を考えてみてください – kiwiwings

答えて

0

コメントで述べたように、EMFは、箱から出してサポートされていません...とFreeHepとして、それは我々がする可能性は低いですLGPL licenseを持っていることにしましたinclude in our releasesetRenderingHint(Drawable.IMAGE_RENDERER, new MyImageRendener())経由Graphics2DコンテキストのごImageRenderer実装を実装し、登録

  • :あなたは基本的にカスタムイメージ・レンダラを提供するために、2つのオプションがありPOIで

    。欠点は、どの画像でも呼び出され、ビットマップ/ wmf画像のデフォルト処理が緩和されていることです。

  • DrawFactoryのカスタムDrawPictureShapeの実装を提供します - 下の例のように - EMFレンダラとき
    必要
(この例を見て 、現在のPOIのImageRendererハンドリングが見えない柔軟性、代わりにグローバルハンドラを持つ、...をコンテンツタイプごとのハンドラを登録した方がよいかもしれません)

usual POI componentのほかに、freehep-graphics2d,freehep-graphicsbase,freehep-graphicsio,freehep-graphicsio-emfおよびfreehep-io

の例では、これまで完成されてからですが、私はあなたが、少なくともキックスタートを切る推測:ApacheのPOIの最新バージョンへ

package org.apache.poi.xslf; 

import java.awt.Dimension; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Rectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.imageio.ImageIO; 

import org.apache.poi.sl.draw.DrawFactory; 
import org.apache.poi.sl.draw.DrawPictureShape; 
import org.apache.poi.sl.draw.Drawable; 
import org.apache.poi.sl.draw.ImageRenderer; 
import org.apache.poi.sl.usermodel.PictureData; 
import org.apache.poi.sl.usermodel.PictureData.PictureType; 
import org.apache.poi.sl.usermodel.PictureShape; 
import org.apache.poi.util.POILogFactory; 
import org.apache.poi.util.POILogger; 
import org.apache.poi.xslf.usermodel.XMLSlideShow; 
import org.apache.poi.xslf.usermodel.XSLFPictureShape; 
import org.apache.poi.xslf.usermodel.XSLFSlide; 
import org.freehep.graphicsio.emf.EMFInputStream; 
import org.freehep.graphicsio.emf.EMFRenderer; 
import org.junit.Test; 

public class TestEMFRender { 
    private final static POILogger LOG = POILogFactory.getLogger(TestEMFRender.class); 

    @Test 
    public void render() throws Exception { 
     XMLSlideShow ppt = getDummy(); 

     Dimension pgsize = ppt.getPageSize(); 
     BufferedImage img = new BufferedImage((int)pgsize.getWidth(), (int)pgsize.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     Graphics2D graphics = initGraphicsCtx(img); 

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

     // save the result 
     File outfile = new File("bla.png"); 
     ImageIO.write(img, "PNG", outfile); 

     // cleanup 
     graphics.dispose(); 
     img.flush(); 
     ppt.close(); 
    } 

    static XMLSlideShow getDummy() throws IOException { 
     XMLSlideShow ppt = new XMLSlideShow(); 
     FileInputStream fis = new FileInputStream("kiwilogo.emf"); 
     PictureData pd = ppt.addPicture(fis, PictureType.EMF); 
     fis.close(); 
     XSLFSlide sl = ppt.createSlide(); 
     XSLFPictureShape ps = sl.createPicture(pd); 
     ps.setAnchor(new Rectangle2D.Double(100, 100, 100, 100)); 
     return ppt; 
    } 

    static Graphics2D initGraphicsCtx(BufferedImage img) { 
     Graphics2D graphics = img.createGraphics(); 
     // 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); 

     // custom draw factory 
     DrawFactory df = new DrawFactory(){ 
      public DrawPictureShape getDrawable(PictureShape<?,?> shape) { 
       return new DrawPictureShapeEmf(shape); 
      } 
     }; 
     graphics.setRenderingHint(Drawable.DRAW_FACTORY, df); 

     df.fixFonts(graphics); 

     return graphics; 
    } 

    static class DrawPictureShapeEmf extends DrawPictureShape { 
     public DrawPictureShapeEmf(PictureShape<?,?> shape) { 
      super(shape); 
     } 


     @Override 
     public void drawContent(Graphics2D graphics) { 
      PictureData data = getShape().getPictureData(); 
      if(data == null) return; 

      Rectangle2D anchor = getAnchor(graphics, getShape()); 
      Insets insets = getShape().getClipping(); 

      try { 
       String contentType = data.getContentType(); 
       ImageRenderer renderer = 
        PictureType.EMF.contentType.equals(contentType) 
        ? new ImgRenderer() 
        : super.getImageRenderer(graphics, contentType); 

       renderer.loadImage(data.getData(), data.getContentType()); 
       renderer.drawImage(graphics, anchor, insets); 
      } catch (IOException e) { 
       LOG.log(POILogger.ERROR, "image can't be loaded/rendered.", e); 
      } 
     } 

    } 


    static class ImgRenderer implements ImageRenderer { 
     EMFRenderer emfRenderer; 

     public void loadImage(InputStream data, String contentType) throws IOException { 
      emfRenderer = new EMFRenderer(new EMFInputStream(data)); 
     } 

     public void loadImage(byte[] data, String contentType) throws IOException { 
      loadImage(new ByteArrayInputStream(data), contentType); 
     } 

     public Dimension getDimension() { 
      return emfRenderer.getSize(); 
     } 

     public void setAlpha(double alpha) { 
     } 

     public BufferedImage getImage() { 
      return null; 
     } 

     public BufferedImage getImage(Dimension dim) { 
      return null; 
     } 

     public boolean drawImage(Graphics2D ctx, Rectangle2D graphicsBounds) { 
      return drawImage(ctx, graphicsBounds, null); 
     } 

     public boolean drawImage(Graphics2D ctx, Rectangle2D graphicsBounds, Insets clip) { 
      AffineTransform at = ctx.getTransform(); 
      try { 
       Dimension emfDim = emfRenderer.getSize(); 
       // scale output bounds to image bounds 
       ctx.translate(graphicsBounds.getX(), graphicsBounds.getY()); 
       ctx.scale(graphicsBounds.getWidth()/emfDim.getWidth(), graphicsBounds.getHeight()/emfDim.getHeight()); 

       // TODO: handle clipping 

       emfRenderer.paint(ctx); 

       return true; 
      } catch (RuntimeException e) { 
       // TODO: logging 
       return false; 
      } finally { 
       ctx.setTransform(at); 
      } 
     } 

    } 
} 
+0

ありがとうございます。しかし、この解決策は可能ですか?関数ppt.getPictureData()を使うと、プレゼンテーションのすべての画像が得られ、ha .emf拡張子の画像しか見つからない。私はfreehepでsvgに変換し、svgからjpgに変換するが、今は古い.emfをnew.jpgの関数picture.setData(newImageStream)に置き換える必要があるが、これがうまくいくかどうかわからない – tralalaUlalal

+0

新しいemfイメージをjpgに置き換えたいのですか? FreeHeps EMFRendererからJPGを取得し、バイトとコンテンツタイプを変更するために私のアプローチを単純に適応させてください - あなたはすべてのスライドを繰り返して参照を変更する必要があると思います。 これがあなたの望むものであれば、新しい質問を開き、私はそのコードを採用するかもしれません... – kiwiwings

+0

はい私は今それを得ました:)。しかし、バージョンapache po 3.15の問題は、この変換後です画像のppt - >イメージからの変換はまだファイルがありませんが、バージョン3.13はすべてOKです:)あなたの時間のためにありがとう:) – tralalaUlalal