当前位置: 首页 > 知识库问答 >
问题:

Java语言lang.noClassDefFoundError:com/itextpdf/text/element在Java小程序上

蔡辰钊
2023-03-14

我正在尝试编写一个Word-to-PDF转换器,并将Java代码以Java小程序的形式构建到HTML网站中。

我使用了http://java.worldbestlearningcenter.com/2013/07/word-to-pdf-converter.html.的Java代码。代码本身似乎工作得很好,当我在Eclipse中运行程序时,我确实可以将word文档转换为PDF。现在我想将该代码添加到我的超文本标记语言文件中,并使其工作。

为此,我从JApplet中创建了herit类,并编写了方法paint()。我现在拥有的代码如下所示:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFPicture;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.PageSize;
import java.applet.*;
import java.awt.*;

public class ConverterApplet extends Applet {
    private static final long serialVersionUID = 1L;

    public void paint(Graphics g) {
        g.drawString("Hello", 60, 40);
        selectFiles();
    }

    public static void selectFiles(){
        JFileChooser chooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Microsoft Word 2007+", "docx");
        chooser.setFileFilter(filter);
        chooser.setMultiSelectionEnabled(true);
        int returnVal = chooser.showOpenDialog(null);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            File[] Files=chooser.getSelectedFiles();
            System.out.println("Konvertierung gestartet ...");
            for( int i=0;i<Files.length;i++){     
                String wordfile=Files[i].toString();            
                convertWordToPdf(wordfile,wordfile.substring(0,wordfile.indexOf('.'))+".pdf");
            }

            System.out.println("Konvertierung abgeschlossen!");
        }
    }

    public static void convertWordToPdf(String src, String desc){
        try {
            //create file inputstream object to read data from file 
            FileInputStream fs=new FileInputStream(src);
            //create document object to wrap the file inputstream object
            XWPFDocument doc=new XWPFDocument(fs); 
            //72 units=1 inch
            Document pdfdoc=new Document(PageSize.A4,72,72,72,72);
            //create a pdf writer object to write text to mypdf.pdf file
            PdfWriter pwriter=PdfWriter.getInstance(pdfdoc, new FileOutputStream(desc));
            //specify the vertical space between the lines of text
            pwriter.setInitialLeading(20);
            //get all paragraphs from word docx
            List<XWPFParagraph> plist=doc.getParagraphs();

            //open pdf document for writing
            pdfdoc.open();
            for (int i = 0; i < plist.size(); i++) {
                //read through the list of paragraphs
                XWPFParagraph pa = plist.get(i);
                //get all run objects from each paragraph
                List<XWPFRun> runs = pa.getRuns();
                //read through the run objects
                for (int j = 0; j < runs.size(); j++) {       
                    XWPFRun run=runs.get(j);
                    //get pictures from the run and add them to the pdf document
                    List<XWPFPicture> piclist=run.getEmbeddedPictures();
                    //traverse through the list and write each image to a file
                    Iterator<XWPFPicture> iterator=piclist.iterator();
                    while(iterator.hasNext()){
                        XWPFPicture pic=iterator.next();
                        XWPFPictureData picdata=pic.getPictureData();
                        byte[] bytepic=picdata.getData(); 
                        Image imag=Image.getInstance(bytepic);
                        pdfdoc.add(imag);

                    }
                    //get color code
                    int color=getCode(run.getColor());
                    //construct font object
                    Font f=null;
                    if(run.isBold() && run.isItalic())
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.BOLDITALIC, new BaseColor(color));
                    else if(run.isBold())
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.BOLD, new BaseColor(color));
                    else if(run.isItalic())
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.ITALIC, new BaseColor(color));
                    else if(run.isStrike())
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.STRIKETHRU, new BaseColor(color));
                    else
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.NORMAL, new BaseColor(color));
                    //construct unicode string
                    String text=run.getText(-1);
                    byte[] bs;
                    if (text!=null){
                        bs=text.getBytes();
                        String str=new String(bs,"UTF-8");
                        //add string to the pdf document
                        Chunk chObj1=new Chunk(str,f);
                        pdfdoc.add(chObj1);
                    }      

                }
                //output new line
                pdfdoc.add(new Chunk(Chunk.NEWLINE));
            }
            //close pdf document  
            pdfdoc.close();
        } catch(Exception e){
            e.printStackTrace();
        }
    } 

    public static int getCode(String code){
        int colorCode;
        if(code!=null)
            colorCode=Long.decode("0x"+code).intValue();
        else
            colorCode=Long.decode("0x000000").intValue();
        return colorCode;
    }
}

