如果帮到你,记得点个赞~
第一步引入pom.xml依赖。
第二步org.springframework.boot spring-boot-starter-freemarker com.itextpdf itextpdf 5.5.11 com.itextpdf.tool xmlworker 5.5.11 com.itextpdf itext-asian 5.2.0
在【resources】目录下,创建一个文件夹【templates】并在该目录下创建一个ftl文件。
demo.ftl文件内容:
药品列表
abcdefg
| 药品名称 | 类型 |
| ${name} | ${type} |
写一个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;
public class HtmlConvertPdfHelper {
Configuration configuration;
public HtmlConvertPdfHelper() {
if (configuration == null) {
configuration = BeanHelper.getBean(Configuration.class);
}
}
public byte[] htmlConvertPDF(String fileName, Object map) throws IOException, TemplateException, DocumentException {
String htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(fileName), map);
return htmlConvertPDF(htmlText);
}
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();
}
}
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 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();
}
}
如果帮到你,记得点个赞~


