软件编程
位置:首页>> 软件编程>> java编程>> Java实现Excel文件转PDF(无水印无限制)

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已破解其核心验证方法,里面的签名可以随便填写,但是格式尽量保持一致,因为验证其他的格式方法还在!

运行成功截图

Java实现Excel文件转PDF(无水印无限制)

Java实现Excel文件转PDF(无水印无限制)

来源:https://blog.csdn.net/weixin_40986713/article/details/125183194

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com