Java FopFactory.newInstance()时出现Fop异常
我正在使用struts 2,并尝试使用fop从xml和xsl创建pdf文件。我用这两个url和 这是我的代码,我尝试使用两种不同的方法Java FopFactory.newInstance()时出现Fop异常,java,exception,struts2,apache-fop,Java,Exception,Struts2,Apache Fop,我正在使用struts 2,并尝试使用fop从xml和xsl创建pdf文件。我用这两个url和 这是我的代码,我尝试使用两种不同的方法 public class JspToPdfTest extends ActionSupport{ private InputStream inputStream; private Xml2PdfManager xml2PdfManager; public InputStream getInputStream() { return inputStrea
public class JspToPdfTest extends ActionSupport{
private InputStream inputStream;
private Xml2PdfManager xml2PdfManager;
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public JspToPdfTest(){
xml2PdfManager = new Xml2PdfManager();
}
public String doPrint() {
String xml = "C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\testeFOPxml.xml";
String xslPath = "C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\xml2fo.xsl";
InputStream xmlInput = new ByteArrayInputStream(xml.getBytes());
ByteArrayOutputStream out = (ByteArrayOutputStream) xml2PdfManager.convertXML2PDF(xmlInput, new File(xslPath));
inputStream = new ByteArrayInputStream(out.toByteArray());
return SUCCESS;
}
public String xmlToPdf() {
try {
System.out.println("FOP ExampleXML2PDF\n");
System.out.println("Preparing...");
File baseDir = new File("C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\");
File outDir = new File(baseDir, "out");
outDir.mkdirs();
File xmlfile = new File(baseDir, "testeFOPxml.xml");
File xsltfile = new File(baseDir, "xml2fo.xsl");
File pdffile = new File(outDir, "ResultXML2PDF.pdf");
final FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
OutputStream out = new java.io.FileOutputStream(pdffile);
out = new java.io.BufferedOutputStream(out);
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
transformer.setParameter("versionParam", "2.0");
Source src = new StreamSource(xmlfile);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
} finally {
out.close();
}
} catch (Exception e) {
e.printStackTrace(System.err);
System.exit(-1);
}
return SUCCESS;
}
}
以及struts.xml操作
<action name="printDomAction2" class="com.somePackage.actions.JspToPdfTest" method="xmlToPdf"> -->
<result type="stream" name="success">
<param name="contentType">application/pdf</param>
<param name="contentDisposition">filename="dom.pdf"</param>
<param name="bufferSize">1024</param>
</result>
<interceptor-ref name="defaultStack"/>
</action>
<action name="printDomAction" class="com.somePackage.actions.JspToPdfTest" method="doPrint">
<result type="stream" name="success">
<param name="contentType">application/pdf</param>
<param name="contentDisposition">filename="dom.pdf"</param>
<param name="bufferSize">1024</param>
</result>
<interceptor-ref name="defaultStack"/>
</action>
在这两种情况下,我都有:
java.lang.NoSuchMethodError:
org.apache.xmlgraphics.util.Service.providerNames(Ljava/lang/Class;)Ljava/util/Iterator;
当我执行FopFactory.newInstance()时
任何帮助我的建议都会很好 我解决了我的问题!我使用的是xmlgraphics-commons-1.3,而不是xmlgraphics-commons-1.5。这很奇怪,因为我使用了fop垃圾箱附带的所有库 顺便说一下,在浏览器上转换和显示pdf文件的代码如下:
<action name="printDomAction" class="com.somePackage.actions.JspToPdfTest" method="xmlToPdf">
<result type="stream" name="success">
<param name="contentType">application/pdf</param>
<param name="contentDisposition">filename="ResultXML2PDF.pdf"</param>
<param name="bufferSize">1024</param>
</result>
<interceptor-ref name="defaultStack"/>
</action>
谢谢大家的提示和帮助 你能独立完成它吗?你使用的所有东西都是正确的库版本吗?你是如何管理你的依赖关系的?@MohanaRao SV不,我并没有试图单独做这件事。。我必须使用struts2和spring实现它…@Dave Newton关于库是的,我想我有所有正确的库,关于依赖关系我不知道如何回答你,我如何管理依赖关系?我有点困惑。@dabasiu单独尝试它的目的是为了看看它是否是一个环境问题、代码问题等,而不需要将其处理到S2中的额外开销。“思考”你拥有所有正确的版本是不够的,你必须知道你拥有所有正确的版本。一种方法是使用依赖关系管理工具,如Maven、Gradle等。
<action name="printDomAction" class="com.somePackage.actions.JspToPdfTest" method="xmlToPdf">
<result type="stream" name="success">
<param name="contentType">application/pdf</param>
<param name="contentDisposition">filename="ResultXML2PDF.pdf"</param>
<param name="bufferSize">1024</param>
</result>
<interceptor-ref name="defaultStack"/>
</action>
private InputStream inputStream;
public String xmlToPdf() {
try {
System.out.println("FOP ExampleXML2PDF\n");
System.out.println("Preparing...");
// Setup directories
File baseDir = new File("C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\");
File outDir = new File(baseDir, "out");
outDir.mkdirs();
// Setup input and output files
File xmlfile = new File(baseDir, "testeFOPxml.xml");
File xsltfile = new File(baseDir, "xml2fo.xsl");
File pdffile = new File(outDir, "ResultXML2PDF.pdf");
System.out.println("Input: XML (" + xmlfile + ")");
System.out.println("Stylesheet: " + xsltfile);
System.out.println("Output: PDF (" + pdffile + ")");
System.out.println();
System.out.println("Transforming...");
// configure fopFactory as desired
final FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired
ByteArrayOutputStream out = new ByteArrayOutputStream();
TransformerFactory tFactory = TransformerFactory.newInstance();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,foUserAgent, out);
//Setup input
Source src = new StreamSource(xmlfile);
//Setup Transformer
Source xsltSrc = new StreamSource(xsltfile);
Transformer transformer = tFactory.newTransformer(xsltSrc);
//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
System.out.println("Success!");
ByteArrayOutputStream baos = out;
inputStream = new ByteArrayInputStream(baos.toByteArray());
} catch (Exception e) {
e.printStackTrace(System.err);
System.exit(-1);
}
return SUCCESS;
}