使用Aspose.Words将word转PDF并且去水印。

  •           :是江迪呀
  • ✒️本文关键词Java工具类转换word转pdfAspose.Words后端
  • ☀️每日   一言只要思想不滑坡,办法总比困难多。

前言

在我们日常开发中经常会有将word文档转为PDF的场景,有很多种方法我最倾向的的是使用Aspose.Words,原因是转出的PDF内容不会缺失很好用。但是Aspose.Words如果使用的话需要付费,不然转出的PDF会带有水印,但是可以通过代码去除,仅供研究学习。下面让我一起来研究学习下吧。

一、引入依赖

Aspose.Words官网地址

<dependency>
    <groupId>com.asposegroupId>
    <artifactId>aspose-wordsartifactId>
    <version>21.6version>
    <classifier>jdk16classifier>
dependency>

在这里插入图片描述

问题:我们会发现使用POM文件引入依赖的方式无法下载jar包,我们可以通过在官网下载jar放到本地maven仓库的方式解决。

1.1 下载jar包

使用Aspose.Words将word转PDF并且去水印。_第1张图片
使用Aspose.Words将word转PDF并且去水印。_第2张图片

1.2 放入本地Maven仓库

使用Aspose.Words将word转PDF并且去水印。_第3张图片
使用Aspose.Words将word转PDF并且去水印。_第4张图片

使用Aspose.Words将word转PDF并且去水印。_第5张图片

重新加载下maven即可。
使用Aspose.Words将word转PDF并且去水印。_第6张图片
如果你有私有的maven仓库那就更好办了,直接将jar包上传到私有maven仓库即可。

二、示例代码

2.1 WordToPdfUtil工具类:

import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import lombok.extern.slf4j.Slf4j;

import java.io.FileOutputStream;
import java.io.InputStream;

@Slf4j
public class WordsToPDFUtil {
    /**
     * 输出到指定的目录
     * @param is
     * @param toPath
     * @param fileName
     */
    public static void wordToPdf(InputStream is, String toPath,String fileName){
        Document doc = null;
      	 //去水印
       	removeWaterMark();
        try {
            String resultPath = toPath + fileName + ".pdf";
            FileOutputStream os = new FileOutputStream(resultPath);
            doc = new Document(is);
            doc.save(os, SaveFormat.PDF);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
 	 /**
     * 返回byte数组
     * @param is
     */
    public static byte[] wordToPdf(InputStream is){
        Document doc = null;
        //去水印
       	removeWaterMark();
        try {
            // 创建一个字节数组输出流
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            doc = new Document(is);
            doc.save(outputStream, SaveFormat.PDF);
            return outputStream.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
        /**
     * 去除水印
     * 使用反射替换变量
     * @return
     */
     private void removeWaterMark() throws Exception {
        Class<?> aClass = Class.forName("com.aspose.words.zzXyu");
        java.lang.reflect.Field zzZXG = aClass.getDeclaredField("zzZXG");
        zzZXG.setAccessible(true);
        java.lang.reflect.Field modifiersField = zzZXG.getClass().getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(zzZXG, zzZXG.getModifiers() & ~Modifier.FINAL);
        zzZXG.set(null,new byte[]{76, 73, 67, 69, 78, 83, 69, 70});
    }
}

转换前:
使用Aspose.Words将word转PDF并且去水印。_第7张图片
转换后:
使用Aspose.Words将word转PDF并且去水印。_第8张图片
去水印后:
使用Aspose.Words将word转PDF并且去水印。_第9张图片

2.2 去水印思路

当我们有购买了许可证时,我们需要使用 License()方法认证许可证,只需要找到认证代码然后使用Java的反射机制将认证代码替换成认证通过即可。
(1)找到许可证验证

 License license = new License();
 license.setLicense("");
 license.setLicense(new FileInputStream(""));

我们通过Debug可以发现认证使用到了两个静态参数:

package com.aspose.words;

final class zzXyu {
	//认证
    public static final byte[] zzZXG = new byte[]{69, 86, 65, 76, 85, 65, 84, 73, 79, 78};
    //认证通过
    public static final byte[] zz1Y = new byte[]{76, 73, 67, 69, 78, 83, 69, 68};
}

(2)通过Java反射拿到zzXyu类的Class对象

 Class<?> aClass = Class.forName("com.aspose.words.zzXyu");

(3)通过反射获取了名为 “zzZXG” 的字段对应的 Field 对象。=

java.lang.reflect.Field zzZXG = aClass.getDeclaredField("zzZXG");

(4)设置了字段zzZXG可访问,因为它是私有的

zzZXG.setAccessible(true);

(5)获取了zzZXG字段的类型对象(字段的修饰符)

java.lang.reflect.Field modifiersField = zzZXG.getClass().getDeclaredField("modifiers");

(5)设置修饰符可以被修改

 modifiersField.setAccessible(true);

(6)去除zzZXG前面的final修饰符,便于后续修改

modifiersField.setInt(zzZXG, zzZXG.getModifiers() & ~Modifier.FINAL);

(7)设置zzZXG的值为校验通过

zzZXG.set(null,new byte[]{76, 73, 67, 69, 78, 83, 69, 70});

三、总结

我们上述代码仅供参考学习!

注意:我们目前使用的Aspose.Words的版本是21.6,最新的版本是23.5,上面去除水印的代码仅支持到21.6
使用Aspose.Words将word转PDF并且去水印。_第10张图片

你可能感兴趣的:(java,#工具,word,pdf,java,工具类,后端,爬虫,转换)