You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包截图

我的外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:44:51