使用aspose-pdf将pdf转word/pdf转html操作

2,675 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情


先附上 demo 链接吧


最近项目里要用到不少word、pdf相关的操作,试了好几种方法,感觉还是aspose的好用,毕竟是……

这里是官网不同版本的 jar 包下载:downloads.aspose.com/pdf/java

我这次用的是 21.11 版本的

操作步骤:

    1. 先新建一个 maven 项目
    1. src 同级目录下新建 lib 文件夹
    1. 将下载的 jar 拷贝到新建的 lib 文件夹下

image.png

    1. maven 中引用 lib 中的 jar 包(这种方法是引入本地jar包)
    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-pdf</artifactId>
        <version>21.11</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/aspose.pdf-21.11.jar</systemPath>
    </dependency>
    
    1. maven 中再引入 javassist ,这个是用于修改字节码文件的
    <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.27.0-GA</version>
    </dependency>
    
    1. 在这个包下找到 License 这个类,具体包路径: com.aspose.pdf.License

License类包.png

image.png

    1. 在第140行这里,是对授权的校验

li方法.png

点进去这个 lI() 方法,要替换的就是 lI() 这个方法里面的代码

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

import java.io.*;

public class Test {

    public static void modifyPDFJar() {
        try {
            //这一步是完整的jar包路径,选择自己解压的jar目录
            ClassPool.getDefault().insertClassPath("C:\Users\xxxx\Downloads\aspose.pdf-21.11-java\lib\aspose.pdf-21.11.jar");
            //获取指定的class文件对象
            CtClass zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.pdf.l9f");
            //从class对象中解析获取所有方法
            CtMethod[] methodA = zzZJJClass.getDeclaredMethods();
            for (CtMethod ctMethod : methodA) {
                //获取方法获取参数类型
                CtClass[] ps = ctMethod.getParameterTypes();
                //筛选同名方法,入参是Document
                if (ps.length == 1 && ctMethod.getName().equals("lI") && ps[0].getName().equals("java.io.InputStream")) {
                    System.out.println("ps[0].getName==" + ps[0].getName());
                    //替换指定方法的方法体
                    ctMethod.setBody("{this.l0if = com.aspose.pdf.l10if.lf;com.aspose.pdf.internal.imaging.internal.p71.Helper.help1();lI(this);}");
                }
            }
            //这一步就是将破译完的代码放在桌面上
            zzZJJClass.writeFile("C:\Users\xxxx\Desktop\");

        } catch (Exception e) {
            System.out.println("错误==" + e);
        }
    }

}

注意上面代码里的路径要改成自己的。

运行上面的代码,在桌面就会生成新的文件夹 com

    1. 新建 License.xml 文件
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>0123456789</Signature>
</License>
    1. 用解压缩软件打开下载的jar包,直接打开就行,不用解压

image.png

把刚生成的 com 文件夹直接拖进来替换;

把刚创建的 License.xml 文件拖进来 (我这里新建的 xml 文件取的是 com.aspose.pdf.lic 名称);名称随意;

到此就完成了。


下面是简单的使用, Demo 代码

需要先把刚刚替换完成的 jar 包放到项目 lib 目录下;原来的删了就行;

import com.aspose.pdf.Document;
import com.aspose.pdf.License;
import com.aspose.pdf.SaveFormat;
import java.io.FileOutputStream;
import java.io.InputStream;

public class Demo {

    public static void main(String[] args) {
        pdf2Doc();
        pdf2Html();
    }


    /**
     * pdf转word操作
     */
    public static void pdf2Doc() {
        checkLicense();
        String sourceFile = "C:\Users\username\Desktop\test\c1.pdf";
        String targetFile = "C:\Users\username\Desktop\test\c1.docx";
        try {
            long start = System.currentTimeMillis();
            FileOutputStream os = new FileOutputStream(targetFile);
            // 加载源文件数据
            com.aspose.pdf.Document doc = new com.aspose.pdf.Document(sourceFile);
            // 设置转换文件类型并转换
            doc.save(os, com.aspose.pdf.SaveFormat.DocX);
            os.close();
            long end = System.currentTimeMillis();
            System.out.println("pdf转word共耗时:" + ((end - start) / 1000.0) + "秒");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * pdf转html操作
     */
    public static void pdf2Html() {
        checkLicense();
        String sourceFile = "C:\Users\username\Desktop\test\c1.pdf";
        String targetFile = "C:\Users\username\Desktop\test\c1.html";
        long start = System.currentTimeMillis();
        Document pdfDocument = new Document(sourceFile);
        pdfDocument.save(targetFile, SaveFormat.Html);
        long end = System.currentTimeMillis();
        System.out.println("pdf转html共耗时:" + ((end - start) / 1000.0) + "秒");
    }


    /**
     * 检查License,不然会有水印
     *
     * @return 返回License是否有效
     */
    private static boolean checkLicense() {
        try {
            // lic.xml 是放在 jar 包根目录的,你也可以放在其它地方
            InputStream is = com.aspose.pdf.Document.class.getResourceAsStream("/com.aspose.pdf.lic.xml");
            if (is == null) {
                return false;
            }
            License asposeLicense = new License();
            asposeLicense.setLicense(is);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

可以看到使用非常简单,短短两三行代码就能完成功能;

如果需要其它的详细的配置,可以看看官方文档

Aspose PDF java版文档链接