今天工作中遇到一个PDF分页未封口的问题如图:
查阅了很多资料没有找到解决办法,博友有什么好的建议想法,希望留言感激不尽。
项目信息:
PDF是用ftl模板生成的,把后台查询的数据返回到ftl文件中,把数据填充到相应的位置,导出生成PDF文件。
ftl文件的部分代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style mce_bogus="1" type="text/css">
.txt{
border-bottom:#666 1px solid;
font-size:18px;
width:50px;
text-align:center;
}
td{font-size:15px;}
.table-bordered {
border: 1px solid #ddd;
}
.table {
border-collapse: collapse !important;
}
.table td,
.table th {
background-color: #fff !important;
}
.table-bordered th,
.table-bordered td {
border: 1px solid #444444 !important;
}
.table-bordered table td {
border: 0px solid #ddd !important;
}
</style>
</head>
<body style="font-family: SimSun">
<div class="portlet col-md-8 col-md-offset-2">
<div align="center">
<h2>审批表</h2>
</div>
<label style="font-size:15px;"><b>名称:</b></label>
<label style="border:0px;font-size:15px;padding-left:0px;padding-bottom:10px;">${company!''}</label>
<table class="table table-bordered" width="100%" border="0" cellpadding="6" cellspacing="1" bgcolor="#000000" style="table-layout:fixed; word-break:break-strict;">
<tr>
<td width="10%" align="center" bgcolor="#FFFFFF" style="display:table-cell; vertical-align:middle;"><b>姓名</b></td>
<td width="15%" align="center" bgcolor="#FFFFFF" style="display:table-cell; vertical-align:middle;">${name!''}</td>
后台Java代码:
public void exportWorker(HttpServletResponse response)
{
try{
String pdfPath = "审批表.pdf";
Map<String,Object> variables = new HashMap<String,Object>();
//往map中添加需要的数据
response.reset();
response.setContentType( "application/pdf" );
response.setHeader("Content-disposition",DownUtil.fixContentDisposition(pdfPath));
String ftlStr = ftlGenerate("PDF.ftl", variables);
pdfGenerate(ftlStr, response.getOutputStream());
}catch(Exception ex){
ex.printStackTrace();
}
}
private String ftlGenerate(String template, Map<String,Object> variables) throws Exception{
Template tp = freeMarkerConfig.getConfiguration().getTemplate(
"report/reportList/"+template);
StringWriter stringWriter = new StringWriter();
BufferedWriter writer = new BufferedWriter(stringWriter);
tp.setOutputEncoding("UTF-8");
tp.process(variables, writer);
String htmlStr = stringWriter.toString();
writer.flush();
writer.close();
return htmlStr;
}
private void pdfGenerate(String htmlStr, OutputStream outPutPdfFilePath)
throws Exception {
//System.out.println(htmlStr);
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
EntityResolver er = new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId)
{
if(publicId.equals("-//W3C//DTD XHTML 1.0 Transitional//EN"))
{
String dtd_uri = getRequest().getSession().getServletContext()
.getRealPath("dtd/xhtml1-transitional.dtd");
return new InputSource(dtd_uri);
}
return null;
}
};
builder.setEntityResolver(er);
Document doc = builder.parse(new ByteArrayInputStream(htmlStr.getBytes("utf-8")));
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
//解决中文问题
ITextFontResolver fontResolver = renderer.getFontResolver();
String simsun = getRequest().getSession().getServletContext()
.getRealPath("FontsPDF/simsun.ttf");
if (simsun != null) {
fontResolver.addFont(simsun, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.getSharedContext().setFontResolver(fontResolver);
}
// 解决图片的相对路径问题
//renderer.getSharedContext().setBaseURL("file:" + basePath);
renderer.layout();
renderer.createPDF(outPutPdfFilePath);
outPutPdfFilePath.close();
}
}
这个问题还没有想到解决办法,希望大家指点。