使用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版权协议,转载请附上原文出处链接和本声明。