【问题标题】:PDF file returns as unsupported format which is created and downloaded using Java( Java EE)PDF 文件返回为使用 Java(Java EE)创建和下载的不受支持的格式
【发布时间】:2013-01-14 16:44:24
【问题描述】:

当我执行这个 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>

【问题讨论】:

    标签: java jakarta-ee pdf-generation itext


    【解决方案1】:

    主要是问题所在,您也在 PDF 输出周围输出 HTML。确保以&lt;% 开头并以%&gt; 结尾,没有最后的换行符;这是很好的风格,即使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();
    

    【讨论】:

    • +1 另外:必须确保不要在标签之间引入任何空白。 PDF 是一种二进制格式,其中字节位置很重要。如果您的 JSP 脚本中有多余的空白,则会损坏所有字节指针。
    • 如果 pdf 位于顶级网络目录 pdfsdir 中,则上面的代码将替换旧的 byteStream 创建。然后它应该工作。我将添加更快的下载,而不是逐字节。
    • 感谢您的回答。但我遇到了同样的问题..即无法打开 pdf。如果我将文件名更改为 .doc 扩展名,我将获得 doc 文件并能够查看所需的内容..let这是我的全部代码
    • 啊哈!也许您想使用数据库中的信息生成 PDF 文件? 那个不是写成20行的。搜索(例如)itext 示例; itext 是一个 java PDF 库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2018-08-18
    相关资源
    最近更新 更多