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

 更新时间:2022年06月08日 16:33:36   作者:洛阳泰山  
这篇文章主要为大家详细介绍了如何利用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已破解其核心验证方法,里面的签名可以随便填写,但是格式尽量保持一致,因为验证其他的格式方法还在!

运行成功截图

总结

经测试转换时间在几秒之内,样式没有错乱,只是当Excel的表格宽度,大于pdf的宽度时候,转换后部分内容后不显示。

到此这篇关于Java实现Excel文件转PDF(无水印无限制)的文章就介绍到这了,更多相关Java Excel转PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用拦截器获取请求的入参并将其转化为Java对象详解

    如何使用拦截器获取请求的入参并将其转化为Java对象详解

    这篇文章主要介绍了如何使用拦截器获取请求的入参并将其转化为Java对象的相关资料,文中介绍了两种实现的方法,并给出了详细的代码示例,需要的朋友可以参考下
    2025-02-02
  • Spring中的@ExceptionHandler异常拦截器

    Spring中的@ExceptionHandler异常拦截器

    这篇文章主要介绍了Spring中的@ExceptionHandler异常拦截器,Spring的@ExceptionHandler可以用来统一处理方法抛出的异常,给方法加上@ExceptionHandler注解,这个方法就会处理类中其他方法抛出的异常,需要的朋友可以参考下
    2024-01-01
  • 设置JavaScript自动提示-Eclipse/MyEclipse

    设置JavaScript自动提示-Eclipse/MyEclipse

    自动提示需要2个组件,分别是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以参考下
    2016-05-05
  • SpringBoot Redis实现接口幂等性校验方法详细讲解

    SpringBoot Redis实现接口幂等性校验方法详细讲解

    这篇文章主要介绍了SpringBoot Redis实现接口幂等性校验方法,近期一个老项目出现了接口幂等性校验问题,前端加了按钮置灰,依然被人拉着接口参数一顿输出,还是重复调用了接口,通过复制粘贴,完成了后端接口幂等性调用校验
    2022-11-11
  • Springboot如何使用filter对request body参数进行校验

    Springboot如何使用filter对request body参数进行校验

    这篇文章主要介绍了Springboot如何使用filter对request body参数进行校验,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Servlet实现简单的用户登录功能实例代码

    Servlet实现简单的用户登录功能实例代码

    这篇文章主要给大家介绍了关于利用Servlet实现简单的用户登录功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Object.wait()与Object.notify()的用法详细解析

    Object.wait()与Object.notify()的用法详细解析

    以下是对java中Object.wait()与Object.notify()的用法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • Java中的递增i++与++i的实现原理详解

    Java中的递增i++与++i的实现原理详解

    这篇文章主要介绍了Java中的i++与++i的实现原理详解,在Java中,i++是一种常见的递增操作符,用于将变量i的值增加1,它是一种简洁且方便的方式来实现循环和计数功能,i++可以用于各种情况,本文来看一下其实现原理,需要的朋友可以参考下
    2023-10-10
  • 如何基于Jenkins构建Jmeter项目

    如何基于Jenkins构建Jmeter项目

    这篇文章主要介绍了如何基于Jenkins构建Jmeter项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Spring Cloud入门系列服务提供者总结

    Spring Cloud入门系列服务提供者总结

    这篇文章主要介绍了Spring Cloud入门系列之服务提供者总结,服务提供者使用Eureka Client组件创建 ,创建完成以后修改某文件,具体操作方法及实例代码跟随小编一起看看吧
    2021-06-06

最新评论