原理是通过freemarker插入数据到html模版里面,html你就叫前端帮你写好,他不写你就告诉你主管让他叫他写,你只管往预留的位置插入数据就行,然后通过itextpdf会将准备好html文件转成PDF。
com.itextpdf html2pdf 4.0.3 org.freemarker freemarker 2.3.30
WhiteCoat Holdings Pte Ltd.
Clinic Licence No.: 18M0119/01/182
201 Henderson Road #05-11/12
Apex @ Henderson
Singapore 159545
GST Reg. No: 201610235E
T: +65 6909 6909
F: +65 6909 6909
E: contactus@whitecoat.com.sg
whitecoat.com.sgName:
${data.name!}
NRIC/FIN/Passport No:
${data.idNo!}Invoice No.:
${data.invoiceNo!}
Invoice Date:
${data.invoiceDateStr!}
This is a computer generated invoice. No signature is required.
S/N Description Amount 1 Medication
<#list data.medicationList as item> ${item.productName!}
#list>
SubtotalQuantity
<#list data.medicationList as item> ${item.quantity!}
#list>
Subtotal
<#list data.medicationList as item> $${item.amount!}
#list>
${data.subtotal!}2 Administrative charges $${data.adminCharge!} Subtotal(Excluding GST) $${data.subtotalExcludingGST!} GST(${data.tax!}%) $${data.GST!} Total(Including GST) $${data.totalIncludingGST!} Bank remittance details for payment by Bank Telegraphic
Transfer in Singapore Dollars to:
Name of Bank: United Overseas Bank Ltd. Holland Branch
Account Name: Whitecoat Holdings Pte Ltd.
Account No: 341-308-316-6
Bank Code: 7375
Branch Code: 020
Bank Swift Code: UOVBSGSG3、下载代码
@ApiOperation(value = "下载pdf") @GetMapping("downloadPDF/staffPurchase") public ResponseResult download(String id, HttpServletResponse response) throws Exception { StaffPurchasePDFVo data = staffPurchaseMapper.getStaffPurchasePDFData(id); HashMapmapData = Maps.newHashMap(); mapData.put("data", data); long timeMillis = System.currentTimeMillis(); String templateContent = HtmlUtils.getTemplateContent("Staff_Purchase_Receipt.ftl", mapData); HtmlUtils.html2Pdf(response, templateContent, timeMillis + ""); return ResponseResult.success(); } 4、htmlutils代码
import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.layout.font.FontProvider; import freemarker.template.Configuration; import freemarker.template.Template; import lombok.extern.slf4j.Slf4j; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.Map; import java.util.Objects; @Slf4j public class HtmlUtils { /** * @return * @throws Exception */ public static String getTemplateDirectory() { ClassLoader classLoader = HtmlUtils.class.getClassLoader(); URL resource = classLoader.getResource("templates"); try { return Objects.requireNonNull(resource).toURI().getPath(); } catch (URISyntaxException e) { log.error("获取模板文件夹失败,{}", e); } return null; } /** * 获取模板内容 * * @param templateName 模板文件名 * @param paramMap 模板参数 * @return * @throws Exception */ public static String getTemplateContent(String templateName, MapparamMap) throws Exception { Configuration config = ApplicationContextUtil.getBean(FreeMarkerConfigurer.class).getConfiguration(); config.setDefaultEncoding("UTF-8"); Template template = config.getTemplate(templateName, "UTF-8"); return FreeMarkerTemplateUtils.processTemplateIntoString(template, paramMap); } /** * HTML 转 PDF * * @param content html内容 * @param outPath 输出pdf路径 * @return 是否创建成功 */ public static boolean html2Pdf(String content, String outPath) { try { ConverterProperties converterProperties = new ConverterProperties(); converterProperties.setCharset("UTF-8"); FontProvider fontProvider = new FontProvider(); fontProvider.addSystemFonts(); converterProperties.setFontProvider(fontProvider); HtmlConverter.convertToPdf(content, new FileOutputStream(outPath), converterProperties); } catch (Exception e) { log.error("生成模板内容失败,{}", e); return false; } return true; } /** * HTML 转 PDF * * @param content html内容 * @return PDF字节数组 */ public static void html2Pdf(HttpServletResponse response, String content,String filename) throws IOException { response.setHeader("Content-Type", "application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition", "attachment;filename="+filename+".pdf"); try (ServletOutputStream outputStream = response.getOutputStream()) { ConverterProperties converterProperties = new ConverterProperties(); converterProperties.setCharset("UTF-8"); FontProvider fontProvider = new FontProvider(); fontProvider.addSystemFonts(); converterProperties.setFontProvider(fontProvider); HtmlConverter.convertToPdf(content, outputStream, converterProperties); } catch (Exception e) { log.error("生成 PDF 失败,{}", e); } } } ApplicationContextUtil代码、
import org.springframework.beans.BeansException; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Configuration; @Configuration @AutoConfigureOrder(-1) public class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; public static Object getBeanByName(String beanName) { if (applicationContext == null) { return null; } return applicationContext.getBean(beanName); } public staticT getBean(Class type) { return applicationContext.getBean(type); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextUtil.applicationContext = applicationContext; } } 5、freemarker的基本语法
https://developer.aliyun.com/article/9426066、注意
如果css写了具体的大小比如width: 21cm;,那么下载出来的pdf会因为超出边界被截取,别写。
上一篇:【PGSQL】date