0

这是我的 Servlet 代码片段,它生成 PDF 然后打开它。它无法打开“AvtoSolaZaposleniXSL.xsl”文件。如果我在普通的 Java 类中运行相同的过程,一切都会顺利进行。

public class PDF extends HttpServlet {
private static final long serialVersionUID = 1L;

public PDF() { super(); }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //Generiraj PDF
    File xmlfile = new File(getServletContext().getRealPath("AvtoSolaZ.xml"));
    File xsltfile = new File(getServletContext().getRealPath("AvtoSolaZaposleniXSL.xsl"));      
    ExampleXML2PDF.generirajPDF(xmlfile, xsltfile);

    //Počakaj da se v miru zgenerira PDF
    try {
        Thread.sleep(5000L);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }

    //Zaženi pdf
    File f1 = new File(getServletContext().getRealPath("Avtosola.pdf"));
    String pdfKoncni = f1.toString();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfReader reader = new PdfReader(pdfKoncni);
    PdfStamper stamper = null;
    try {
        stamper = new PdfStamper(reader, baos);
    } catch (DocumentException e) {
        e.printStackTrace();
    }
    try {
        stamper.close();
    } catch (DocumentException e) {
        e.printStackTrace();
    }

    // set some response headers
    response.setHeader("Expires", "0");
    response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
    response.setHeader("Pragma", "public");
    response.setContentType("application/pdf");
    response.setContentLength(baos.size());

    OutputStream os = response.getOutputStream();
    baos.writeTo(os);
    os.flush();
    os.close();
}

我的所有文件都在 WebContent 文件夹中,而我的 Servlet 在默认包中。

错误:

(错误位置未知)java.io.FileNotFoundException: C:\Eclipse\eclipse\WebContent\AvtoSolaZaposleniXSL.xsl (系统找不到指定的文件) java.lang.NullPointerException

相信我,我已经搜索过这样的答案,但没有找到任何可以真正帮助我的东西。即使我放置了整个路径(不是 C:\Eclipse\eclipse... 而且我不知道为什么会这样说..)它仍然无法正常工作。

就像我说的。如果我在普通的 Java 类中运行它,它会正常生成 PDF 并且工作得很好......

import java.io.File;

public class Test {

public static void main(String[] args) {        

    File xmlfile = new File("WebContent/AvtoSolaZ.xml");
    File xsltfile = new File("WebContent/AvtoSolaZaposleniXSL.xsl");
    ExampleXML2PDF.generirajPDF(xmlfile, xsltfile);
}
}

请帮忙!

4

2 回答 2

0

服务器指的是读取文件的绝对路径。

因此,在您的情况下.. 将您的文件放在 projectRootName/AvtoSolaZaposleniXSL.xsl 下。

它会起作用的。

于 2012-11-21T10:30:02.550 回答
0

我重新考虑了我的问题,并想出了一个更简单的解决方案来显示生成的 pdf。我刚刚使用了我的类,它生成了一个 pdf(XSL-FO 转换,需要一个 xml 和 xsl ..)并将代码复制到 servlet 中。调整了输出流和voula!

这是新的 servlet 的代码,它工作得很好:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    try {

        response.setContentType("application/pdf"); 

        // Setup directories
        File xmlfile = new File(getServletContext().getRealPath("/AvtoSolaZ.xml"));
        File xsltfile = new File(getServletContext().getRealPath("/AvtoSolaZaposleniXSL.xsl")); 
        File outDir = new File("WebContent");
        outDir.mkdirs();

        // configure fopFactory as desired
        FopFactory fopFactory = FopFactory.newInstance();

        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        // configure foUserAgent as desired

        // Setup output
        OutputStream out = response.getOutputStream();

        try {
            // Construct fop with desired output format
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

            // Setup XSLT
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory
                    .newTransformer(new StreamSource(xsltfile));

            // Set the value of a <param> in the stylesheet
            transformer.setParameter("versionParam", "2.0");

            // Setup input for XSLT transformation
            Source src = new StreamSource(xmlfile);

            // Resulting SAX events (the generated FO) must be piped through
            // to FOP
            Result res = new SAXResult(fop.getDefaultHandler());

            // Start XSLT transformation and FOP processing
            transformer.transform(src, res);

        } finally {
            out.close();
        }

    } catch (Exception e) {
        e.printStackTrace(System.err);
        System.exit(-1);
    }
}
于 2012-11-23T11:21:21.813 回答