使用java servlet在浏览器中显示Pdf

2023-12-30

我的应用程序中有 pdf 文件。我需要在浏览器中显示pdf。我正在将文件作为 fileInputStream 读取,我需要在我的应用程序中的浏览器中显示 pdf。但我没有 pdf 路径,我有文件流。

请给我一些建议和例子


我使用ajax来显示pdf,我使用call_method() javascript ajax请求方法来调用showPdf操作,在showpdf操作中只是将pdf文件转换为ByteArrayOutputStream并将结果写入输出流中。但它显示了下面提到的结果。

JSP 中的结果:

%PDF-1.4 %��� 1 endstream endobj 4 0 obj >>/MediaBox[0 0 595 842]>> endobj 1 0 obj endobj 3 0 obj endobj 5 0 obj endobj 6 0 obj endobj 外部参照 0 7 0000000000 65535 f 0000000389 00000 n 0000000015 00000 n 0000000477 00000 n 0000000232 00000 n 0000000540 00000 n 000 0000585 00000 n 预告片 ]/Info 6 0 R/Size 7>> startxref 707 %%EOF

请给一些建议。

JavaScript 阿贾克斯:

call_method(); <br/>
function call_method(){

    Ext.Ajax.request({
            waitMsg: 'Saving changes...',
            url:'test.action?method=showPdf',
            params : { },       
            failure:function(response,options){

            },
            success:function(response,options){
                $("#pdf_content").show();               
                $("#pdf_content").html(response.responseText);
                $("#pdf_content").show('slow');
            }
    });
}

Java方法:

public String showPdf() throws IOException {

    getResponse().setContentType("application/pdf");

    getResponse().setHeader("Content-disposition","inline; filename=automatic_start.pdf" );


    ByteArrayOutputStream baos = getByteArrayOutputStream();

    getResponse().setContentLength(baos.size());

    ServletOutputStream sos;

    sos = getResponse().getOutputStream();

    baos.writeTo(sos);

    sos.flush();

    return null;
}


private ByteArrayOutputStream getByteArrayOutputStream() throws IOException {

    String filePath = "/homefolder/";

    String folderPath=filePath+"1122/automatic_start.pdf";

    File file = new File(folderPath);

    FileInputStream fis = new FileInputStream(file);



    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[256];
     try {
            for (int readNum; (readNum = fis.read(buf)) != -1;) {
                bos.write(buf, 0, readNum); //no doubt here is 0
                //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
                System.out.println("read " + readNum + " bytes,");
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        }


    return bos;
}

你必须写下你的InputStream对你的回应OutputStream如下:

  • Your Content-Disposition必须是inline.
  • Your Content-Type必须是application/pdf.
  • Your Content-Length将是总数据的长度(以字节为单位)InputStream.

设置后,将输入流数据写入响应的输出流。

有这样的效果:

/* (non-Javadoc)
 * @see org.bfs.bayweb.util.renderer.ServletViewRenderer#render(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
 */
public void render(ServletRequest request, ServletResponse response) throws IOException {
    // TODO Auto-generated method stub
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        int inputStreamLength = 0;
        int length = 0;
        while ((length = getInputStream().read(buffer)) > 0) {
            inputStreamLength += length;
            baos.write(buffer, 0, length);
        }

        if (inputStreamLength > getContentLength()) {
            setContentLength(inputStreamLength);
        }

        if (response instanceof HttpServletResponse) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.reset();
            httpResponse.setHeader("Content-Type", getContentType());
            httpResponse.setHeader("Content-Length", String.valueOf(getContentLength()));
            httpResponse.setHeader("Content-Disposition", "\"" + getContentDisposition() + "\"" + ((getFileName() != null && !getFileName().isEmpty()) ? "; filename=\"" + getFileName() + "\"": ""));
        }

        response.getOutputStream().write(baos.toByteArray(), 0, (int)getContentLength());

        //finally
        response.getOutputStream().flush();

        //clear
        baos = null;
    } finally {
        // TODO Auto-generated catch block
        close(response.getOutputStream());
        close(getInputStream());
    }
}

