Java实现Excel文件转PDF(无水印无限制)
作者:洛阳泰山 发布时间:2023-10-28 11:33:18
标签:Java,Excel,PDF
前言
java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也不能做出来非常好用,再说谁会不赚钱,花费一年事件去研究java如何实现excel转pdf的,于是我找到了Aspose公司出的aspose-cells的java的jar包来实现。之前写过一篇技术文章,不过后来觉得实现起来有些繁琐,因为aspose-cells没有商业授权,转换出来的pdf都会带文字和图片水印,且转换pdf的页数也会被受限制,之前的逻辑是自己用aspose-cells转换pdf后,又用apache-pdfbox去实现pdf的水印去除。这样不仅浪费了性能,还加长了处理时间。于是这个版想从aspose-cells入手,破除商业版的限制。教程如下。
一、jar破解
1.项目远程仓库配置
aspose-cells 这个需要配置单独的仓库地址才能下载,不会配置的可以去官网直接下载jar引入项目代码中。
<repositories>
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>https://repository.aspose.com/repo/</url>
</repository>
</repositories>
2.pom文件引入相关依赖
<!-- https://mvnrepository.com/artifact/com.aspose/aspose-cells -->
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-cells</artifactId>
<version>21.8</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
Javassist是一个开源的分析、编辑和创建Java字节码的类库。
3.代码破解
import javassist.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
public class ExcelJarCrack {
public static void main(String[] args) throws Exception {
String jarPath = "C:\\Users\\liuya\\Desktop\\jar\\aspose-cells-21.8.jar";
crack(jarPath);
}
private static void crack(String jarName) throws NotFoundException, CannotCompileException, IOException {
//这一步是完整的jar包路径
ClassPool.getDefault().insertClassPath(jarName);
CtClass LicenseClass = ClassPool.getDefault().getCtClass("com.aspose.cells.License");
CtMethod[] aMethods = LicenseClass.getDeclaredMethods("a");
for (CtMethod aMethod : aMethods) {
CtClass returnType=aMethod.getReturnType();
if(returnType.getName().equals("boolean")){
aMethod.setBody("{return true;}");
break;
}
}
//将文件名命名成备份文件
File file=new File(jarName);
LicenseClass.writeFile(file.getParent());
disposeJar(jarName);
}
private static void disposeJar(String jarName) {
List<String> deletes = new ArrayList<>();
deletes.add("META-INF/37E3C32D.SF");
deletes.add("META-INF/37E3C32D.RSA");
List<String> replaces = new ArrayList<>();
replaces.add("com/aspose/cells/License.class");
File oriFile = new File(jarName);
if (!oriFile.exists()) {
System.out.println("######Not Find File:" + jarName);
return;
}
//将文件名命名成备份文件
String bakJarName = jarName.substring(0, jarName.length() - 3) + "cracked.jar";
try {
//创建文件(根据备份文件并删除部分)
JarFile jarFile = new JarFile(jarName);
JarOutputStream jos = new JarOutputStream(new FileOutputStream(bakJarName));
Enumeration entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (!deletes.contains(entry.getName())) {
if(replaces.contains(entry.getName())){
System.out.println("Replace:-------" +entry.getName());
JarEntry jarEntry = new JarEntry(entry.getName());
jos.putNextEntry(jarEntry);
FileInputStream fin = new FileInputStream(oriFile.getParent()+ "/"+entry.getName());
byte[] bytes = readStream(fin);
jos.write(bytes, 0, bytes.length);
}else {
jos.putNextEntry(entry);
byte[] bytes = readStream(jarFile.getInputStream(entry));
jos.write(bytes, 0, bytes.length);
}
} else {
System.out.println("Delete:-------" + entry.getName());
}
}
jos.flush();
jos.close();
jarFile.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
private static byte[] readStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
return outSteam.toByteArray();
}
}
修改为你本机的aspose-cells-21.8.jar路径,然后运行主方法,破解成功后,会再同级文件夹下生成一个aspose-cells-21.8.cracked.jar包,用这个包替换原来的aspose-pdf-21.8.jar包即可。
二、Excel转PDF
1.代码实现
import com.aspose.cells.License;
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import java.io.FileOutputStream;
public class PdfUtils {
public static void main(String[] args) {
excelToPdf("C:\\Users\\liuya\\Desktop\\excel\\test.xlsx");
}
/**
* Excel文件转换
* @param excelPath 需要被转换的excel全路径带文件名
* @Return void
*/
public static void excelToPdf(String excelPath) {
License license = new License();
license.setLicense("C:\\Users\\liuya\\Desktop\\jar\\Aspose.License.xml");
long old = System.currentTimeMillis();
try {
//新建一个pdf文档
String pdfPath=excelPath.substring(0,excelPath.lastIndexOf("."))+".pdf";
//Excel文件数据
Workbook wb = new Workbook(excelPath);
FileOutputStream fileOS = new FileOutputStream(pdfPath);
//保存为pdf文件
wb.save(fileOS, SaveFormat.PDF);
fileOS.close();
//转化用时
long now = System.currentTimeMillis();
System.out.println("EXCEL 转 Pdf 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.Aspose.License.xml 授权文件
代码如下:
<License>
<Data>
<LicensedTo>Aspose Scotland Team</LicensedTo>
<EmailTo>billy.lundie@aspose.com</EmailTo>
<LicenseType>Developer OEM</LicenseType>
<LicenseNote>Limited to 1 developer, unlimited physical locations</LicenseNote>
<OrderID>140408052324</OrderID>
<UserID>94236</UserID>
<OEM>This is a redistributable license</OEM>
<Products>
<Product>Aspose.Total for Java</Product>
</Products>
<EditionType>Enterprise</EditionType>
<SerialNumber>9a59547c-41f0-428b-ba72-7c4368f151d7</SerialNumber>
<SubscriptionExpiry>20221231</SubscriptionExpiry>
<LicenseVersion>3.0</LicenseVersion>
<LicenseInstructions>http://www.aspose.com/corporate/purchase/license-instructions.aspx</LicenseInstructions>
</Data>
<Signature>FO3PHsblgDt8F59sMT1l1amyi9qk2V6E8dQkIP7LdTJSxDibNEFu1zOinQbqFfKv/ruttvcxoROkc1tUe0DtO6cP1Zf6J0VemgSY8i/LZECTGszRqJVQRZ0MoVnBhuPAJk5eli7fhVcF8hWd3E4XQ3LzfmJCuaj2NEteRi5Hrfg=</Signature>
</License>
因为jar已破解其核心验证方法,里面的签名可以随便填写,但是格式尽量保持一致,因为验证其他的格式方法还在!
运行成功截图
来源:https://blog.csdn.net/weixin_40986713/article/details/125183194


猜你喜欢
- 现公司架构大佬在项目中使用了 mybatis-generator-gui ,这是一款开源图形化 MyBatis 代码生成工具,使用起来相当的
- Android的主线程中执行长时间操作,导致界面无响应,会引起ANR。如果需要执行较长时间的操作,一般会在另一个线程处理,然后将数据转交给主
- Java中有哪些队列ArrayBlockingQueue 使用ReentrantLockLinkedBlockingQueue 使用Reen
- import java.util.ArrayList;import java.util.HashMap;import java.util.I
- 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;imp
- 前言现在市面上很多应用都会有当用户按返回键的时候提示用户:再按一次将退出应用的提示,也就是双击双击返回键退出应用,接下来我们就用几种办法来实
- 概述本篇文章主要讲解下Map家族中3个相对冷门的容器,分别是WeakHashMap、EnumMap、IdentityHashMap, 想必大
- 目录什么是Spring的占位符?Spring什么时候去解析并占位符什么是Spring的占位符?在以前的Spring Xml配置中我们可能会有
- 一. SpringBoot中实现Session共享1. 创建web项目我们按照之前的经验,创建一个web程序,并将之改造成Spring Bo
- 本文实例讲述了Android播放器MediaPlayer实现均衡器效果。分享给大家供大家参考,具体如下:这几天在系统学习Android官方A
- //创建excelobject missing = System.Reflection.Missing.Value;Excel.Applic
- Zuul作为网关服务,是其他各服务对外中转站,通过Zuul进行请求转发。这就涉及到部分数据是不能原封返回的,比如服务之间通信的凭证,用户的加
- 先来看看网易云APP的效果:前言关于网易云音乐推荐歌单界面的实现一、实现1.自定义一个圆角图片控件(也可直接使用第三方框架)由于是一些简单的
- Mybatis采用责任链模式,通过 * 组织多个 * (插件),通过这些 * 可以改变Mybatis的默认行为(诸如SQL重写之类的),由
- 背景SpringBoot bean 加载顺序如何查看,想看加载了哪些bean, 这些bean的加载顺序是什么?实际加载顺序不受控制,但会有一
- Java 字符串反转问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路
- 本文实例为大家分享了Unity3D实现攻击范围检测的具体代码,供大家参考,具体内容如下一、扇形攻击范围检测using UnityEngine
- 概述归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有
- 本文实例讲述了Android中资源文件用法。分享给大家供大家参考,具体如下:一、XML文件间资源文件的使用引用格式:attribute=&q
- monaco editor创建//创建和设置值if (!this.monacoEditor) { this.monacoEdit