Stringhtml=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");
OutputStreamout=response.getOutputStream();
out.write(pdf);
out.flush();
publicclassServletUtils{
/**
*此forward方法执行完毕之后不会输出内容到浏览器,而是把输出到字节流,最后以字符串的形式返回
*@paramrequest
*@paramresponse
*@paramsrc
*@return
*/
publicstaticStringforward(HttpServletRequestrequest,HttpServletResponseresponse,Stringsrc){
try{
/*↓↓↓↓↓重新构造response,修改response中的输出流对象,使其输出到字节数组↓↓↓↓↓*/
finalByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();
finalServletOutputStreamservletOuputStream=newServletOutputStream(){
@Override
publicvoidwrite(intb)throwsIOException{
byteArrayOutputStream.write(b);
}
@Override
publicbooleanisReady(){
returnfalse;
}
@Override
publicvoidsetWriteListener(WriteListenerwriteListener){
}
};
finalPrintWriterprintWriter=newPrintWriter(newOutputStreamWriter(byteArrayOutputStream,"UTF-8"));
response=newHttpServletResponseWrapper(response){
publicServletOutputStreamgetOutputStream(){
returnservletOuputStream;
}
publicPrintWritergetWriter(){
returnprintWriter;
}
};
/*↑↑↑↑↑↑重新构造response,修改response中的输出流对象,使其输出到字节数组↑↑↑↑↑↑*/
//执行forward操作
request.getRequestDispatcher(src).forward(request,response);
//把字节流中的内容太转为字符串
returnnewString(byteArrayOutputStream.toByteArray(),"utf-8");
}
catch(Exceptione){
thrownewRuntimeException(e);
}
}
}
importcom.itextpdf.text.*;
importcom.itextpdf.text.pdf.PdfWriter;
importcom.itextpdf.tool.xml.Pipeline;
importcom.itextpdf.tool.xml.XMLWorker;
importcom.itextpdf.tool.xml.XMLWorkerFontProvider;
importcom.itextpdf.tool.xml.XMLWorkerHelper;
importcom.itextpdf.tool.xml.exceptions.CssResolverException;
importcom.itextpdf.tool.xml.html.CssAppliers;
importcom.itextpdf.tool.xml.html.CssAppliersImpl;
importcom.itextpdf.tool.xml.html.Tags;
importcom.itextpdf.tool.xml.parser.XMLParser;
importcom.itextpdf.tool.xml.pipeline.css.CSSResolver;
importcom.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
importcom.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
importcom.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
importcom.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
importjava.io.*;
/**
*pdf工具类
*/
publicclassPDFUtils{
/**
*把html转换成pdf,以字节数组的形式返回pdf文件
*@paramhtml
*@returnpdf字节数组
*@throwsIOException
*@throwsDocumentException
*@throwsCssResolverException
*/
publicstaticbyte[]html2pdf(Stringhtml)throwsIOException,DocumentException,CssResolverException{
Documentdocument=newDocument(PageSize.A4);
ByteArrayOutputStreamos=newByteArrayOutputStream();
PdfWriterwriter=PdfWriter.getInstance(document,os);
document.open();
XMLWorkerFontProviderfontProvider=newXMLWorkerFontProvider(){
@Override
publicFontgetFont(Stringfontname,Stringencoding,floatsize,intstyle){
returnsuper.getFont(fontname==null?"宋体":fontname,encoding,size,style);
}
};
fontProvider.addFontSubstitute("lowagie","garamond");
fontProvider.setUseUnicode(true);
//使用我们的字体提供器,并将其设置为unicode字体样式
CssApplierscssAppliers=newCssAppliersImpl(fontProvider);
HtmlPipelineContexthtmlContext=newHtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
CSSResolvercssResolver=XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
Pipeline<?>pipeline=newCssResolverPipeline(cssResolver,newHtmlPipeline(htmlContext,newPdfWriterPipeline(document,writer)));
XMLWorkerworker=newXMLWorker(pipeline,true);
XMLParserp=newXMLParser(worker);
p.parse(newInputStreamReader(newByteArrayInputStream(html.getBytes("gbk"))));
document.close();
returnos.toByteArray();
}
}
|