问题情景:要求使用Java编写一个程序,实现类似于PPT播放器的功能。(导入相应的poi包,将PPT先转化为图片,然后在panel上画出对应张数的图片)。
未遇到问题前解决过程
①在http://poi.apache.org/download.html下载相应jar包;
②解压后导入如下两个包;
③在IDEA导入如图两个包,导入包的步骤正确;
④编写程序如下,将PPT转化图片操作参照http://poi.apache.org/components/slideshow/how-to-shapes.html
package cn.bnu.edu.qhx.zy03;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class PPT {
public static void main(String[] args) {
PPT ppt = new PPT();
String property;
property = System.getProperty("java.classpath");
System.out.println(property);
try {
ppt.ReadPPTtoImg();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void ReadPPTtoImg() throws IOException {
HSLFSlideShow ppt;
FileInputStream is = new FileInputStream("res/1_1.ppt");
ppt = new HSLFSlideShow(is);
Dimension pgsize = ppt.getPageSize();
int idx = 1;
for(HSLFSlide slide:ppt.getSlides()) {
BufferedImage img = new BufferedImage(pgsize.width,pgsize.height,BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0,0,pgsize.width,pgsize.height));
slide.draw(graphics);
FileOutputStream out = new FileOutputStream("slide-" +idx + ".png");
javax.imageio.ImageIO.write(img,"png",out);
out.close();
idx++;
}
}
}
⑤运行程序后出现如下问题:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
at cn.bnu.edu.qhx.zy03.PPT.ReadPPTtoImg(PPT.java:31)
at cn.bnu.edu.qhx.zy03.PPT.main(PPT.java:21)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
... 2 more
Process finished with exit code 1
⑥根据报错提示,添加http://archive.apache.org/dist/commons/io/binaries/
⑦运行程序出现如下问题:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
at org.apache.poi.POIDocument.<clinit>(POIDocument.java:65)
at cn.bnu.edu.qhx.zy03.PPT.ReadPPTtoImg(PPT.java:31)
at cn.bnu.edu.qhx.zy03.PPT.main(PPT.java:21)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
... 3 more
⑧根据报错,再次添加缺少https://logging.apache.org/log4j/2.x/download.html,将图中目录下所有的包均导入;
⑨在次运行程序,出现如下问题:
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)
at org.apache.logging.log4j.spi.LoggerContext.getLogger(LoggerContext.java:99)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599)
at org.apache.poi.POIDocument.<clinit>(POIDocument.java:65)
at cn.bnu.edu.qhx.zy03.PPT.ReadPPTtoImg(PPT.java:31)
at cn.bnu.edu.qhx.zy03.PPT.main(PPT.java:21)
Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
... 6 more
⑩再次按报错导入相应https://repo1.maven.org/maven2/org/slf4j/slf4j-api/:
11.再次运行程序出现如下问题:
Exception in thread "main" java.lang.ExceptionInInitializerError
at cn.bnu.edu.qhx.zy03.PPT.ReadPPTtoImg(PPT.java:31)
at cn.bnu.edu.qhx.zy03.PPT.main(PPT.java:21)
Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j
at org.apache.logging.slf4j.Log4jLoggerFactory.validateContext(Log4jLoggerFactory.java:49)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:39)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:30)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:53)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:30)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:285)
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)
at org.apache.logging.log4j.spi.LoggerContext.getLogger(LoggerContext.java:99)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599)
at org.apache.poi.POIDocument.<clinit>(POIDocument.java:65)
... 2 more
Process finished with exit code 1
最后,我不会调试了,彻底崩了,求问各位大,能否指出哪一步可能存在问题。