【问题标题】:dofilter not giving pdf as output on responsedofilter 没有给出 pdf 作为响应的输出
【发布时间】:2015-10-02 20:16:12
【问题描述】:

我正在尝试在浏览器上显示 pdf 作为输出。这是我在 servlet 的 dofilter 类中的代码。我已经得到一个字节数组,可以在这一行正确呈现 pdf --> byte[] pdfArray = pdfConverter.convertToDoc(bytes); 我确实看到 pdf 文件保存在 --> File someFile = new File("C:\\log\\java2.pdf"); 但它没有在 servletresponse 上输出,只显示混合字符。任何帮助表示赞赏。请查看dofilter 方法内部。 我有 pdfconverter 将整个站点作为字节数组并转换为 pdf。

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ItextFilter implements Filter{

    private static final Logger logger = LoggerFactory.getLogger(ItextFilter.class);

    private FilterConfig filterConfig = null;
    private String encoding;

       private static class ByteArrayServletStream extends ServletOutputStream{
            ByteArrayOutputStream baos;
            ByteArrayServletStream(ByteArrayOutputStream baos){
                this.baos = baos;
            }
            public void write(int param) throws IOException{
                baos.write(param);
            }
            @Override
            public boolean isReady() {
                // TODO Auto-generated method stub
                return true;
            }
            @Override
            public void setWriteListener(WriteListener paramWriteListener) {
                // TODO Auto-generated method stub

            }
        }

        private static class ByteArrayPrintWriter{
            private ByteArrayOutputStream baos = new ByteArrayOutputStream();
            private PrintWriter pw = new PrintWriter(baos);
            private ServletOutputStream sos = new ByteArrayServletStream(baos);
            public PrintWriter getWriter(){
                return pw;
            }
            public ServletOutputStream getStream(){
                return sos;
            }
            byte[] toByteArray(){
                return baos.toByteArray();
            }
        }

        public class CharResponseWrapper extends HttpServletResponseWrapper{
            private ByteArrayPrintWriter output;
            private boolean usingWriter;
            public CharResponseWrapper(HttpServletResponse response){
                super(response);
                usingWriter = false;
                output = new ByteArrayPrintWriter();
            }
            public byte[] getByteArray(){
                return output.toByteArray();
            }

            @Override
            public ServletOutputStream getOutputStream() throws IOException{
                // will error out, if in use
                if (usingWriter) {
                    super.getOutputStream();
                }
                usingWriter = true;
                return output.getStream();
            }

            @Override
            public PrintWriter getWriter() throws IOException{
                // will error out, if in use
                if (usingWriter) {
                    super.getWriter();
                }
                usingWriter = true;
                return output.getWriter();
            }
            public String toString(){
                return output.toString();
            }
        }

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
            this.encoding = filterConfig.getInitParameter("encoding");
        }

        public void destroy() {
            this.filterConfig = null;
        }

       protected String selectEncoding(ServletRequest request) {
            return (this.encoding);
        }



    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String encoding = selectEncoding(request);
        if (encoding != null)
            request.setCharacterEncoding(encoding);

        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        CharResponseWrapper wrappedResponse = new CharResponseWrapper((HttpServletResponse)response);

        logger.info("ITextFilter invoked...passing on to the chain");
        chain.doFilter(request, wrappedResponse);
        logger.info("Chain filter is complete...processing the respose now");
        logger.info("Response Content type from the chain is: " + wrappedResponse.getContentType());

        byte[] bytes = wrappedResponse.getByteArray();

        PdfConverter pdfConverter = new PdfConverter();
        byte[] pdfArray = pdfConverter.convertToDoc(bytes);

        httpServletResponse.setContentType("application/pdf; charset=UTF-8");
        httpServletResponse.setHeader("Content-disposition", "attachment; filename=\"report.pdf\"");
        httpServletResponse.addHeader("Cache-Control", "-1");
        httpServletResponse.setContentType("application/pdf");
        httpServletResponse.getOutputStream().write(pdfArray);
        httpServletResponse.getOutputStream().close();
    }
}

【问题讨论】:

    标签: java spring-mvc pdf itext servlet-filters


    【解决方案1】:

    我找到了解决方案。由于 jsp 页面的顶部,它被漱口(混合字符),我将页面 contentType 从 "text/html; charset=UTF-8" 更改为 "application/pdf; charset=UTF-8"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-18
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多