Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FopFactory.newInstance()时出现Fop异常_Java_Exception_Struts2_Apache Fop - Fatal编程技术网

Java FopFactory.newInstance()时出现Fop异常

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

我正在使用struts 2,并尝试使用fop从xml和xsl创建pdf文件。我用这两个url和

这是我的代码,我尝试使用两种不同的方法

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