我尝试编写Word-to-PDF转换器,并以Java Applet的形式将Java代码构建到HTML网站中。
我使用了来自http://java.worldbestlearningcenter.com/2013/07/word-to-pdf-converter.html的Java代码。代码本身似乎工作得很好,当我在Eclipse中运行程序时,我确实可以将word文档转换为PDF。现在,我想将该代码添加到我的HTML文件中并使其正常工作。
为此,我从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需要特殊权限),我收到错误&#34; java.lang.noClassDefFoundError:com / itextpdf / text /元素&#34;
我也可以说出来:
除了上面列出的要点之外,我无法在网上找到任何其他帮助。我真的无能为力地得到这样的错误还有什么问题,特别是因为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>
现在我收到了错误&#34; NoClassFound&#34;通过IE浏览器。
答案 0 :(得分:1)
我在项目文件夹
中的WEB-INF / lib文件夹中有所有JAR文件
浏览器无法直接获取该位置的JAR(通过在浏览器地址栏中输入Jar的完整路径并按Enter键进行尝试),或者通过扩展,使用JVM。
lib文件夹中的所有JAR文件也在CLASSPATH中。
究竟是什么CLASSPATH
?
但那些不是唯一的问题。
<param name="archive" value="ConverterApplet.jar" />
需要在archive
元素中明确引用iText jar(以及与applet相关的每个jar)。
我真的很无能得到这样一个错误的问题,特别是因为Java代码本身在Eclipse中运行,但不在外部。
编写applet并将其部署到互联网上以供一般使用,这些问题几乎相同。或者换句话说,当它“在IDE中运行正常时,只需要部署它”时,工作大约完成了一半。
.classpath是项目主根中的文件
该文件仅对您的IDE有用。浏览器(或使用浏览器启动applet时的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,archive param
用作archive
元素的applet
属性。< / p>
因此下一行是它开始出错的地方。您的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 .." />
....
在(单个)archive
元素的空格分隔列表中命名每个 Jar。然后他们将被放在applet的运行时类路径上。
答案 1 :(得分:0)
Java applet技术已被标记为弃用。许多浏览器默认禁用Java applet。参见
大约一年前,我们写了一篇帖子,宣布计划弃用 JDK 9中的Java浏览器插件是由于浏览器供应商的转移 推出所需的基于标准的NPAPI插件支持技术 Java Applets。
从那时起,Oracle开发团队发布了一个JDK 增强建议(JEP 289:弃用Applet API) 有关JDK 9中计划弃用步骤的技术细节。
此外,还删除了基于标准的插件的更新时间表 来自浏览器的支持,消除了嵌入Java的可能性 和其他基于插件的技术,已经公布了 Apple Safari和Mozilla Firefox的开发者。依据 他们的时间表,从Mozilla Firefox 52开始,即将发布 2017年3月,32位版本的Mozilla Firefox将不复存在 为基于标准的插件支持提供必需的API。该 推出了64位版本的Mozilla Firefox for Microsoft Windows 不支持大多数基于NPAPI的插件,包括Java。
我的建议是您迁移到Oracle或OpenJDK博客中描述的不同技术之一。