0

これは、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フォルダーにあり、サーブレットはデフォルトのパッケージにあります。

エラー:

(エラーの場所は不明)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(xmlとxslが必要なXSL-FO変換..)を生成するクラスを使用して、コードをサーブレットにコピーしました。出力ストリームとボリュームを調整しました!

完全に正常に機能する新しいサーブレットのコードは次のとおりです。

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 に答える