我正在尝试使用 Apache POI 将 ppt 转换为 pdf,但出现以下错误.请帮助我摆脱困境



使用以下代码:

public static void main(String[] args) throws IOException {
FileInputStream is = new FileInputStream("C:/Users/hp/Downloads/sampPPT.ppt");
HSLFSlideShow ppt = new HSLFSlideShow(is);
is.close();
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();
// clear the drawing area
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
// render
slide.draw(graphics);
// save the output
FileOutputStream out = new FileOutputStream("C:/Users/hp/Downloads/slide-" + idx + ".png");
javax.imageio.ImageIO.write(img, "png", out);
out.close();
idx++;
}
}

这将引发以下异常:

Exception in thread "main" java.lang.IllegalAccessError: class org.apache.poi.hslf.usermodel.HSLFSlideShowImpl tried to access private field org.apache.poi.POIDocument.directory (org.apache.poi.hslf.usermodel.HSLFSlideShowImpl and org.apache.poi.POIDocument are in unnamed module of loader 'app')
at org.apache.poi.hslf.usermodel.HSLFSlideShowImpl.readCurrentUserStream(HSLFSlideShowImpl.java:340)
at org.apache.poi.hslf.usermodel.HSLFSlideShowImpl.<init>(HSLFSlideShowImpl.java:154)
at org.apache.poi.hslf.usermodel.HSLFSlideShowImpl.<init>(HSLFSlideShowImpl.java:127)
at org.apache.poi.hslf.usermodel.HSLFSlideShowImpl.<init>(HSLFSlideShowImpl.java:116)
at org.apache.poi.hslf.usermodel.HSLFSlideShow.<init>(HSLFSlideShow.java:138)
at PPTConv.PPTConv.main(PPTConv.java:27)

回答为什么会发生这种异常。也许这对其他人也有帮助:

如果您混合了来自不同版本的Apache POI罐子,则会发生这种异常。不支持此操作。请参阅常见问题解答。

在这种特殊情况下,类路径中可能存在来自不同版本的poi-*.jarpoi-scratchpad-*.jar。类org.apache.poi.hslf.usermodel.HSLFSlideShowImpl扩展org.apache.poi.POIDocument包含在poi-scratchpad-*.jar中,而类org.apache.poi.POIDocument包含在poi-*.jar中。如果这些*.jar来自不同的版本,则可能会发生以下情况:

poi-scratchpad-3.15.jar调用的org.apache.poi.hslf.usermodel.HSLFSlideShowImplcurrentUser = new CurrentUserAtom(directory);代码行 340 中。这是可能的,因为它扩展了org.apache.poi.POIDocument并且在版本3.15(poi-3.15.jar( 中具有字段protected DirectoryNode directory;

但是版本3.16(poi-3.16.jar( 的同一类org.apache.poi.POIDocument具有字段private DirectoryNode directory;。 因此,如果版本3.15org.apache.poi.hslf.usermodel.HSLFSlideShowImpl在代码行 340 中调用currentUser = new CurrentUserAtom(directory);,但org.apache.poi.POIDocument来自版本3.16,则抛出java.lang.IllegalAccessError: class org.apache.poi.hslf.usermodel.HSLFSlideShowImpl tried to access private field org.apache.poi.POIDocument.directory,因为它现在确实尝试访问私有字段。

最新更新