相关链接
https://xie.infoq.cn/article/7d475ca4d2eb4632c2459fe05
https://github.com/xinxiamu/java-core/blob/c94d82daaff37f8efba04cdd87631e79f4d1f266/core/src/main/java/com/ymu/study/office/AsposeCrack.java
https://www.cnblogs.com/Chary/articles/15843737.html
aspose官方jar包链接:
https://releases.aspose.com/java/repo/com/aspose/aspose-pdf/23.1/
javassist依赖
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.26.0-GA</version>
</dependency>
相关步骤
首先在aspose官网仓库找到你所需要版本并下载(我下载的是23.1版本的),然后将jar包添加到项目,并添加javassist依赖,用javassist修改com.aspose.pdf.ADocument这个类,主要是这个类有限制pdf转word的页数,以及添加水印,每个版本jar包应该是不一样的,具体我也不是很懂(如果谁明白可以告诉我…),23.1版本的是ADocument的lI(限制页数)和lt(添加水印)方法,用javassist找到并修改这两个方法生成class文件,最后拿生成出来的com.aspose.pdf.ADocument的class文件覆盖jar包里的class,并删除jar包里META-INF文件夹下的.rsa和.sf文件,然后重新添加jar包就可以了。
相关代码
package TestAspose;
import com.aspose.pdf.DocSaveOptions;
import com.aspose.pdf.Document;
import com.aspose.pdf.devices.JpegDevice;
import com.aspose.pdf.devices.Resolution;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName TestAspose
* @Description TODO
* @Author guoqk
* @Version 1.0
*
**/
public class TestAspose {
public static final String DESKTOP = "C:\\Users\\guoqk\\Desktop\\";
public static final String ALL_CLASS_NAME = "com.aspose.pdf.ADocument";
public static void main(String[] args) throws Exception {
//ConvertPDFtoWord();
crack();
}
/**
* pdf转为word
*/
public static void ConvertPDFtoWord()
{
Document pdfDocument = new Document(DESKTOP + "123.pdf");
DocSaveOptions saveOptions = new DocSaveOptions();
//指定保存为word的格式
saveOptions.setFormat(DocSaveOptions.DocFormat.DocX);
pdfDocument.save(DESKTOP +"123_out.docx", saveOptions);
}
/**
* 修改class文件
* @throws Exception
*/
public static void crack() throws Exception{
ClassPool.getDefault().insertClassPath(DESKTOP + "aspose-pdf-23.1.jar");
CtClass ctClass = ClassPool.getDefault().getCtClass(ALL_CLASS_NAME);
CtMethod[] declaredMethods = ctClass.getDeclaredMethods();
for (CtMethod declaredMethod : declaredMethods) {
CtClass[] parameterTypes = declaredMethod.getParameterTypes();
//-----------解除限制-----------
//如果参数是两个,参数方法名是“lI”,第一个参数的全限定类名是ALL_CLASS_NAME,返回值类型是boolean的
if (parameterTypes.length==2 && declaredMethod.getName().equals("lI") &&
parameterTypes[0].getName().equals(ALL_CLASS_NAME) && declaredMethod.getReturnType().getName().equals("boolean")){
//System.out.println(parameterTypes[0].getName());
//System.out.println(parameterTypes[1].getName());
//修改方法体
declaredMethod.setBody("{return false;}");
}
//-----------------------------
//-----------去除水印-----------
//如果方法名是“lt”而且方法没有参数
if(declaredMethod.getName().equals("lt") && parameterTypes.length == 0){
declaredMethod.setBody("{return true;}");
}
//-----------------------------
}
ctClass.writeFile(DESKTOP);
}
}