我使用的是struts 2,我试图使用fop从xml和xsl创建一个pdf文件。我发展我的代码基础这两网址http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/examples/embedding/java/embedding/ExampleXML2PDF.java?view=markup和http://justcode.wordpress.com/2009/01/16/generare-pdf-con-struts2-fop-xml-e-xslt/Fop异常当FopFactory.newInstance()
这里是我的代码,我使用两种不同的方式
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>
finnaly的xml2PdfManager.convertXML2PDF方法:
public OutputStream convertXML2PDF(InputStream xml, File xsl) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
FopFactory fopFactory = FopFactory.newInstance();
TransformerFactory tFactory = TransformerFactory.newInstance();
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
Source src = new StreamSource(xml);
Source xsltSrc = new StreamSource(xsl);
Transformer transformer = tFactory.newTransformer(xsltSrc);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
} catch (Exception e) {
e.printStackTrace(System.err);
}
return out;
}
在这两种情况下,我已经有了:
java.lang.NoSuchMethodError:
org.apache.xmlgraphics.util.Service.providerNames(Ljava/lang/Class;)Ljava/util/Iterator;
当我做FopFactory.newInstance();
任何帮助我会很好!
你能够单独做到这一点吗? – 2013-03-19 18:41:00
您是否使用了正确的库版本?你如何管理你的依赖关系? – 2013-03-19 19:03:14
@MohanaRao SV不,我没有尝试独立完成它..我必须使用struts2和spring来实现它... – tviana 2013-03-19 19:09:25