我试图在浏览器上显示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();
}
}
答案 0 :(得分:1)
我找到了解决方案。由于jsp页面的顶部,我将页面内容类型从"text/html; charset=UTF-8"
更改为"application/pdf; charset=UTF-8"