首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在尝试使用Apache将ppt转换成pdf,但是通过跟踪error.Please可以帮助我摆脱这种状况。

我正在尝试使用Apache将ppt转换成pdf,但是通过跟踪error.Please可以帮助我摆脱这种状况。
EN

Stack Overflow用户
提问于 2020-05-20 07:56:56
回答 1查看 396关注 0票数 0

使用下列代码:

代码语言:javascript
复制
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++;
    }

}

这会引发以下异常:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-20 09:40:35

来回答为什么会出现这样的异常。也许这对其他人也有帮助:

如果将来自不同版本的Apache POI jars混合使用,则会出现这种异常。这是不支持的。见常见问题

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61907910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档