我用以下代码创建了一个HTML文档:

<DOCTYPE! html>
<html lang="DE-CH">
    <head>
        <title>Testseite</title>
    </head>

    <body>
        <h1>Titel</h1>

        <object type="application/x-java-applet" width="800" height="600">
            <param name="code" value="ConverterApplet" />
            <param name="archive" value="ConverterApplet.jar" />
            Applet failed to run.  No Java plug-in was found.
        </object>

    </body>
</html> 

当试图在Internet Explorer中打开HTML页面时(Chrome和Firefox似乎不起作用,甚至IE也需要特殊权限),我得到了错误“java.lang.noClassDefFoundError:com/itextpdf/text/element”。

我还可以说:

  • 我只有一个itextpdf的JAR文件。它是5.1.0版,因为2.1.7不包括特定代码需要的所有包。没有其他类似于itextpdf的JAR文件。
  • 我在项目文件夹中的WEB-INF/lib文件夹中拥有所有JAR文件
  • lib文件夹中的所有JAR文件也在CLASSPATH中。
  • 我有一个更新版本的代码导出为ConverterApplet.jar,该文件也在项目的根文件夹和CLASSPATH中。
  • 我尝试了浏览器Chrome、Firefox、Opera、Edge和Internet Explorer。只有最后一个甚至给了我看到(不工作)小程序的可能性,所有其他人都说“找不到插件”。

除了上面列出的要点,我在网上找不到任何其他帮助。我真的不知道还有什么问题会出现这样的错误,特别是因为Java代码本身在Eclipse内部工作,而不是在Eclipse外部。任何帮助都会被吸引。

==编辑==。类路径文件:

    <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/ConverterApplet.jar"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/dom4j-1.6.1.jar"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/openxml4j-1.0-beta.jar"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/poi-3.9.jar"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/poi-ooxml-3.8.jar"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/poi-ooxml-schemas-3.9.jar"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/xmlbeans-2.5.0.jar"/>
    <classpathentry kind="lib" path="C:/Users/silve/Documents/Eclipse_Launch/Converter/itextpdf-5.5.12.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

新建HTML文件:

<DOCTYPE! html>
<html lang="DE-CH">
    <head>
        <title>Testseite</title>
    </head>

    <body>
        <h1>Titel</h1>

        <object type="application/x-java-applet" width="800" height="600">
            <param name="code" value="ConverterApplet" />
            <param name="archive" value="~/ConverterApplet.jar" />
            <param name="dom_archive" value="~/dom4j-1.6.1.jar" />
            <param name="itext_archive" value="~/itextpdf-5.5.12.jar" />
            <param name="openxml_archive" value="~/openxml4j-1.0-beta.jar" />
            <param name="poi_archive" value="~/poi-3.9.jar" />
            <param name="ooxml_archive" value="~/poi-ooxml-3.8.jar" />
            <param name="schemas_archive" value="~/poi-ooxml-schemas-3.9.jar" />
            <param name="mxmlbeans_archive" value="~/xmlbeans-2.5.0" />

            Applet failed to run.  No Java plug-in was found.
        </object>

    </body>
</html> 

现在,我得到错误"NoClass发现"的IE。

共有2个答案

冯宏浚
2023-03-14

Java小程序技术已被标记为弃用。许多浏览器默认禁用Java小程序。见

  • http://openjdk.java.net/jeps/289
  • https://blogs.oracle.com/java-platform-group/moving-to-a-plugin-free-web
  • https://blogs.oracle.com/java-platform-group/further-updates-to-moving-to-a-plugin-free-web

大约一年前,我们写了一篇文章,宣布计划弃用JDK 9中的Java浏览器插件,因为浏览器供应商正在远离启动JavaApplets所需的基于标准的NPAPI插件支持技术。