private void close(Closeable resource) throws IOException {
    if (resource != null) {
        resource.close();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用java servlet在浏览器中显示Pdf 的相关文章

随机推荐

  • 我们如何下载 chromedriver 117?

    我的 Chrome 浏览器已更新至版本 117 现在我需要下载 chromedriver 117 来运行自动化脚本 任何人都可以为此提供解决方案吗 如果我们使用 Chrome 版本 115 或更高版本 我们需要检查Chrome 测试可用性仪
  • 我的密码curl有时会失败?

    ch curl init curl setopt ch CURLOPT URL PathUrl curl setopt ch CURLOPT USERPWD someuser somepass curl setopt ch CURLOPT
  • 如何在R中返回每个组的nrow?

    这可能是一个非常基本的问题 我有一个简单的数据框 每个课程都有不同的观察结果 我希望 R 返回每个课程的行数 在我的例子中等于观察数 例如 DF lt structure list age c 36 21 20 32 24 course c
  • 解构 Clojure 函数的参数,同时保留原始值。

    您可以解构函数参数但仍然可以使用原始参数吗 我现在做的方法就是使用letform 在函数体内 但我想知道是否有更简洁的方法来做到这一点 似乎 as也适用于函数 with vector defn test x y as v x x y y v
  • facebook sdk php 示例不起作用

    我正在尝试为网站开发 facebook 登录 我尝试了给出的示例php facebook sdk即使在登录 Facebook 后 user variable即使在 Facebook 登录后仍然为 0 它没有显示注销 url 调用 faceb
  • 来自 Symfony Command 的 Swift 邮件

    我尝试使用 Symfony 命令从命令行发送 Swift 邮件 虽然我得到以下异常 Fatal error Call to undefined method Symfony Bundle TwigBundle Debug TimedTwig
  • SendMessage - 发送区分大小写的按键

    我正在尝试使用 WinAPI 创建一个工作函数 以便在其他应用程序 例如记事本 中逐键写入给定的文本SendMessage功能 我有这样的代码 SendMessage handle WM CHAR 0x41 0 SendMessage ha
  • React Native foreach 循环

    我正在 React Native 中开发一个小应用程序 我正在寻找类似 foreach 函数的东西 我只是找不到 foreach 循环 不在 StackOverflow 上 甚至不在docs https facebook github io
  • OAuth2 中 OTP/2FA 支持的推荐设计

    我正在尝试将 OTP 2FA 支持添加到 OAuth2 中 但是经过大量阅读RFC6749 https www rfc editor org rfc rfc6749 目前还不清楚如何在不违反规范的情况下干净地添加 OTP 2FA 虽然 OT
  • iPhone 的缓存/离线地图?

    我想在我的应用程序中使用地图 以便尽可能减少流量 完美的解决方案是缓存地图切片 我知道谷歌地图 许可证 是不可能的 我查看了 OpenStreetMaps 这似乎是一个很好的解决方案 下一个 SDK 我发现的唯一一个来自 CloudMade
  • 使用 Rails 中的模型数据填充选择

    我觉得有必要为问这样一个简单的问题而道歉 但我对 Rails 指南越来越感到沮丧 我确信他们回答了我的问题 但他们没有提供足够的背景让我真正理解如何apply他们给我什么 谷歌也没有多大帮助 尽管我可能只是搜索了错误的术语 短语 鉴于该免责
  • 可以 Boost Program_options 分隔逗号分隔的参数值

    如果我的命令行是 gt prog mylist a b c Boost 的program options 可以设置为查看三个不同的参数值吗mylist争论 我已将program options配置为 namespace po boost p
  • 显示来自用户输入的部分数组值匹配

    我有一个带有一堆值的 jQuery 数组 我希望用户能够在输入中键入内容 并与屏幕上显示的数组中的任何内容进行部分匹配 到目前为止 我已经知道何时有完整的匹配 并且我可以将其打印到页面上 但我不确定如何进行部分匹配 这是我到目前为止所拥有的
  • 无法启动服务并出现 net.tcp 绑定错误 10049

    我在使用 net tcp 端点启动 WCF 服务时遇到问题 我收到 10049 错误 My app config
  • 从单独的控制器 angularjs 中检索成功后的数据

    我正在编写一个简单的服务 用于上传文件并将其发布到 Spring 控制器 控制器操作这些数据并以 JSON 形式返回多个对象 我正在使用以下 Angular 服务 myApp service fileUpload http function
  • SQL中如何计算运行总计

    我的数据集采用给定的格式 这是每月级别的数据以及每个月的工资 我需要计算每个月末的累计工资 我怎样才能做到这一点 Account Month Salary Running Total a 1 586 586 a 2 928 1514 a 3
  • HTML 时间标签 - 正确的日期格式

    我想使用正确的格式和标准将时间标签放入我的 html 文档中 这是正确的方法吗
  • 通过 php 函数从 WordPress 短代码中删除空

    标签

    寻找 php 函数 非 jQuery 或 wpaautop 修改 方法来删除 p p 从 WordPress 内部 我尝试了这个 但它不起作用 function cleanup shortcode fix content array arr
  • 在 widget 树中使用 const 会提高性能吗?

    创建widget树时 会插入const在静态小部件提高性能之前 ie child const Text This is some text vs child Text This is some text 我知道 使用 Dart 2 cons
  • 使用java servlet在浏览器中显示Pdf

    我的应用程序中有 pdf 文件 我需要在浏览器中显示pdf 我正在将文件作为 fileInputStream 读取 我需要在我的应用程序中的浏览器中显示 pdf 但我没有 pdf 路径 我有文件流 请给我一些建议和例子 我使用ajax来显示