struts1中设置
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=WebReport.pdf");
请求发送后为什么不能弹出下载窗口?
在Servlet中都可以:
Servlet源代码:
package com.test;import java.io.IOException;
import java.io.OutputStream;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;import com.lowagie.text.pdf.BaseFont;public class Html2PdfServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//pageContext.getServletContext().getRealPath("/")
ServletContext sc = request.getSession().getServletContext();
String path = sc.getRealPath(""); //值为D:\apache-tomcat-6.0.26\webapps\createpdf
System.out.println("原path: " + path);
//把路径中的反斜杠转成正斜杠
path = path.replaceAll("\\\\", "/"); //值为D:/apache-tomcat-6.0.26/webapps/createpdf
System.out.println(path);

String path2 = sc.getRealPath("/");
System.out.println("path2: " + path2);

System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=WebReport.pdf");
//response.setHeader("Content-Disposition", "inline; filename=WebReport.pdf");
        
StringBuffer html = new StringBuffer();
//组装成符合W3C标准的html文件,否则不能正确解析
html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">")
.append("<head>")
.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")
.append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>")
.append("<style type=\"text/css\">img {width: 700px;}</style>")
.append("</head>")
.append("<body>");

html.append("<center><h1>统计报表</h1></center>");
html.append("<center>");
html.append("<img src=\"images/chart.jpg\"/>");
html.append("</center>");

html.append("</body></html>");
        
        // parse our up into an xml Document
        try {
         ITextRenderer renderer = new ITextRenderer();
         /**
          * 引入了新的jar包,不用再导入字体了
         ITextFontResolver fontResolver = renderer.getFontResolver();
         fontResolver.addFont("C:/Windows/fonts/simsun.ttc",
         BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
         */
            renderer.setDocumentFromString(html.toString());
            // 解决图片的相对路径问题
     //renderer.getSharedContext().setBaseURL("file:/C:/Documents and Settings/dashan.yin/workspace/createpdf/WebRoot/images");
            //renderer.getSharedContext().setBaseURL("file:/D:/apache-tomcat-6.0.26/webapps/createpdf/images");
     renderer.getSharedContext().setBaseURL("file:/" + path + "/images");
     renderer.layout();
            OutputStream os = response.getOutputStream();
            renderer.createPDF(os);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        } } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}}

解决方案 »

  1.   

    response.setContentType("application/octet-stream");
    修改成这个看看,如果是response.setContentType("application/pdf"),浏览器有安装pdf阅读软件且有关联情况下会直接打开的
      

  2.   

    有相应的pdf阅读器,换成你说的那个也不行
    现在情况是:
    用servlet可以直接打开,用struts就不行了,struts是怎么response的?
      

  3.   

    处理请示的Action:
    public void responseExportPDF(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {

    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition", "attachment; filename=WebReport.pdf");        
    StringBuffer html = new StringBuffer();
    //组装成符合W3C标准的html文件,否则不能正确解析
    html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
    html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">")
    .append("<head>")
    .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")
    .append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>")
    .append("<style type=\"text/css\">img {width: 700px;}</style>")
    .append("</head>")
    .append("<body>");

    html.append("<center><h1>统计报表</h1></center>");
    html.append("<center>");
    html.append("<img src=\"images/chart.jpg\"/>");
    html.append("</center>");

    html.append("</body></html>");
            
            // parse our up into an xml Document
            try {
             ITextRenderer renderer = new ITextRenderer();
             renderer.setDocumentFromString(html.toString());
                    renderer.layout();
                    OutputStream os = response.getOutputStream();
                    renderer.createPDF(os);
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            return ;
    }
      

  4.   

    我不想转向页面所以Action方法的返回值为void,怎么才能把response通过文件下载方式得到
      

  5.   

    response.setHeader("Content-Disposition", "attachment; filename=\"WebReport.pdf\"");
    改成这样试试。