目录
1. jar包获取及处理
1.1 .获取Aspose所需jar包
在pom文件的<repository> 标签中添加源
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>https://repository.aspose.com/repo/</url>
</repository>
在对应服务pom文件中添加jar包引用
<!-- 以下是 Aspose.Total for Java 处理office文件转为PDF的jar包 -->
<dependency><!--word-->
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>21.11</version>
<classifier>jdk17</classifier>
</dependency>
<dependency><!--pdf-->
<groupId>com.aspose</groupId>
<artifactId>aspose-pdf</artifactId>
<version>21.8</version>
</dependency>
<dependency><!--excel-->
<groupId>com.aspose</groupId>
<artifactId>aspose-cells</artifactId>
<version>21.8</version>
</dependency>
<dependency><!--pptx-->
<groupId>com.aspose</groupId>
<artifactId>aspose-slides</artifactId>
<version>21.8</version>
<classifier>jdk16</classifier>
</dependency>
<dependency><!--jar破解工具-->
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
1.2 修改jar包代码
在jar下载完毕后,根据配置的maven仓库的位置寻找对应jar包的绝对路径,
或者在idea中的pom文件中悬停鼠标获取对应的路径
通过上述图片中的路径就可知道对应的jar包路径在
D:\Java\maven\localDB\com\aspose\aspose-words\21.11\ 之下
由上所述,分别拿到
aspose-words ,aspose-pdf , aspose-cells , aspose-slides 的jar包路径
(拿到此处的路径后保存待后续使用)
1.3 创建破解类
在项目中创建空白类,写入如下代码\
注意下述代码中的静态常量替换为刚才拿到的jar包路径,
DESKTOP 为破解生成的文件的保存路径,这里根据自己的需要修改
package com.xd.simpledemo.cracking;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
import java.io.IOException;
/**
* @author lx970
* @date 2024/5/8 17:45
*/
public class Cracking {
private static final String Desktop = "C:\\Users\\lx970\\Desktop";
private static final String PDF_JAR = "D:\\Java\\maven\\localDB\\com\\aspose\\aspose-pdf\\21.8\\aspose-pdf-21.8.jar";
private static final String CELLS_JAR = "D:\\Java\\maven\\localDB\\com\\aspose\\aspose-cells\\21.8\\aspose-cells-21.8.jar";
private static final String WORDS_JAR = "D:\\Java\\maven\\localDB\\com\\aspose\\aspose-words\\21.11\\aspose-words-21.11-jdk17.jar";
private static final String PPT_JAR = "D:\\Java\\maven\\localDB\\com\\aspose\\aspose-slides\\21.8\\aspose-slides-21.8-jdk16.jar";
// 此处的功能是为了进入jar包中的类拿取信息
// private void viewSetLicenseCode() throws Exception {
// com.aspose.pdf.License pdfLicense = new com.aspose.pdf.License();
// com.aspose.words.License wordsLicense = new com.aspose.words.License();
// com.aspose.slides.License slidesLicense = new com.aspose.slides.License();
// com.aspose.cells.License cellsLicense = new com.aspose.cells.License();
// // 请点击这里的setLicense方法进入查看源码,不同版本对words 的破解方法名不一样,但道理差不多
// pdfLicense.setLicense("");
// wordsLicense.setLicense("");
// slidesLicense.setLicense("");
// cellsLicense.setLicense("");
// }
public static void main(String[] args) {
try {
//生成pdf破解包
crackAsposePdfJar(PDF_JAR);
crackAsposeCells(CELLS_JAR);
crackAsposeWordsJarAddLicense1(WORDS_JAR);
modifyPptJar(PPT_JAR);
//
}catch (Exception e){
e.printStackTrace();
}
}
// pdf-21.8版本破解
private static void crackAsposePdfJar(String jarName) {
try {
ClassPool.getDefault().insertClassPath(jarName);
CtClass ctClass = ClassPool.getDefault().getCtClass("com.aspose.pdf.ADocument");
CtMethod[] declaredMethods = ctClass.getDeclaredMethods();
int num = 0;
for (int i = 0; i < declaredMethods.length; i++) {
if (num == 2) {
break;
}
CtMethod method = declaredMethods[i];
CtClass[] ps = method.getParameterTypes();
if (ps.length == 2
&& method.getName().equals("lI")
&& ps[0].getName().equals("com.aspose.pdf.ADocument")
&& ps[1].getName().equals("int")) {
// 源码ADocument类的这个方法限制页数:
// static boolean lI(ADocument var0, int var1) {
// return !lb() && !lj() && !var0.lt() && var1 > 4;
// }
// 最多只能转换4页,处理返回false,无限制页数
System.out.println(method.getReturnType());
System.out.println(ps[1].getName());
method.setBody("{return false;}");
num = 1;
}
if (ps.length == 0 && method.getName().equals("lt")) {
// 水印处理
method.setBody("{return true;}");
num = 2;
}
}
// 修改完,把类的输出到指定目录(桌面下)
ctClass.writeFile(Desktop);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// cells-21.8版本破解
public static void crackAsposeCells(String JarPath) throws NotFoundException, CannotCompileException, IOException {
// 这个是得到反编译的池
ClassPool pool = ClassPool.getDefault();
// 取得需要反编译的jar文件,设定路径
pool.insertClassPath(JarPath);
CtClass ctClass = pool.get("com.aspose.cells.License");
CtMethod method_isLicenseSet = ctClass.getDeclaredMethod("isLicenseSet");
method_isLicenseSet.setBody("return true;");
CtMethod method_setLicense = ctClass.getDeclaredMethod("setLicense");
method_setLicense.setBody("{ a = new com.aspose.cells.License();\n" +
" com.aspose.cells.zbkl.a();}");
CtMethod methodL = ctClass.getDeclaredMethod("l");
methodL.setBody("return new java.util.Date(Long.MAX_VALUE);");
ctClass.writeFile(Desktop);
}
// words-21.11-jdk17版本破解代码:
private static void crackAsposeWordsJarAddLicense1(String jarName) {
try {
// 这一步是完整的jar包路径,选择自己解压的jar目录
ClassPool.getDefault().insertClassPath(jarName);
// 获取指定的class文件对象
CtClass zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.words.zzXDb");
// 从class对象中解析获取指定的方法
CtMethod[] methodA = zzZJJClass.getDeclaredMethods("zzY0J");
// 遍历重载的方法
for (CtMethod ctMethod : methodA) {
CtClass[] ps = ctMethod.getParameterTypes();
if (ctMethod.getName().equals("zzY0J")) {
System.out.println("ps[0].getName==" + ps[0].getName());
// 替换指定方法的方法体
ctMethod.setBody("{this.zzZ3l = new java.util.Date(Long.MAX_VALUE);this.zzWSL = com.aspose.words.zzYeQ.zzXgr;zzWiV = this;}");
}
}
// 这一步就是将破译完的代码放在桌面上
zzZJJClass.writeFile(Desktop);
// 获取指定的class文件对象
CtClass zzZJJClassB = ClassPool.getDefault().getCtClass("com.aspose.words.zzYKk");
// 从class对象中解析获取指定的方法
CtMethod methodB = zzZJJClassB.getDeclaredMethod("zzWy3");
// 替换指定方法的方法体
methodB.setBody("{return 256;}");
// 这一步就是将破译完的代码放在桌面上
zzZJJClassB.writeFile(Desktop);
} catch (Exception e) {
System.out.println("错误==" + e);
}
}
// slides-21.8-jdk16版本破解代码
private static void modifyPptJar(String jarName) {
try {
// 这一步是完整的jar包路径,选择自己解压的jar目录
ClassPool.getDefault().insertClassPath(jarName);
CtClass zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.slides.internal.of.public");
CtMethod[] methodA = zzZJJClass.getDeclaredMethods();
for (CtMethod ctMethod : methodA) {
CtClass[] ps = ctMethod.getParameterTypes();
if (ps.length == 3 && ctMethod.getName().equals("do")) {
System.out.println("ps[0].getName==" + ps[0].getName());
ctMethod.setBody("{}");
}
}
// 这一步就是将破译完的代码放在桌面上
zzZJJClass.writeFile(Desktop);
} catch (Exception e) {
System.out.println("错误==" + e);
}
}
}
运行mian函数,在指定的保存位置会生成目标i文件,并且对应的目录下会出现对应的class文件
将此处生成的class文件替换掉原jar包中的class文件
进入生成的目标文件所在的文件夹,注意是com文件夹所i在的位置,不是class文件所在的位置
比如,目前我将目标文件生成在了桌面上,那么就应该在桌面的位置打开cmd
方法是在桌面的位置输入cmd,然后回车
jar -uvf D:\Java\maven\localDB\com\aspose\aspose-pdf\21.8\aspose-pdf-21.8.jar com\aspose\pdf\ADocument.class
jar -uvf D:\Java\maven\localDB\com\aspose\aspose-cells\21.8\aspose-cells-21.8.jar com\aspose\cells\License.class
jar -uvf D:\Java\maven\localDB\com\aspose\aspose-words\21.11\aspose-words-21.11-jdk17.jar com\aspose\words\zzXDb.class
jar -uvf D:\Java\maven\localDB\com\aspose\aspose-words\21.11\aspose-words-21.11-jdk17.jar com\aspose\words\zzYKk.class
jar -uvf D:\Java\maven\localDB\com\aspose\aspose-slides\21.8\aspose-slides-21.8-jdk16.jar com\aspose\slides\internal\of\public.class
用上述命令替换jar包中的文件,注意将jar包的路径替换为自己jar包所在路径
删除jar包中的 如下两个文件
META-INF/37E3C32D.SF
META-INF/37E3C32D.RSA
如果不删除在使用jar包时会出现安全检验问题
此处我用到的删除方法为,使用360压缩打开jar包,找到对应的两个文件,右键删除(其他压缩软件未测试,自行尝试即可
)
2. 编写转换工具类
以下工具类仅实例转换方法,使用windows本地文件模拟,实际应用以个人需求改造
import com.aspose.cells.Workbook;
import com.aspose.pdf.devices.PngDevice;
import com.aspose.pdf.devices.Resolution;
import com.aspose.slides.Presentation;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.charset.StandardCharsets;
class OfficeToPDFUtil {
private static final Logger logger = LoggerFactory.getLogger(OfficeToPDFUtil.class);
//word转PDF
public synchronized static boolean word3Pdf(String wordPath, String pdfPath) {
if (!getLicense("word")) { // 验证License 若不验证则转化出的pdf文档会有水印产生
return false;
}
try {
long old = System.currentTimeMillis();
File file = new File(pdfPath); //新建一个pdf文档
FileOutputStream os = new FileOutputStream(file);
Document doc = new Document(wordPath); //Address是将要被转化的word文档
doc.save(os, SaveFormat.PDF);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB,
// XPS, SWF 相互转换
long now = System.currentTimeMillis();
os.close();
logger.info("word共耗时:" + ((now - old) / 1000.0) + "秒"); //转化用时
return true;
} catch (Exception e) {
logger.error(String.valueOf(e));
e.printStackTrace();
return false;
}
}
//excel转PDF
public synchronized static boolean excel3pdf(String excelPath, String pdfPath) {
if (!getLicense("excel")) { // 验证License 若不验证则转化出的pdf文档会有水印产生
return false;
}
try {
long old = System.currentTimeMillis();
File pdfFile = new File(pdfPath); //新建一个pdf文档
FileOutputStream os = new FileOutputStream(pdfFile);
Workbook wb = new Workbook(excelPath);// 原始excel路径
wb.save(os,com.aspose.cells.SaveFormat.PDF);
long now = System.currentTimeMillis();
os.close();
logger.info("excel共耗时:" + ((now - old) / 1000.0) + "秒"); //转化用时
return true;
} catch (Exception e) {
logger.error(String.valueOf(e));
e.printStackTrace();
return false;
}
}
//ppt转PDF
public synchronized static boolean ppt3pdf(String pptPath, String pdfPath) {
// 验证License
if (!getLicense("ppt")) {
return false;
}
FileOutputStream os = null;
try {
long old = System.currentTimeMillis();
File pdfFile = new File(pdfPath); //新建一个pdf文档
os = new FileOutputStream(pdfFile);
Presentation pres = new Presentation(pptPath);//输入ppt路径
//IFontsManager fontsManager = pres.getFontsManager();
pres.save(os,com.aspose.slides.SaveFormat.Pdf);
long now = System.currentTimeMillis();
logger.info("ppt共耗时:" + ((now - old) / 1000.0) + "秒"); //转化用时
return true;
} catch (Exception e) {
logger.error(String.valueOf(e));
e.printStackTrace();
return false;
}finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//转word
public static void pdf2word(String pdfPath) {
long old = System.currentTimeMillis();
try {
String wordPath=pdfPath.substring(0,pdfPath.lastIndexOf("."))+".docx";
FileOutputStream os = new FileOutputStream(wordPath);
com.aspose.pdf.Document doc = new com.aspose.pdf.Document(pdfPath);
doc.save(os, com.aspose.pdf.SaveFormat.DocX);
os.close();
long now = System.currentTimeMillis();
System.out.println("Pdf 转 Word 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Pdf 转 Word 失败...");
e.printStackTrace();
}
}
//转ppt
public static void pdf2ppt(String pdfPath) {
long old = System.currentTimeMillis();
try {
String wordPath=pdfPath.substring(0,pdfPath.lastIndexOf("."))+".ppt";
FileOutputStream os = new FileOutputStream(wordPath);
com.aspose.pdf.Document doc = new com.aspose.pdf.Document(pdfPath);
doc.save(os, com.aspose.pdf.SaveFormat.Pptx);
os.close();
long now = System.currentTimeMillis();
System.out.println("Pdf 转 PPT 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Pdf 转 PPT 失败...");
e.printStackTrace();
}
}
//pdf转excel
public static void pdf2excel(String pdfPath) {
long old = System.currentTimeMillis();
try {
String wordPath=pdfPath.substring(0,pdfPath.lastIndexOf("."))+".xlsx";
FileOutputStream os = new FileOutputStream(wordPath);
com.aspose.pdf.Document doc = new com.aspose.pdf.Document(pdfPath);
doc.save(os, com.aspose.pdf.SaveFormat.Excel);
os.close();
long now = System.currentTimeMillis();
System.out.println("Pdf 转 EXCEL 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Pdf 转 EXCEL 失败...");
e.printStackTrace();
}
}
//pdf转html
public static void pdf2Html(String pdfPath) {
long old = System.currentTimeMillis();
try {
String htmlPath=pdfPath.substring(0,pdfPath.lastIndexOf("."))+".html";
com.aspose.pdf.Document doc = new com.aspose.pdf.Document(pdfPath);
doc.save(htmlPath, com.aspose.pdf.SaveFormat.Html);
long now = System.currentTimeMillis();
System.out.println("Pdf 转 HTML 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Pdf 转 HTML 失败...");
e.printStackTrace();
}
}
//pdf转图片
public static void pdf2image(String pdfPath) {
long old = System.currentTimeMillis();
try {
Resolution resolution = new Resolution(300);
String dataDir=pdfPath.substring(0,pdfPath.lastIndexOf("."));
File imageDir = new File(dataDir+"_images");
imageDir.mkdirs();
com.aspose.pdf.Document doc = new com.aspose.pdf.Document(pdfPath);
PngDevice pngDevice = new PngDevice(resolution);
for (int pageCount = 1; pageCount <= doc.getPages().size(); pageCount++) {
OutputStream imageStream = new FileOutputStream(imageDir+"/"+pageCount+".png");
pngDevice.process(doc.getPages().get_Item(pageCount), imageStream);
imageStream.close();
}
long now = System.currentTimeMillis();
System.out.println("Pdf 转 PNG 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
System.out.println("Pdf 转 PNG 失败...");
e.printStackTrace();
}
}
//剔除水印
private static boolean getLicense(String type) {
boolean result = false;
try {
// 凭证
String license =
"<License>\n" +
" <Data>\n" +
" <Products>\n" +
" <Product>Aspose.Total for Java</Product>\n" +
" <Product>Aspose.Words for Java</Product>\n" +
" </Products>\n" +
" <EditionType>Enterprise</EditionType>\n" +
" <SubscriptionExpiry>20991231</SubscriptionExpiry>\n" +
" <LicenseExpiry>20991231</LicenseExpiry>\n" +
" <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>\n" +
" </Data>\n" +
" <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>\n" +
"</License>";
InputStream is = new ByteArrayInputStream(license.getBytes(StandardCharsets.UTF_8));
switch (type) {
case "word": {
License asposeLic = new License();
asposeLic.setLicense(is);
break;
}
case "excel": {
com.aspose.cells.License asposeLic = new com.aspose.cells.License();
asposeLic.setLicense(is);
break;
}
case "ppt":
com.aspose.slides.License aposeLic = new com.aspose.slides.License();
aposeLic.setLicense(is);
break;
}
result = true;
} catch (Exception e) {
logger.error(String.valueOf(e));
e.printStackTrace();
return false;
}
return result;
}
/**
* 判断资源类型文档类
*/
private static String getResourceTypesDocument(String suffix) {
String type = null;
switch (suffix) {
//文档类型
case ".doc":
case ".docx":
case ".txt":
type = "word";
break;
case ".xls":
case ".xlsx":
type = "excel";
break;
case ".ppt":
case ".pptx":
type = "ppt";
break;
}
return type;
}
public static void main(String[] args) {
String inputPath = "E:\\下载\\pdf\\ppppppp.pptx";
String outputPath = "E:\\下载\\pdf\\pptToPdf.pdf";
String suffix = inputPath.substring(inputPath.lastIndexOf("."));
String type = getResourceTypesDocument(suffix);
if("word".equals(type)){
word3Pdf(inputPath,outputPath);
}else if("excel".equals(type)){
excel3pdf(inputPath,outputPath);
}else if("ppt".equals(type)){
ppt3pdf(inputPath,outputPath);
}
}
}