一天总有些无语的需求,人都要裂了,本来是word转pdf,但是因为要先在页面显示,再导出,而且页面排版很麻烦,果断选择用模板,比用word或直接写odf快多了
1、读取模板并转为字符串
spring.freemarker.template-loader-path=classpath:ftl
spring.freemarker.suffix=.ftl
spring.freemarker.charset=utf-8
spring.freemarker.cache=false
spring.freemarker.prefer-file-system-access=false
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.3</version>
</dependency>
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
// 读取模板
template = freeMarkerConfigurer.getConfiguration().getTemplate("letter/"+letter+".ftl");
// 填充模板
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, detail);
// 转为string
content = StringEscapeUtils.unescapeHtml(content);
2、转换为pdf(必须遵循xhtml,全部标签必须闭合)
这里的图片用的是file:///
的方式
或者添加renderer.getSharedContext().setBaseURL("file:/图片路径");
设置图片相对路径,即可在html中使用相对路径
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.BaseFont;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class CreatePdfText {
private static final Logger LOG = LoggerFactory.getLogger(CreatePdfText.class);
/**
* html转pdf
*
* @param file
* @param html
*/
public static void html2Pdf(File file, String html) {
File dir = file.getParentFile();
if (!dir.exists()) {
dir.mkdirs();
}
try (FileOutputStream out = new FileOutputStream(file)) {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
// 解决中文支持问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(out);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}