持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
先附上 demo 链接吧
最近项目里要用到不少word、pdf相关的操作,试了好几种方法,感觉还是aspose的好用,毕竟是……
这里是官网不同版本的 jar 包下载:downloads.aspose.com/pdf/java
我这次用的是 21.11 版本的
操作步骤:
-
- 先新建一个 maven 项目
-
- 在 src 同级目录下新建 lib 文件夹
-
- 将下载的 jar 拷贝到新建的 lib 文件夹下
-
- 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> -
- maven 中再引入 javassist ,这个是用于修改字节码文件的
<!-- https://mvnrepository.com/artifact/org.javassist/javassist --> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.27.0-GA</version> </dependency> -
- 在这个包下找到 License 这个类,具体包路径: com.aspose.pdf.License
-
- 在第140行这里,是对授权的校验
点进去这个 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
-
- 新建 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>
-
- 用解压缩软件打开下载的jar包,直接打开就行,不用解压
把刚生成的 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;
}
}
可以看到使用非常简单,短短两三行代码就能完成功能;
如果需要其它的详细的配置,可以看看官方文档