java jsp动态生成 pdf_动态jsp页面转PDF输出到页面的实现方法

本文介绍了如何使用Java和iText库将jsp页面动态转换为PDF,并直接输出到浏览器。通过servletutils类转发请求到jsp,然后使用pdfutils类将解析后的HTML内容转换为PDF。整个过程涉及了字节流处理、响应头设置以及XMLWorker进行HTML到PDF的转换。
摘要由CSDN通过智能技术生成

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

41cab1410f6f43d28315ddff004885d4.png

需要利用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输出到页面的实现方法,希望对大家有所帮助

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值