wold,excel,ppt转pdf(Aspose 实现方式)

目录

1. jar包获取及处理

1.1 .获取Aspose所需jar包

1.2  修改jar包代码

1.3 创建破解类

2. 编写转换工具类


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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值