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

本文介绍了如何在Java项目中使用Aspose.Words库将Word文档转换为PDF,重点讨论了如何处理Aspose.Words的试用版水印问题,通过反射机制去除水印。文章提供了一个WordToPdfUtil工具类的示例代码,包括转换方法和去除水印的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

前言

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

一、引入依赖

Aspose.Words官网地址

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-words</artifactId>
    <version>21.6</version>
    <classifier>jdk16</classifier>
</dependency>

在这里插入图片描述

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

1.1 下载jar包

在这里插入图片描述
在这里插入图片描述

1.2 放入本地Maven仓库

在这里插入图片描述
**加粗样式**

在这里插入图片描述

重新加载下maven即可。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0defab5b033e4235a78562af1fe60690.png
如果你有私有的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});
    }
}

转换前:
在这里插入图片描述
转换后:
在这里插入图片描述
去水印后:
在这里插入图片描述

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, 68});

三、总结

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

注意:我们目前使用的Aspose.Words的版本是21.6,最新的版本是23.5,上面去除水印的代码仅支持到21.6
在这里插入图片描述

可以使用以下方式在el-input中输入负数: 在引用中提到,可以通过在el-input组件中设置type为"number"来限制输入只能为数字。但是默认情况下,type为"number"的el-input组件不支持输入负数。要允许输入负数,可以使用onkeypress事件限制只能输入数字和负号。你可以在el-input中添加onkeypress事件,并使用正则表达式来限制输入的字符。例如,可以使用以下代码来实现这个功能: <el-input v-model="name" onkeypress="return (/[-\d]/.test(String.fromCharCode(event.keyCode)))" /> 这样设置后,el-input组件就可以输入负数了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [el-element 中 input设置了type=“number“还能输入e和负数的问题如何解决?](https://blog.csdn.net/weixin_49035434/article/details/125390323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [el-input 只能输入整数(包括正数、负数、0)或者只能输入整数(包括正数、负数、0)和小数](https://blog.csdn.net/weixin_43908123/article/details/124788652)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是江迪呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值