1.准备需要填充的html页面
示例代码如下:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=UTF-8"/>
<meta name=ProgId content=Word.Document/>
<meta name=Generator content="Microsoft Word 14"/>
<meta name=Originator content="Microsoft Word 14"/>
</head>
<body>
<div>
<div style="height: auto;margin-top: 60px">
<p style="font-size:26pt; line-height:115%; margin:0pt 0pt 10pt; orphans:0; text-align:center; widows:0">
<span style="font-family:Calibri; font-size:40pt; color: red; font-weight:bold">${name}台风快报</span><br>
</p>
<div style=" display: flex;justify-content: space-between;height: 40px">
<p style="float:left">应急通信保障大队</p>
<p style="float:right">${expressTime}</p>
</div>
<hr style="background-color: red;border:none; height: 5px"/>
<p style="font-size:14pt; margin:0pt 0pt 10pt; orphans:0; text-align:justify; text-indent:21pt; widows:0">
<span style="height: auto">
${content}
</span>
</p>
</div>
<div style="margin-top: 390px">
<hr style="background-color: red; border:none;height: 5px"/>
<div style="display: flex; margin-top: 7px">
<div style="display: inline-block; width: 35%">编辑:${compiler}</div>
<div style="display: inline-block; width: 35%">审核:${reviewed}</div>
<div style="display: inline-block; width: 35%">签发人:${issuer}</div>
</div>
</div>
</div>
</body>
</html>
2.创建需要替换字段的实体类对象
import io.renren.commons.tools.validator.group.AddGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
/**
* @author yazb
* 新闻文档
*/
@Data
@ApiModel("台风快报")
@ToString
public class SzStormExpressDTO {
private Long id;
@NotEmpty(message = "台风名称不可为空", groups = AddGroup.class)
@ApiModelProperty("台风名称")
private String name;
@NotEmpty(message = "台风通用唯一识别码", groups = AddGroup.class)
@ApiModelProperty("台风通用唯一识别码")
private String tfTywysbm;
// @NotEmpty(message = "期刊不可为空", groups = AddGroup.class)
@ApiModelProperty("期刊")
private String periodical;
@ApiModelProperty("快报时间")
private String expressTime;
@ApiModelProperty("编写人")
// @NotEmpty(message = "编写人不可为空", groups = AddGroup.class)
private String compiler;
@ApiModelProperty("审核人")
// @NotEmpty(message = "审核人不可为空", groups = AddGroup.class)
private String reviewed;
@ApiModelProperty("签发人")
// @NotEmpty(message = "签发人不可为空", groups = AddGroup.class)
private String issuer;
@NotEmpty(message = "内容不可为空", groups = AddGroup.class)
@ApiModelProperty("正文内容")
private String content;
private Long creator;
private Date createDate;
private String date;
/**
* 数据更新时间
*/
private Long dataUpdateTime;
}
3.编写实现该方法的工具类
import com.aspose.pdf.SaveFormat;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.font.FontProvider;
import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.core.io.ClassPathResource;
import javax.servlet.ServletOutputStream;
import java.io.*;
import java.util.List;
public class WordUtil {
/**
* 填充html模板
*
* @param templateFile 模板文件名
* @param obj 模板参数 javaBean 或 Map<String, Object>
* @param output 输出流
*/
public static void templateHtml(String templateFile, Object obj, ServletOutputStream output) {
try {
// 读取模板文件,填充模板参数
Configuration freemarkerCfg = new Configuration(Configuration.VERSION_2_3_30);
//模板的位置
freemarkerCfg.setTemplateLoader(new ClassTemplateLoader(PdfUtil.class, "/template/pdf/tem"));
//获取模板
Template template = freemarkerCfg.getTemplate(templateFile);
//给模板中填充数据
StringWriter out = new StringWriter();
if (obj != null) {
template.process(obj, out);
}
String html = out.toString();
// 设置字体以及字符编码
ConverterProperties props = new ConverterProperties();
FontProvider fontProvider = new FontProvider();
ClassPathResource resource = new ClassPathResource("template/pdf/font/STHeitibd.ttf");
PdfFont sysFont = PdfFontFactory.createFont(resource.getPath(), PdfEncodings.IDENTITY_H, true);
fontProvider.addFont(sysFont.getFontProgram());
fontProvider.addStandardPdfFonts();
props.setFontProvider(fontProvider);
props.setCharset("utf-8");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 转换为PDF文档
PdfDocument pdf = new PdfDocument(new PdfWriter(baos));
pdf.setDefaultPageSize(PageSize.A4);
Document document = HtmlConverter.convertToDocument(html, pdf, props);
document.getRenderer().close();
document.close();
//pdf转doc
pdf2doc(baos, output);
output.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
实现PDF转Word
//pdf转doc
public static void pdf2doc(ByteArrayOutputStream baos, ServletOutputStream output) {
long old = System.currentTimeMillis();
try {
// 生成完成后,baos.toByteArray()就包含了完整的PDF字节数组
byte[] pdfBytes = baos.toByteArray();
// 或者,如果你想在内存中转换为InputStream以便于其他库使用
InputStream inputStream = new ByteArrayInputStream(pdfBytes);
//doc是将要被转化的word文档
com.aspose.pdf.Document doc = new com.aspose.pdf.Document(inputStream);
//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
ByteArrayOutputStream newByte = new ByteArrayOutputStream();
doc.save(newByte, SaveFormat.DocX);
InputStream newInputStream = new ByteArrayInputStream(newByte.toByteArray());
removeWatermark(newInputStream, output);
//转化用时
long now = System.currentTimeMillis();
System.out.println("Pdf 转 Word 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Pdf 转 Word 失败...");
e.printStackTrace();
}
}
/**
* 移除文字水印
*
* @param inputStream
* @param output
* @return
*/
public static boolean removeWatermark(InputStream inputStream, ServletOutputStream output) {
try {
XWPFDocument doc = new XWPFDocument(inputStream);
// 段落
List<XWPFParagraph> paragraphs = doc.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
String text = paragraph.getText();
if ("Evaluation Only. Created with Aspose.PDF. Copyright 2002-2021 Aspose Pty Ltd.".equals(text)) {
List<XWPFRun> runs = paragraph.getRuns();
runs.forEach(e -> e.setText("", 0));
}
}
// FileOutputStream outStream = new FileOutputStream(output);
doc.write(output);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}