网站版面设计方案,开源众包,网站建设的相关政策,个人seo优化SpringBootFreemark根据html模板导出PDF 1、引入maven2、两个工具类2.1 test.html模板2.2 test.html模板中的Freemark语法 3、controller导出pdf 1、引入maven 导出pdf的一些必要jar包 dependencygroupIdorg.projectlombok/groupIdartifactId… SpringBootFreemark根据html模板导出PDF 1、引入maven2、两个工具类2.1 test.html模板2.2 test.html模板中的Freemark语法 3、controller导出pdf 1、引入maven 导出pdf的一些必要jar包 dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdcom.itextpdf/groupIdartifactIditextpdf/artifactIdversion5.5.13/version/dependencydependencygroupIdcom.itextpdf.tool/groupIdartifactIdxmlworker/artifactIdversion5.5.13/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-freemarker/artifactIdversion2.3.6.RELEASE/version/dependencydependencygroupIdorg.freemarker/groupIdartifactIdfreemarker/artifactIdversion2.3.28/version/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.4.3/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-io/artifactIdversion1.3.2/version/dependency2、两个工具类
GeneratePDF.java 注意1工具类中的变量templates 表示在resource建个templates目录 test.html表示生成pdf的模板water.png表示pdf的水印这里我没加水印如果要加水印只用把下面我注释的三行代码放开就行。 注意2: test.html和water.png都放在templates目录
package cn.yx.zg.utils.pdf;import cn.hutool.core.io.resource.ClassPathResource;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPageEvent;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;import java.io.*;
import java.nio.charset.Charset;public class GeneratePDF {public final static String TEMPLATE_DIRECTORY_INSPECTION /templates/;public final static String TEMPLATE_NAME_INSPECTION test.html;public final static String TEMPLATE_WATER_INSPECTION water.png;/*** HTML 转 PDF** param content html内容* param outPath 输出pdf路径* return 是否创建成功*/public static boolean html2Pdf(String content, String outPath) throws FileNotFoundException {return html2Pdf(content, new FileOutputStream(outPath));}public static boolean html2Pdf(String content, OutputStream out) {try {Document document new Document(); //创建一个标准的A4纸文档PdfWriter writer PdfWriter.getInstance(document, out);//书写器与ducument文档关联document.open();//打开文档
// addWaterMark(writer);writer.setPageEvent(new PdfPageEvent() {Overridepublic void onOpenDocument(PdfWriter pdfWriter, Document document) {}Overridepublic void onStartPage(PdfWriter pdfWriter, Document document) {
// addWaterMark(pdfWriter);}Overridepublic void onEndPage(PdfWriter pdfWriter, Document document) {}Overridepublic void onCloseDocument(PdfWriter pdfWriter, Document document) {}Overridepublic void onParagraph(PdfWriter pdfWriter, Document document, float v) {}Overridepublic void onParagraphEnd(PdfWriter pdfWriter, Document document, float v) {}Overridepublic void onChapter(PdfWriter pdfWriter, Document document, float v, Paragraph paragraph) {}Overridepublic void onChapterEnd(PdfWriter pdfWriter, Document document, float v) {}Overridepublic void onSection(PdfWriter pdfWriter, Document document, float v, int i, Paragraph paragraph) {}Overridepublic void onSectionEnd(PdfWriter pdfWriter, Document document, float v) {}Overridepublic void onGenericTag(PdfWriter pdfWriter, Document document, Rectangle rectangle, String s) {}});XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(content.getBytes()), null, Charset.forName(UTF-8));document.close();//关闭文档} catch (Exception e) {System.out.println(生成模板内容失败 e.fillInStackTrace());return false;}return true;}/*** HTML 转 PDF** param content html内容* return PDF字节数组*/public static byte[] html2Pdf(String content) {ByteArrayOutputStream outputStream null;try {Document document new Document();outputStream new ByteArrayOutputStream();PdfWriter writer PdfWriter.getInstance(document, outputStream);document.open();XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(content.getBytes()), null, Charset.forName(UTF-8));document.close();} catch (Exception e) {System.out.println(------生成pdf失败-------);}return outputStream.toByteArray();}public static void addWaterMark(PdfWriter writer) {Image image null;try {ClassPathResource resource new ClassPathResource(TEMPLATE_DIRECTORY_INSPECTION TEMPLATE_WATER_INSPECTION);image Image.getInstance(resource.getUrl());// 加入水印PdfContentByte waterMar writer.getDirectContentUnder();// 开始设置水印waterMar.beginText();// 设置水印透明度PdfGState gs new PdfGState();// 设置笔触字体不透明度为0.4fgs.setStrokeOpacity(0.2f);gs.setFillOpacity(0.2f);// 设置等比缩放image.scalePercent(25);// 依照比例缩放// image.scaleAbsolute(200,100);//自定义大小image.setRotation(45f);// 设置透明度waterMar.setGState(gs);// 添加水印图片
// waterMar.addImage(image);image.setAbsolutePosition(110f, 130f);//结束设置waterMar.endText();waterMar.stroke();try {waterMar.addImage(image);} catch (DocumentException e) {e.printStackTrace();} finally {waterMar null;gs null;}} catch (BadElementException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
GetHtmlContent.java
package cn.yx.zg.utils.pdf;import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;public class GetHtmlContent {/*** 获取模板内容** param templateDirectory 模板文件夹* param templateName 模板文件名* param paramMap 模板参数* return* throws Exception*/public static String getTemplateContent(String templateDirectory, String templateName, MapString, Object paramMap) throws Exception {Configuration configuration new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);//不兼容配置try {configuration.setTemplateLoader(new ClassTemplateLoader(GetHtmlContent.class, templateDirectory));
// configuration.setDirectoryForTemplateLoading(new File(templateDirectory));//加载模板} catch (Exception e) {e.printStackTrace();}Writer out new StringWriter();Template template configuration.getTemplate(templateName, UTF-8);//缓存template.process(paramMap, out);out.flush();out.close();return out.toString();}}
2.1 test.html模板
!DOCTYPE html
html langen
headmeta charsetUTF-8/title测试表单/titlestylebody {font-family: SimSun;}.f-s-1 {font-size: 12px;}.table-main {width: 100%;border-collapse: collapse;border-right: 1px solid rgba(0, 0, 0, 0.7);border-bottom: 1px solid rgba(0, 0, 0, 0.7);margin-bottom: 30px;}.table-main td {border-left: 1px solid rgba(0, 0, 0, 0.7);border-top: 1px solid rgba(0, 0, 0, 0.7);padding: 4px;}.th1 {font-weight: bold;background-color: #d7d7d7;}.th2 {background-color: #f1f1f1;}.text-center{text-align: center;}/style
/head
bodyh5 stylemargin-top: 30px学生列表/h5
table classtable-main f-s-1theadtrtd classth1 stylewidth: 28%姓名/tdtd classth1 text-center stylewidth: 12%性别/tdtd classth1 text-center stylewidth: 12%年龄/tdtd classth1 text-center stylewidth: 12%地址/td/tr/theadtbody#list resultItems as itemtrtd classtext-center${item.name}/tdtd classtext-center${item.sex}/tdtd classtext-center${item.age}/tdtd classtext-center${item.address}/td/tr/#list/tbody
/table/body
/html
2.2 test.html模板中的Freemark语法 1、 #list resultItems as item 表示遍历后台返回的resultItems 2、下面判断age字段是否为空。
#if age?? 存在#else 不存在
/#if#--判断数据是否存在存在则则遍历--
#if resultItems??#list resultItems as item${item}/#list
/#if3、controller导出pdf 注意: 代码中设置的变量要和html模板中的变量一致。
package cn.yx.zg.controller;import cn.yx.zg.utils.pdf.GeneratePDF;
import cn.yx.zg.utils.pdf.GetHtmlContent;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;RestController
public class TestExportPdfController {RequestMapping(/test)public void test(HttpServletResponse response) throws Exception {MapString, Object paramMap new HashMap();ListMapString, Object resultItems new ArrayList();for (int i 0; i 100; i) {MapString, Object items new HashMap();items.put(name, 张三 i);items.put(age, 18 i);items.put(sex, 男 i);items.put(address, 河南 i);resultItems.add(items);}paramMap.put(resultItems, resultItems);String destFileName 测试表单.pdf;destFileName new String(destFileName.getBytes(), StandardCharsets.ISO_8859_1);OutputStream out;//设置响应response.setHeader(Content-Disposition, attachment;filename destFileName);response.setContentType(application/pdf);out response.getOutputStream();String templateContent GetHtmlContent.getTemplateContent(GeneratePDF.TEMPLATE_DIRECTORY_INSPECTION, GeneratePDF.TEMPLATE_NAME_INSPECTION, paramMap);GeneratePDF.html2Pdf(templateContent, out);out.flush();}
}