0

このjspファイルを実行すると、ファイルをpdf形式でダウンロードできますが、開こうとすると、サポートされていない形式であるというエラーが表示されます。しかし、ダウンロードしたPDFファイルをメモ帳で開こうとすると、目的のデータが得られます.しかし、復号化された形式で取得する必要があるため、データを表示するためにPDFファイルを開くのを手伝ってください..

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <%  String ID = (String) session.getAttribute("ID");
    String connectionURL = "jdbc:oracle:thin:@localhost:1521:XE";
    String url = request.getParameter("WEB_URL");
    String Content = new String("");
    Statement stmt = null;
    Connection con = null;


String Content = new String("");
                String filename = "data" + ID + ".pdf";

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(connectionURL, "temp",

            "root");
            stmt = con.createStatement();
            String qry = "select * from form where id='" + ID + "'";
            ResultSet rst = stmt.executeQuery(qry);
            if (rst.next()) {
                Content = "  FirstName: " + rst.getString("FirstName")
                        + "\r\n" + "  LastName: "
                        + rst.getString("LastName") + "\r\n" + "  Age: "
                        + rst.getString("Age") + "\r\n" + "  City: "
                        + rst.getString("City") + "\r\n" + "  Phone: "
                        + rst.getString("Phone") + "\r\n" + "  ID: "
                        + rst.getString("ID");
            }
            //out.println(Content);
            byte requestBytes[] = Content.getBytes();
            response.reset();
            response.setContentType("application/pdf");
            response.setHeader("cache-control", "no-cache");
            response.setHeader("Content-disposition",
                    "attachment; filename=" + filename);
            response.setCharacterEncoding("UTF-8");

            ByteArrayInputStream byteStream = new ByteArrayInputStream(
                    requestBytes);
            BufferedInputStream bufStream = new BufferedInputStream(
                    byteStream);
            ServletOutputStream responseOutputStream = response
                    .getOutputStream();
            int data = bufStream.read();
            while (data != -1) {
                responseOutputStream.write(data);
                data = bufStream.read();
            }

            bufStream.close();
            responseOutputStream.close();


        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(" Exception is:" + e);
        }
    %>
</body>
</html>
4

1 に答える 1

3

主に間違っているのは、PDF出力の周りにHTMLを出力していることです。最後の改行なしで開始<%および終了するようにしてください。ここで機能する%>場合でも、それは良いスタイル です。response.reset()

さらにcontent.getBytes("Cp1252")(Windows Latin-1、ISO-8859-1 の拡張機能)。それ以外の場合、プラットフォームのエンコーディングはデフォルトです。

Contentそして、pdf(ファイル名)ではなく文字列を出力しているようです。

File file = request.getServletContext().getRealPath("/pdfsdir/" + filename);
FileInputStream byteStream = new FileInputStream(file);

PDF はバイナリであるため、setCharacterEncoding は必要ありません。ただし、ファイルの場合は Content-Length ヘッダーを設定できます。

パーソナライズされたデータを入力するには、さらに多くのデータが必要になります。


早い段階で次のことを行います。

        File file = request.getServletContext().getRealPath("/pdfsdir/" + filename);
        if (!file.canRead()) {
            // Log this with filename...
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        long fileLength = file.length();
        if (fileLength > Integer.MAX_VALUE) { // Too large
            // Log this with filename...
            response.sendError(HttpServletResponse.SC_CONFLICT);
            return;
        }
        int length = (int) fileLength;

後:

        response.setHeader("Content-disposition",
                "attachment; filename=" + filename);

行う

        response.setContentLength(length);

        FileInputStream byteStream = new FileInputStream(file);
        BufferedInputStream bufStream = new BufferedInputStream(
                byteStream);
        ServletOutputStream responseOutputStream = response
                .getOutputStream();
        final int BLOCK_SIZE = Math.min(16*1024, length);
        byte[] data = new byte[BLOCK_SIZE];
        while (length > 0) {
            int nread = bufStream.read(data, 0, Math.max(length, block.length));
            if (nread <= 0) {
                // Something fishy happened, upload of other smaller version.
                break;
            }
            length -= nread;
            responseOutputStream.write(data, 0, nread);
        }
        bufStream.close();
于 2013-01-30T18:44:21.373 に答える