gpt4 book ai didi

java - dofilter 没有给出 pdf 作为响应输出

转载 作者:行者123 更新时间:2023-12-01 11:06:13 25 4
gpt4 key购买 nike

我正在尝试在浏览器上显示 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();
}
}

最佳答案

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

关于java - dofilter 没有给出 pdf 作为响应输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com