HTML填充字段实现PDF转Word,并去除转换过程中生成的水印

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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值