首页 > 编程语言 >java导出word加水印,使用aspose.words加freemaker实现

java导出word加水印,使用aspose.words加freemaker实现

时间:2023-08-04 17:31:59浏览次数:47  
标签:word String doc 水印 waterShape 字体 words new java

先通过freemaker模板得到word文档通过aspose.words 中的Document读取文档,使用aspose.words Shape添加水印

public static void exportWordWaterMark(String templateName, Map<String, Object> data, String docName, HttpServletResponse response,String watermarkText,String format) {
    // 初始化配置文件
    Configuration configuration = new Configuration();
    // 设置编码
    configuration.setDefaultEncoding(StandardCharsets.UTF_8.name());
    // 获取文件所在文件夹
    configuration.setClassForTemplateLoading(WordUtil.class, "/template");

    // fileDirectory目录下的模板文件名
    Template template = null;
    try {
        template = configuration.getTemplate(templateName);
    } catch (IOException e) {
        throw new BusinessException("doc模板文件未找到");
    }
    Writer out = null;
    try {
        // 使用FreeMarker填充数据
        StringWriter stringWriter = new StringWriter();
        template.process(data, stringWriter);
        String generatedContent = stringWriter.toString();

        // 将FreeMarker生成的Word文档保存为临时文件
        OutputStream outputStream = new FileOutputStream("temp.docx");
        outputStream.write(generatedContent.getBytes());
        outputStream.close();
        // 使用Aspose.Words读取保存的Word文档
        AsposeUtil.getLicense();
        Document doc = new Document("temp.docx");
        Paragraph watermarkPara = new Paragraph(doc);
        //循环添加水印,这里横纵都在一条水平线,不太好看,可以对i和j控制使之有适当位移
        for (int j = -50; j < 700; j = j + 200) {
            for (int i = 50; i < 700; i = i + 100) {
                Shape waterShape = ShapeMore(doc, watermarkText, j, i);
                watermarkPara.appendChild(waterShape);
            }
        }
        for (Section sect : doc.getSections())
        {
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
        }

        // 设置HTTP响应头,将生成的Word文档作为附件下载
        docName = URLEncoder.encode(docName, Charsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename=" + docName + "." + format);
        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        // 将带水印的Word文档写入响应输出流
        OutputStream servletOutputStream = response.getOutputStream();
        if (Func.equals("pdf",format)) {
            doc.save(servletOutputStream, SaveFormat.PDF);
        } else if (Func.equals("doc",format)) {
            doc.save(servletOutputStream, SaveFormat.DOC);
        } else if (Func.equals("docx",format)) {
            doc.save(servletOutputStream, SaveFormat.DOCX);
        } else {
            throw new BusinessException("文件格式未找到!");
        }
        // 删除临时文件
        File tempFile = new File("temp.docx");
        tempFile.delete();
    } catch (IOException e) {
        throw new BusinessException("doc模板文件未找到!");
    } catch (TemplateException e) {
        throw new BusinessException("解析模板生成word失败!");
    } finally {
        if (out != null) {
            out.close();
        }
    }
}

处理页眉

如果文档有页眉页眉会无水印,以下代码处理页眉,添加水印

private static void insertWatermarkIntoHeader(Paragraph watermarkPara, Section sect, int headerType) throws Exception{
    HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);
    if (header == null)
    {
        header = new HeaderFooter(sect.getDocument(), headerType);
        sect.getHeadersFooters().add(header);
    }
    header.appendChild(watermarkPara.deepClone(true));
}

获取字体

操作文档,添加水印,两种办法获取字体,setFontFamily获取系统字体,如果Linux中不存在该字体会报错,需要Linux下载该字体

例如:微软雅黑,在Windows操作系统中,常见的系统字体文件通常存储在以下路径下:

C:\Windows\Fonts

在这个路径下获取字体放到Linux /usr/share/fonts路径中,通过下面代码更新字体缓存

sudo fc-cache -f -v

查看是否安装成功

fc-list | grep "Microsoft YaHei"

第二种自定义字体

ClassPathResource("font/simsun.ttf")读取字体文件,ClassPathResource读取路径在resources静态文件夹下

java导出word加水印,使用aspose.words加freemaker实现_临时文件

        InputStream inputStream = null;
        try {
            ClassPathResource classPathResource = new ClassPathResource("font/simsun.ttf");
            inputStream = classPathResource.getInputStream();
//            String fontPath = "font/simsun.TTF";
            Font customFont = Font.createFont(Font.TRUETYPE_FONT, inputStream);
            waterShape.getTextPath().setFontFamily(customFont.getFontName());
        } catch (FontFormatException | IOException e) {
            e.printStackTrace();
        }

添加水印

