• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    动态jsp页面转PDF输出到页面的实现方法

    最近工作中遇到不少问题。总结一下。这段代码主要功能是将一个生成JSP页面转发成PDF输出到页面

    需要利用ITEXT

    String html = ServletUtils.forward(request,response,"/WEB-INF/jsp/depot/print/jhd.jsp"); //转发请求到jsp,返回解析之后的内容而不是输出到浏览器
    //System.out.println(html);
    byte[] pdf = PDFUtils.html2pdf(html);
    response.setContentType("application/pdf");
    response.setHeader("Content-Length",String.valueOf(pdf.length));
    response.setHeader("Connection","keep-alive");
    response.setHeader("Accept-Ranges","none");
    response.setHeader("X-Frame-Options","DENY");
    OutputStream out = response.getOutputStream();
    out.write(pdf);
    out.flush();
    public class ServletUtils {
    /**
    * 此forward方法执行完毕之后不会输出内容到浏览器,而是把输出到字节流,最后以字符串的形式返回
    * @param request
    * @param response
    * @param src
    * @return
    */
    public static String forward(HttpServletRequest request, HttpServletResponse response, String src) {
    try{
    /* ↓↓↓↓↓重新构造response,修改response中的输出流对象,使其输出到字节数组↓↓↓↓↓ */
    final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    final ServletOutputStream servletOuputStream = new ServletOutputStream() {
    @Override
    public void write(int b) throws IOException {
    byteArrayOutputStream.write(b);
    }
    @Override
    public boolean isReady() {
    return false;
    }
    @Override
    public void setWriteListener(WriteListener writeListener) {
    }
    };
    final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, "UTF-8"));
    response = new HttpServletResponseWrapper(response) {
    public ServletOutputStream getOutputStream() {
    return servletOuputStream;
    }
    public PrintWriter getWriter() {
    return printWriter;
    }
    };
    /* ↑↑↑↑↑↑重新构造response,修改response中的输出流对象,使其输出到字节数组↑↑↑↑↑↑ */
    //执行forward操作
    request.getRequestDispatcher(src).forward(request,response);
    //把字节流中的内容太转为字符串
    return new String(byteArrayOutputStream.toByteArray(),"utf-8");
    }
    catch (Exception e){
    throw new RuntimeException(e);
    }
    }
    }
    import com.itextpdf.text.*;
    import com.itextpdf.text.pdf.PdfWriter;
    import com.itextpdf.tool.xml.Pipeline;
    import com.itextpdf.tool.xml.XMLWorker;
    import com.itextpdf.tool.xml.XMLWorkerFontProvider;
    import com.itextpdf.tool.xml.XMLWorkerHelper;
    import com.itextpdf.tool.xml.exceptions.CssResolverException;
    import com.itextpdf.tool.xml.html.CssAppliers;
    import com.itextpdf.tool.xml.html.CssAppliersImpl;
    import com.itextpdf.tool.xml.html.Tags;
    import com.itextpdf.tool.xml.parser.XMLParser;
    import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
    import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
    import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
    import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
    import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
    import java.io.*;
    /**
    * pdf工具类
    */
    public class PDFUtils {
    /**
    * 把html转换成pdf,以字节数组的形式返回pdf文件
    * @param html
    * @return pdf字节数组
    * @throws IOException
    * @throws DocumentException
    * @throws CssResolverException
    */
    public static byte[] html2pdf(String html) throws IOException, DocumentException,CssResolverException {
    Document document = new Document(PageSize.A4);
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    PdfWriter writer = PdfWriter.getInstance(document,os);
    document.open();
    XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(){
    @Override
    public Font getFont(String fontname, String encoding, float size, int style) {
    return super.getFont(fontname == null ? "宋体" : fontname, encoding, size, style);
    }
    };
    fontProvider.addFontSubstitute("lowagie", "garamond");
    fontProvider.setUseUnicode(true);
    //使用我们的字体提供器,并将其设置为unicode字体样式
    CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
    CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
    Pipeline?> pipeline = new CssResolverPipeline(cssResolver,new HtmlPipeline(htmlContext, new PdfWriterPipeline(document,writer)));
    XMLWorker worker = new XMLWorker(pipeline, true);
    XMLParser p = new XMLParser(worker);
    p.parse(new InputStreamReader(new ByteArrayInputStream(html.getBytes("gbk"))));
    document.close();
    return os.toByteArray();
    }
    }

    以上所述是小编给大家介绍的动态jsp页面转PDF输出到页面的实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    您可能感兴趣的文章:
    • Spring boot 跳转到jsp页面的实现方法
    • ajax 提交数据到后台jsp页面及页面跳转问题
    • jsp页面显示数据库的数据信息表
    • JSP页面跳转方法小结
    • bootstrap制作jsp页面(根据值让table显示选中)
    • 拦截JSP页面,校验是否已登录详解及实现代码
    • 在JSP页面中获取当前日期时间的方法
    • 详解直接访问WEB-INF目录下的JSP页面的方法
    上一篇:JavaScript实现链表插入排序和链表归并排序
    下一篇:JSP MySQL插入数据时出现中文乱码问题的解决方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    动态jsp页面转PDF输出到页面的实现方法 动态,jsp,页面,转,PDF,输出,