dofilter在回复时没有给出pdf作为输出

时间:2015-10-02 20:16:13

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

我试图在浏览器上显示pdf作为输出。这是我在dofilter类servlet中的代码。我已经得到一个字节数组,在这一行上正确呈现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();
    }
}

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。由于jsp页面的顶部,我将页面内容类型从"text/html; charset=UTF-8"更改为"application/pdf; charset=UTF-8"