如果帮到你,记得点个赞~
第一步
引入pom.xml依赖。
<!-- freemarker -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- html转pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
第二步
在【resources】目录下,创建一个文件夹【templates】并在该目录下创建一个ftl文件。
demo.ftl文件内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>药品列表</title>
</head>
<body>
<img src="https://pics4.baidu.com/feed/9345d688d43f8794e19e8a2d870431fe1bd53a7d.jpeg?token=e40d091ca38c5271bc544485ef51c643"/>
abcdefg
<table>
<tr>
<td style="color:red">药品名称</td>
<td>类型</td>
</tr>
<tr>
<td>${name}</td>
<td>${type}</td>
</tr>
</table>
</body>
</html>
第三步
写一个PDF转换工具类。
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.Charset;
/**
* Html转换Pdf
*
* @author :Mall
* @date :Created in 2022-04-25
*/
public class HtmlConvertPdfHelper {
Configuration configuration;
/**
* 初始化
*/
public HtmlConvertPdfHelper() {
if (configuration == null) {
configuration = BeanHelper.getBean(Configuration.class);
}
}
/**
* freemarker转PDF
*
* @param fileName ftl文件名称,需要在resources/templates目录下
* @return
* @throws IOException
*/
public byte[] htmlConvertPDF(String fileName, Object map) throws IOException, TemplateException, DocumentException {
String htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(fileName), map);
return htmlConvertPDF(htmlText);
}
/**
* 根据HTML内容转Image
*
* @param htmText HTML文本字符串
*/
public byte[] htmlConvertPDF(String htmText) throws DocumentException, IOException {
//最终返回的byte流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//第一步,创建一个 iTextSharp.text.Document对象的实例:
Document document = new Document();
//第二步,为该Document创建一个Writer实例:
PdfWriter writer = PdfWriter.getInstance(document, byteArrayOutputStream);
//第三步,打开当前Document
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(htmText.getBytes()), null, Charset.defaultCharset(), new AsianFontProvider());
document.close();
return byteArrayOutputStream.toByteArray();
}
}
/**
* 用于中文显示的Provider
*/
class AsianFontProvider extends XMLWorkerFontProvider {
@Override
public Font getFont(final String fontname, String encoding, float size, int style) {
try {
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
return new Font(bfChinese, size, style);
} catch (Exception e) {
}
return super.getFont(fontname, encoding, size, style);
}
}
第四步
写测试类测试功能是否可用。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
@Slf4j
public class Test {
@org.junit.Test
public void aaa() throws IOException, TemplateException, com.itextpdf.text.DocumentException {
Map<java.lang.String, java.lang.String> map = new HashMap<>();
map.put("name", "鹤顶红");
map.put("type", "毒药");
byte[] bytes = new HtmlConvertPdfHelper().htmlConvertPDF("demo.ftl", map);
System.out.println(bytes);
OutputStream os = new FileOutputStream("G:/text.pdf");
os.write(bytes, 0, bytes.length);
os.flush();
os.close();
}
}
如果帮到你,记得点个赞~