public static Shape ShapeMore(Document doc, String watermarkText, double left, double top){
        Shape waterShape = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
        //水印内容
        waterShape.getTextPath().setText(watermarkText);
        //水印字体
        waterShape.getTextPath().setFontFamily("Microsoft YaHei");
//        // 水印字体
//        InputStream inputStream = null;
//        try {
//            ClassPathResource classPathResource = new ClassPathResource("font/simsun.ttf");
//            inputStream = classPathResource.getInputStream();
////            String fontPath = "font/simsun.TTF";
//            Font customFont = Font.createFont(Font.TRUETYPE_FONT, inputStream);
//            waterShape.getTextPath().setFontFamily(customFont.getFontName());
//        } catch (FontFormatException | IOException e) {
//            e.printStackTrace();
//        }
        try {
            //具体字体内容大小进行自定义设置
            waterShape.setWidth(72);//水印宽度
            waterShape.setHeight(18);//水印高度
        } catch (Exception e) {
            e.printStackTrace();
        }
        //旋转水印
        waterShape.setRotation(-40);
        //填充颜色(没有填充颜色字会变成空心的)
        waterShape.getFill().setColor(new Color(217,217,217));
        //水印颜色 浅灰色
        waterShape.setStrokeColor(new Color(217,217,217));
        //将水印放置在页面中心
        waterShape.setLeft(left);
        waterShape.setTop(top);
        //设置包装类型
        waterShape.setWrapType(WrapType.NONE);
        return waterShape;
    }


标签:word,String,doc,水印,waterShape,字体,words,new,java
From: https://blog.51cto.com/u_16216211/6965294

相关文章

  • zookeeper JavaApi 删除节点
    /**删除节点*1.删除单个节点*2.删除带有子节点的节点*3.必须成功的删除*4.回调***/@Testpublicvoiddelete1()throwsException{//1.删除单个节点client.delete().forPath("/app1");}@Testpublicvoiddelete2()throw......
  • Java性能监控的一些记录
    本篇所有内容都是基于JDK5,如使用JDK6会有差别。工作,有一些值得记录的地方:JDK自身提供了很多工具,基于命令行和GUI的都有,学会合理应用它们是很有用处的。首先是jmap,这是一个命令行程序,用来查看JVM中对象数量情况,直接输入jmap会显示用法,下面是两个常用的功能:Java代码 jmap-h......
  • zookeeper JavaApi 创建节点
    importorg.apache.curator.RetryPolicy;importorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.CuratorFrameworkFactory;importorg.apache.curator.retry.ExponentialBackoffRetry;importorg.apache.zookeeper.CreateMode;impo......
  • [Javascript] event target and currentTarget
    <Parent><child><button/></child></Parent>functiononClick(event){console.log('target:',event.target)//buttonconsole.log('currentTarget',event.currentTarget)//parent}pa......
  • linux如何安装Java环境
    ❝本篇主要讲一下在linux上如何安装Java环境,widows安装方法之前已经有了,请查看之前的文章!❞安装包的方式这里推荐下载JAVA8,下载地址放到最后,要注册Oracle账号才能下载,当然也可以从其他方式下载。不建议使用这种,因为过程比较麻烦!查看linux版本getconfLONG_BIT#输出64版本号下载......
  • linux如何安装Java环境
    ❝本篇主要讲一下在linux上如何安装Java环境,widows安装方法之前已经有了,请查看之前的文章!❞安装包的方式这里推荐下载JAVA8,下载地址放到最后,要注册Oracle账号才能下载,当然也可以从其他方式下载。不建议使用这种,因为过程比较麻烦!查看linux版本getconfLONG_BIT#输出64版本号下载......
  • 用pageOffice控件实现 office 文档在线编辑Word插入另外word文档的功能
    OA办公中,业务需要编辑word文档,需要插入另外word文档的功能。怎么实现编辑word文档插入另外word文档呢?2实现方法通过pageOffice实现简单的在线打开编辑word时,通过设置关键代码:WordDocumentworddoc=newWordDocument();//先在要插入word文件的位置手动插入书签,书签必须......
  • 使用 JavaScript 实现待办事项列表
    让我们通过每个步骤的代码块来完成实现基本待办事项列表的步骤:1.设置HTML结构:2.设置待办事项列表的样式(可选):3.处理任务添加:4.显示任务:步骤3中的代码已涵盖此步骤。5.处理任务完成情况:6.处理任务删除:7.将任务存储在本地存储中(可选):8.重构和改进(可选):重构您的代码,使其更有......
  • Java17与相关框架支持版本SpringBoot、IDEA、Tomcat等
    相关框架需要的最低版本NameVersionJava17+SpringFramework6.0SpringBoot3.0Tomcat10.1Maven3.6.3+Gradle7.x(7.5orlater)and8.xUndertow2.3IntelliJIDEA2021.2+SpringFrameworkSpringFrameworkOverview::SpringFrame......
  • Java 8特性,函数式接口编程
    一、函数式接口简介什么是函数式接口在接口中,有且只有一个抽象方法,那么这个接口就是函数式接口。函数式接口是Lambda表达式使用的前提条件。为什么使用函数式接口在Java中不支持将函数作为一个数据,也就不能将函数作为方法的参数进行传递。因此给函数外加一层接口的声明......