POI + PDFbox将PPT有图表页转换成图片

使用poi将PPT中有图表页转换成图片存在一些问题,转成图片的时候图表没有了,数据丢失。

所以用一个中转的方法,现将PPT的图表页转换成PDF,再将PDF转换成图片,虽然麻烦点,但是没有出现任何问题。

先添加依赖

<!--pdf 依赖-->
<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox-app</artifactId>
			<version>2.0.12</version>
		</dependency>
		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>fontbox</artifactId>
			<version>2.0.12</version>
		</dependency>

<!--poi 依赖-->
<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.15</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.15</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-scratchpad</artifactId>
			<version>3.15</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>ooxml-schemas</artifactId>
			<version>1.3</version>
		</dependency>

 上代码:

这段代码里边有将PPT图表页转换成图片、添加水印和获取全部文本的功能。

public static void main(String[] args) {
        try {
            extractCharts();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void extractCharts() throws Exception {

        //poi解析PPT获取图表以及图表的所在页
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("D:\\nfc111.pptx"));
        XSLFSlide[] slides = ppt.getSlides().toArray(new XSLFSlide[0]);


        //pdfbox解析PDF将图表所在页生成图片
        PDDocument document = PDDocument.load(new FileInputStream("D:\\nfc111.pdf"));
        PDFRenderer renderer = new PDFRenderer(document);

        //PdfReader pdfReader = new PdfReader(FILE_NAME);
        String waterMarkContent = "Hello World !";

        for (int i = 0; i < slides.length; i++) {
            XSLFShape[] sh = slides[i].getShapes().toArray(new XSLFShape[0]);
            //XSLFSlide slide = ppt.getSlides().get(i);


            for (int j = 0; j < sh.length; j++) {
                XSLFShape shape = sh[j];


                if (shape instanceof XSLFGraphicFrame) {
                    
                    //System.out.println(textFromPage);

                    //获取全部文本
                    /*PDFTextStripper pdfTextStripper = new PDFTextStripper();

                    pdfTextStripper.setSortByPosition(true);
                    pdfTextStripper.setStartPage(i);
                    pdfTextStripper.setEndPage(i);
                    String content = pdfTextStripper.getText(document);
                    System.out.print(content);*/
                    /*Image image = renderer.renderImageWithDPI(i, 100);*/
                    //生成图片代码,100是生成的图片大小
                    BufferedImage image = renderer.renderImageWithDPI(i, 100);
                    BufferedImage buffImg = new BufferedImage(image.getWidth(null),
                            image.getHeight(null), BufferedImage.TYPE_INT_RGB);

                    Graphics2D graphics = buffImg.createGraphics();
                    graphics.setColor(Color.RED);
                    graphics.setFont(new Font("宋体", Font.BOLD, 36));
                    graphics.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);

                    int x = image.getWidth(null) - 2*getWatermarkLength(waterMarkContent,graphics);
                    int y = image.getHeight(null) - 2*getWatermarkLength(waterMarkContent,graphics);
                    graphics.drawString(waterMarkContent, x, y);
                    graphics.dispose();


                    FileOutputStream out = new FileOutputStream("D:\\d\\" + UUID.randomUUID() + ".png");
                    ImageIO.write(buffImg, "png", out);
                    ppt.write(out);
                    out.close();
                    break;
                }
            }
        }


    }

    public static int getWatermarkLength(String waterMarkContent, Graphics2D graphics) {
        return graphics.getFontMetrics(graphics.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

 

 


版权声明:本文为caoyang0105原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。