Java中将图片保存为PDF时出现NoClassDefFoundError问题求助
问题描述
我在Java中尝试将图片保存为PDF,编写了相关代码并导入Apache PDFBox的相关类,也按常规方式添加了外部JAR包(所有JAR在同一目录),但运行时抛出java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument错误。以下是我的代码、错误堆栈信息及外部JAR包截图,求解决帮助,如需其他信息可提供。
代码片段
package semestralka; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.Color; import java.awt.Dimension; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import javax.swing.JPanel; public void save(String format, String imageSaveName) { BufferedImage panelImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D panelGraphics = panelImage.createGraphics(); paint(panelGraphics); BufferedImage finalCard = new BufferedImage(CARD_WIDTH, CARD_HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D img = finalCard.createGraphics(); img.drawImage(panelImage, 0, 0, null); if (format.equals("pdf")) { System.out.println(format); try{ PDDocument doc = new PDDocument(); PDPage page = new PDPage(); doc.addPage(page); PDPageContentStream contentStream = new PDPageContentStream(doc, page); PDImageXObject pdImage = LosslessFactory.createFromImage(doc, finalCard); contentStream.drawImage(pdImage, 300, 300, CARD_WIDTH, CARD_HEIGHT); contentStream.close(); File file = new File(imageSaveName + "." + format); doc.save(file); doc.close(); System.out.println("PDF saved successfully"); } catch (IOException e) { e.printStackTrace(); } } else { File file = new File(imageSaveName + "." + format); try { ImageIO.write(finalCard, format, file); System.out.println("Image saved successfully"); } catch (IOException e) { e.printStackTrace(); } } }
错误堆栈信息
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument at semestralka.DesignPanel.save(DesignPanel.java:160) at semestralka.Card$12.actionPerformed(Card.java:739) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972) at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2314) at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:407) at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6620) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3398) at java.desktop/java.awt.Component.processEvent(Component.java:6385) at java.desktop/java.awt.Container.processEvent(Container.java:2266) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4995) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:775) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:98) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.pdmodel.PDDocument at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 37 more
外部JAR包截图

解决办法
这个错误核心是运行时JVM无法找到PDFBox的类文件,即便你添加了JAR包,也可能是配置或依赖问题,按以下步骤排查:
确认JAR包完整性
截图中的pdfbox-app-2.0.30.jar是PDFBox的整合包(包含所有依赖),但要确保JAR包未损坏,可重新下载对应版本的官方包替换。检查IDE依赖配置
- Eclipse:右键项目 → Build Path → Configure Build Path → Libraries,确认PDFBox的JAR已添加且处于勾选状态,若之前手动添加过,可移除后重新添加确保路径正确。
- IntelliJ:右键项目 → Open Module Settings → Libraries,确认JAR已加入,同时在运行配置(Run/Debug Configurations)的Classpath中包含该JAR。
命令行运行的类路径问题
若用命令行编译运行,编译时需指定类路径:# Windows系统 javac -cp .;pdfbox-app-2.0.30.jar YourClass.java java -cp .;pdfbox-app-2.0.30.jar YourClass # Linux/macOS系统 javac -cp .:pdfbox-app-2.0.30.jar YourClass.java java -cp .:pdfbox-app-2.0.30.jar YourClass清理重建项目
执行IDE的清理操作(Eclipse:Project → Clean;IntelliJ:Build → Clean Project),再重新编译运行,避免缓存问题导致的类加载异常。
另外,你的代码中存在重复导入的包(如多次导入PDDocument、File等),可清理优化,但这不是引发当前错误的原因。
内容的提问来源于stack exchange,提问作者CaptainAlpacaus
相关产品推荐
相关产品推荐