此后,Oracle开发团队发布了一份JDK增强建议(JEP 289:弃用小程序API),其中包含了有关JDK 9中计划弃用步骤的技术细节。

此外,苹果Safari和Mozilla Firefox的开发者已经宣布了从浏览器中删除基于标准的插件支持的更新时间表,从而消除了嵌入Java和其他基于插件的技术的可能性。根据他们的时间表,从2017年3月发布的Mozilla Firefox 52开始,32位版本的Mozilla Firefox将不再提供基于标准的插件支持所需的API。针对Microsoft Windows的64位版本Mozilla Firefox在不支持大多数基于NPAPI的插件(包括Java)的情况下发布。

我的建议是,您可以迁移到Oracle或OpenJDK博客中描述的不同技术之一。

楮乐邦
2023-03-14

我在项目文件夹中的WEB-INF/lib文件夹中有所有JAR文件

浏览器无法直接获取该位置的罐子(将罐子的完整路径放在浏览器地址栏中试试

lib文件夹中的所有JAR文件也位于类路径中。

什么是类路径?

但这些不是唯一的问题。

<param name="archive" value="ConverterApplet.jar" />

iText震动(

我真的不知道还有什么问题会导致这样的错误,尤其是因为Java代码本身在Eclipse内部工作,但在外部不工作。

编写一个小程序,并将其部署到Internet上通用,是难度大致相当的问题。或者换句话说,当“它在IDE中运行正常,只需要部署它”时,这项工作大约完成了一半。

.类路径是项目主根目录中的文件

该文件仅对IDE有用。浏览器(或使用浏览器启动小程序时的JVM)不会访问或解释它。

<object type="application/x-java-applet" width="800" height="600">
        <param name="code" value="ConverterApplet" />
        <param name="archive" value="~/ConverterApplet.jar" />
        <param name="dom_archive" value="~/dom4j-1.6.1.jar" />
        ....

我对object元素有点生疏,但是AFAIR,将使用归档参数作为applet元素的归档属性。

因此,下一行是开始出错的地方。小程序本身可能会读取dom_archive属性,但JM不会将该归档考虑在运行时类路径上。对于这两行,应改为:

<object type="application/x-java-applet" width="800" height="600">
        <param name="code" value="ConverterApplet" />
        <param name="archive" value="~/ConverterApplet.jar ~/dom4j-1.6.1.jar .." />
        ....

在(single)归档元素中以空格分隔的列表命名每个Jar。然后,它们将被放置在小程序的运行时类路径上。

 类似资料:
  • 我是Java新手,我正在研究从html生成pdf。因此,我正在使用iText7,我可以通过PdfWriter和Document生成一个普通的pdf文件,但我不能使用html2pdf。 这是我的Pom。xml 这是我的java代码: 错误在线上: 我阅读了其他与 Java语言lang.NoClassDefFoundError 他们说我需要添加io和slf4j依赖项,但是错误仍然存在。提前谢谢。

  • 我正在使用Gradle设置一个使用itext7生成pdf文件的测试项目。 如果我在Netbean IDE中运行我的主类,一切正常;创建了一个“结果”文件夹,我可以在其中找到生成的pdf。 但是如果我清理并构建项目,进入project_folder/build/libs并尝试执行java-jarmypdfproject.jar文件,我得到这个错误= 这是我的主课(MyPdfMain.class) 这

  • 问题内容: 我正在尝试通过以下servlet生成动态PDF文件。 但我收到以下错误: 我正在使用 weblogic应用程序服务器8.1 ....我正在使用 iTextPDF 。所以我已经为jar文件设置了CLASSPATH。 请告诉我为什么会出现此错误????我已经花了很多时间。没有遇到小问题。请帮助我。 谢谢 完成建议的操作后,出现以下错误 问题答案: 先前的答案告诉您,缺少了一个jar,这不是

  • 下面是一个程序,它应该计算小数点后的双倍值中的位数。在输入一些双值时,程序倾向于开始一个无限循环(可能是由于浮点不精确)。我不想使用任何包装器方法(包括String类)。有人可能为某些输入的无休止循环提供解释并提供解决方案吗?

  • 请参阅JLS7。第3.2节第16页指出 谢谢