动态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();    }}
 
 
时间: 2024-10-13 01:16:11

动态jsp页面转PDF输出到页面的相关文章

JSP页面导出PDF格式文件

JSP页面导出PDF格式文件基本在前端页面可以全部完成 <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script&

ASP.NET C#根据HTML页面导出PDF

在启明星采购系统里,新增了导出PDF功能.整个功能使用了第三方软件 wkhtmltopdf(下载) 官网 https://wkhtmltopdf.org/ 提供有更多版本下载 他可以把HTML页面转换为PDF,该软件简直是incredible-不可思议了,功能太强大了. 因为,我有一个HTML,引用了很多CSS,而页面基本上都是JS动态生成的,一直担心wkhtmltopdf生成的PDF会是一个空白 没相当,转换后,那些CSS和JS没有“失真”. 下面是利用C#将HTML生成PDF的代码: str

怎么提取PDF页面,PDF页面提取的操作步骤

怎么提取PDF页面呢?用过PDF文件的都知道PDF文件是一种比较难修改编辑的文件,想提取PDF页面这样的操作也只能使用专业的PDF编辑器来进行操作了,其实使用PDF编辑器来进行PDF页面提取的操作还是比较简单的.下面我们就一起来看一下怎么操作的吧.使用软件:迅捷PDF编辑器具体操作方法如下:1:首先将迅捷PDF编辑器安装到自己的电脑中,打开PDF编辑器,将需要提取页面的PDF文件添加到软件中.2:在软件界面找到文档,点击文档,在文档的下面会出现一个下拉框,在下拉框中找到提取页面,点击提取页面进入

解决JavaScript的属性innerHTML不能在页面交互时输出的问题(转载)

注:问题:JavaScript的innerHTML不能在页面交互时输出(即人机实时交互数据不能通过javascript的innerHTML属性输出) 解决方案:自建一个函数:set_innerHTML(obj_id, html, time). 有了这个方法,原来这样写:     document.getElementById("sch_nameArea").innerHTML= text 的地方就可以写成这样: set_innerHTML('sch_nameArea',text); s

关于界面的按钮的显隐 还有jsp页面数据的传递 把页面的标签变成只读

//界面按钮的显示隐藏 界面input的锁定    function change(){       document.getElementById('first1').style.display="inline";       document.getElementById('first2').style.display="inline";       document.getElementById('first3').style.display="in

PHP curl获取页面内容,不直接输出到页面,CURLOPT_RETURNTRANSFER参数设置

使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出.这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true. 1.curl获取页面内容, 直接输出例子: <?php $url = 'http://52php.cnblogs.com'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPE

【Lua】LWT遍历指定目录并输出到页面中

首先用lua遍历目录: 1 function getDirs(path) 2 local s = {} 3 function attrdir(p) 4 for file in lfs.dir(p) do 5 if file ~= "." and file ~= ".." then 6 local f = p .. file 7 local attr = lfs.attributes (f) 8 if attr.mode == "directory"

Struts2将图片输出到页面

在做CRUD的过程中,添加页面是个表单,表单里面有一项是上传头像文件.这样表单提交后,头像文件上传了. 但这个文件存的地址是本地硬盘的一个文件夹.在编辑页面要做这个头像的回显的话,就需要我们去本地文件读到这张图片, 然后将这张图片输出到页面. 笔者很久都没写过怎么把图片输出到页面了,在网上看了点资料,感觉不够清晰.于是决定自己做下笔记,方便后续查阅. 一.思路 既然是将图片回显,那么页面上图片的src属性肯定就是一个http请求,后台处理这个请求是输出一张图片到浏览器 (1) 编辑页面的使用 <

JavaScript-2.2 document.write 输出到页面的内容

<html> <head> <meta http-equiv="content-type" content="text/html;charset=GB2312"/> <title> 2-4 使用document.write经内容输出到页面 </title> <!--脚本部分--> <script type="text/javascript"> document.w