前言:

最近需要一个功能,将word文件转换为pdf格式,并在中间加入水印信息,因aspose.word源码是加密的,看起来比较费劲,官方api也是不很友好,故特此记录。

附:https://reference.aspose.com/words/java/

第一步:

引入依赖

        <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><vresion>18.1</vresion></dependency>

第二步:

添加一个水印到文档中,并保存为pdf格式

@Test
    public void testWord2PdfWithWaterMark() throws FileNotFoundException {
        File file = new File("C:\\Users\\dell\\Desktop\\aaa.docx");
        String targetPath = "C:\\Users\\dell\\Desktop\\test";
        File targetFile = new File(targetPath);
        if (!targetFile.exists()) {
            targetFile.mkdir();
        }
        FileOutputStream outputStream = new FileOutputStream(targetPath + File.separator + "bbb.docx");
        try (FileInputStream inputStream = new FileInputStream(file)) {
            Document doc = new Document(inputStream);
            InsertWatermarkText(doc, "你好啊");
            //InsertWaterMarks(doc, "你好啊");
            doc.save(outputStream, SaveFormat.DOCX);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

接下来就是具体的实现了:

     /*** 插入水印* @param doc* @param watermarkText* @throws Exception*/private static void InsertWatermarkText(Document doc, String watermarkText) throws Exception {Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);watermark.getTextPath().setText(watermarkText);//设置水印样式watermark.getTextPath().setFontFamily("Arial");//设置字体watermark.setRotation(-40);//设置偏移角度watermark.setHeight(100);//水印高度watermark.setWidth(200);//水印宽度watermark.setFillColor(Color.gray);//设置填充颜色watermark.setStrokeColor(Color.gray);//设置描边颜色//官方api给的解释  太官方了  (只插入一条水印 默认为这些数据)watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);//指定相对于水平放置的位置watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);//指定相对于形状垂直定位的位置watermark.setWrapType(WrapType.TOP_BOTTOM);//定义水印的环绕模式watermark.setVerticalAlignment(VerticalAlignment.CENTER);//  指定形状垂直放置的方式watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);// 指定形状如何水平放置Paragraph watermarkPara = new Paragraph(doc);watermarkPara.appendChild(watermark);/*String text = watermarkPara.getText();System.out.println("++++++++++" + text);System.out.println("______________" + watermarkPara);NodeCollection childNodes = watermarkPara.getChildNodes();String text1 = childNodes.get(0).getText();System.out.println("111111" + text);*/for (Section section : doc.getSections()) {InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_PRIMARY);InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_FIRST);InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_EVEN);}}
    /*** 将水印插入图像头部* @param watermarkPara* @param section* @param headerType*/private static void InsertWatermarkIntoHeader(Paragraph watermarkPara, Section section, int headerType) {HeaderFooterCollection headerFooters = section.getHeadersFooters();HeaderFooter footer = headerFooters.getByHeaderFooterType(headerType);if (footer == null) {footer = new HeaderFooter(section.getDocument(), headerType);section.getHeadersFooters().add(footer);}footer.appendChild(watermarkPara.deepClone(true));}

第三步:

插入多个水印实现

     /*** 插入多个水印** @param doc* @param waterMark* @throws Exception*/public static void InsertWaterMarks(Document doc, String waterMark) throws Exception {Paragraph watermarkPara = new Paragraph(doc);for (int j = 0; j < 500; j = j + 100) {for (int i = 0; i < 700; i = i + 85) {Shape waterShape = ShapeMore(doc, "—"+waterMark + "—", j, i);watermarkPara.appendChild(waterShape);}}String text = watermarkPara.getText();System.out.println("++++++++++" + text);System.out.println("______________" + watermarkPara);NodeCollection childNodes = watermarkPara.getChildNodes();String text1 = childNodes.get(0).getText();System.out.println("111111" + text1);/* Shape waterShape = ShapeMore(mdoc, wmText, 155, 300);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);}}

多个水印处理

     /*** 设置水印属性** @param doc* @param waterMark* @param left* @param top* @return* @throws Exception*/public static Shape ShapeMore(Document doc, String waterMark, double left, double top) throws Exception {Shape waterShape = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
//        Shape waterShape = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);//        Shape waterShape = new Shape(doc, ShapeType.IMAGE);
//        waterShape.getImageData().setImage(wmText);waterShape.getTextPath().setText(waterMark);waterShape.getTextPath().setFontFamily("Arial");waterShape.setWidth(40);waterShape.setHeight(13);waterShape.setRotation(-40);waterShape.setFilled(true);waterShape.getFill().setColor(Color.RED);waterShape.setStrokeColor(Color.RED);
//        waterShape.setStrokeColor(new Color(210,210,210));//将水印放置在页面中心waterShape.setLeft(left);waterShape.setTop(top);
//        //设置垂直对齐
//        waterShape.setVerticalAlignment(VerticalAlignment.CENTER);
//        //设置文本水平对齐方式
//        waterShape.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置包装类型waterShape.setWrapType(WrapType.NONE);return waterShape;}

效果展示:

具体样式可以自己调,比如颜色字体,水印一行个数,水印环绕格式等

java实现word转换pdf并批量生成水印相关推荐

  1. Java WORD转换PDF 并添加水印 (附赠jar提取链接)

    Java WORD转换PDF 并添加水印 直接上代码 实现功能 docx文档转换为PDF 转换之后排版不混乱 使用工具(Jar包) aspose-words-15.8.0-jdk16.jar(用于PD ...

  2. Java使用aopse实现word转换pdf

    Java使用aopse实现word转换pdf 需要引用aspose包,引入操作我写了一个博客,地址如下 https://blog.csdn.net/weixin_46713508/article/de ...

  3. JAVA 使用 com.aspose.words将word转换PDF等

    因为公司前端需要在线查看word和PDF,后台上传需求将word等文件转换为PDF,原本使用的是liboffice进行转换,后来部署到服务器端之后,发现并不是很适合,由此找到com.aspose.wo ...

  4. Java使用Spire.Pdf或Aspose-Words实现Word转换Pdf在Linux服务器上的中文乱码问题

    一.问题产生的背景 当Word文档中含有中文字符时,不管是使用Spire.Pdf或Aspose-Words实现Word转换Pdf,代码的执行都需要调用操作系统的本地字体库支持,否则所有中文字符都将乱码 ...

  5. java 模板 word转pdf 可分页 带图片

    java 模板 word转pdf 可分页 带图片 之前写过一个简单的案例,但是在项目中完全不能满足客户的需求,所以重新用啦一种方式来写,采用了word转换pdf的方式,这种经过不断研究,满足了可分页, ...

  6. Java实现Word转PDF方案选择

    Java实现Word转PDF方案选择 很多应用场景中都会涉及到Word转PDF,但Word转PDF的方案在网上一搜一大把,让人眼花缭乱,笔者踩过无数的坑后,最终总结出以下三种方案 OpenOffice ...

  7. 解决 linux(centos7)word转换pdf时,pdf乱码问题

    本文解决当word转换为pdf时,pdf文档中的中文字体全部都是乱码(方框)的问题. 先简单的写一下word转换pdf的代码,这个网上有很多(最下方有引用一遍博客详细的讲解了如何转换) /**** @ ...

  8. word换pdf并且自动生成目录

    目录 利用aspose-word for java和aspose-pdf for java完成word转pdf并且生成目录 1. jacob 2. aspose 2.1 利用aspose-word f ...

  9. java实现word转pdf在线预览格式

    java实现word转pdf在线预览格式 前段时间的项目里涉及了此功能,调研过一些方案,踩过一些坑,一一总结在此. java转pdf的方案很多,但是很多都要收费,转pdf也有一些格式方面的问题. 方案 ...

  10. Aspose.Java实现word转pdf,添加水印等操作

    Aspose.Java实现word转pdf,添加水印等操作 一. word转pdf 二. 文档插入水印 Aspose是一款商用版控件,支持各类文档操作,这里主要介绍如何在Springboot项目中使用 ...

最新文章

  1. 全局唯一递增的id_分布式ID生成方法-趋势有序的全局唯一ID
  2. Builder建造者设计模式
  3. 一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出
  4. mysql中局部变量说法正确的是_mysql全局变量和局部变量
  5. 前后数据交互(ajax) -- 初始化页面表格
  6. 两大硬件设计被OCP官方接受,腾讯成国内互联网公司第一家
  7. 警告:ORA-00600 2252 错误正在SCN问题下不断爆发
  8. 12bit的图像如何向8bit转化_干货分享 | 如何鉴别Western Blot图像的真实性?
  9. [转]隐马尔科夫模型HMM
  10. python 调用海康sdk_Qt调用海康SDK实现摄像头视频播放
  11. Unity3d学习之路-初识GameSparks多人游戏插件
  12. android 横屏字体变小,android屏幕大小,字体大小,横屏竖屏切换问题
  13. 如何对iOS设备进行性能测试
  14. 牛客网——B-栈和排序
  15. JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)
  16. Docker 安装常用软件(超全、超实用)
  17. 关于win10无法下载steam解决方法(如何国外网站下载)
  18. linux系统可以装win10吗,教大家1个能在win10安装运行Linux系统的方法
  19. 在win上面关闭445端口的方法
  20. excel+导入oracle+工具,EXCEL导入ORACLE工具(Xls To Ora)下载 v1.9免费版-下载啦

热门文章

  1. 新一代物联网商用全面铺开 NB-IoT擎起新智慧城市
  2. 大话C语言——优化结构控制(一)
  3. Remix OS——一个很有魅力的Android系统
  4. WIFI下无法登录百度网盘
  5. c#语言小括号里面的逗号是什么意思
  6. python 伪造源ip_Python实现爬虫设置代理IP和伪装成浏览器的方法共享
  7. 解决strongOD与olly advanced插件冲突问题
  8. 数据分析与爬虫实战视频——学习笔记(四)(糗事百科、天善智能、当当商城、sql输出)
  9. 国内商务工作邮箱对比哪个好?常用邮箱开通哪个最好?
  10. bootstrap之栅格化