2013-03-19 63 views
1

我使用的是struts 2,我试图使用fop从xml和xsl创建一个pdf文件。我发展我的代码基础这两网址http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/examples/embedding/java/embedding/ExampleXML2PDF.java?view=markuphttp://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();

任何帮助我会很好!

+0

你能够单独做到这一点吗? – 2013-03-19 18:41:00

+0

您是否使用了正确的库版本?你如何管理你的依赖关系? – 2013-03-19 19:03:14

+0

@MohanaRao SV不,我没有尝试独立完成它..我必须使用struts2和spring来实现它... – tviana 2013-03-19 19:09:25

回答

1

我解决了我的问题!我有xmlgraphics-commons-1.3而不是xmlgraphics-commons-1.5。这很奇怪,因为我使用了fop bin的所有库。

通过的方式,转换并显示在浏览器上的代码的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> 

和方法

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; 
      } 

谢谢大家的提示和帮助!