【发布时间】:2018-03-11 04:22:00
【问题描述】:
我正在尝试编写 Word-To-PDF 转换器并将 Java 代码以 Java Applet 的形式构建到 HTML 网站中。
我使用了来自http://java.worldbestlearningcenter.com/2013/07/word-to-pdf-converter.html 的 Java 代码。代码本身似乎工作得很好,当我在 Eclipse 中运行程序时,我确实可以将 word 文档转换为 PDF。现在我想将该代码添加到我的 HTML 文件中并使其工作。
为此,我从 JApplet 继承了我的类并编写了方法 paint()。 我现在的代码看起来像下面的 sn-p:
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 内部工作,而不是在外部工作。任何帮助都会非常感激。
== 编辑 == .classpath 文件:
<?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>
现在我收到 IE 的错误“NoClassFound”。
【问题讨论】:
-
当您使用它时,将 iText 5.1.0 替换为 iText 5.5.12。或者迁移到 iText 7.0.4。前者是替代品,后者需要您稍微更改代码。大多数情况下,与 iText 5 相比,使用 iText 7 所需的代码更少。
-
下面的“答案”应该是问题的edit。那些代码 sn-ps 不适合
Run code snippet- 那是用于 JS /HTML。请对代码和代码 sn-ps、HTML/XML 等结构化文档或输入/输出使用代码格式化。为此,请选择文本并单击消息发布/编辑表单顶部的{}按钮。 -
对不起,我现在有点傻。我用正确的格式编辑了上面问题中的代码。
标签: java applet itext noclassdeffounderror