Java使用aspose实现pdf转word

Java使用aspose实现pdf转word

一、下载aspose-pdf-21.6.jar包【下载地址】,存放目录结构如图;配置pom.xml。
在这里插入图片描述

<!--pdf to word-->
<dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId><version>21.6</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/aspose-pdf-21.6.jar</systemPath>
</dependency>

二、创建PDFHelper.java类。运行代码同目录会出现docx文件。


import com.aspose.pdf.Document;
import com.aspose.pdf.SaveFormat;
import java.io.*;public class PDFHelper3 {public static void main(String[] args) throws IOException {pdf2doc("D://test.pdf");}/*** pdf转doc** @param pdfPath pdf 路径*/public static void pdf2doc(String pdfPath) {try {//新建一个word文档String wordPath = pdfPath.substring(0, pdfPath.lastIndexOf(".")) + ".docx";FileOutputStream os = new FileOutputStream(wordPath);//doc是将要被转化的word文档Document doc = new Document(pdfPath);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换doc.save(os, SaveFormat.DocX);os.close();//转化用时} catch (Exception e) {System.out.println("Pdf 转 Word 失败...");e.printStackTrace();}}
}

注意:如果aspose-pdf-21.6.jar是官网下载,转换的文件有水印。需要用下面代码运行破解,从新生成aspose-pdf-21.6.jar包引用。从我上面链接下载已经破解了。


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 PDFJarCrack {public static void main(String[] args) throws Exception {String jarPath = "D:\\aspose-pdf-21.6.jar";crack(jarPath);}private static void crack(String jarName) {try {ClassPool.getDefault().insertClassPath(jarName);CtClass ctClass = ClassPool.getDefault().getCtClass("com.aspose.pdf.ADocument");CtMethod[] declaredMethods = ctClass.getDeclaredMethods();int num = 0;for (int i = 0; i < declaredMethods.length; i++) {if (num == 2) {break;}CtMethod method = declaredMethods[i];CtClass[] ps = method.getParameterTypes();if (ps.length == 2&& method.getName().equals("lI")&& ps[0].getName().equals("com.aspose.pdf.ADocument")&& ps[1].getName().equals("int")) {// 最多只能转换4页 处理System.out.println(method.getReturnType());System.out.println(ps[1].getName());method.setBody("{return false;}");num = 1;}if (ps.length == 0 && method.getName().equals("lt")) {// 水印处理method.setBody("{return true;}");num = 2;}}File file = new File(jarName);ctClass.writeFile(file.getParent());disposeJar(jarName, file.getParent() + "/com/aspose/pdf/ADocument.class");} catch (NotFoundException e) {e.printStackTrace();} catch (CannotCompileException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private static void disposeJar(String jarName, String replaceFile) {List<String> deletes = new ArrayList<>();deletes.add("META-INF/37E3C32D.SF");deletes.add("META-INF/37E3C32D.RSA");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";//   File bakFile=new File(bakJarName);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 (entry.getName().equals("com/aspose/pdf/ADocument.class")) {JarEntry jarEntry = new JarEntry(entry.getName());jos.putNextEntry(jarEntry);FileInputStream fin = new FileInputStream(replaceFile);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();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

检索式知识库问答相关研究调研

基于信息检索的知识库问答存在以下问题 一、问题解析阶段 复杂问题解析 1.问题中包括多个实体&#xff1a;(i)使用卷积操作捕获每个词的上下文特征&#xff1b;(ii)使用大语言模型对问题进行凝练&#xff0c;保留关键信息&#xff1b;(iii)采用思维链的方式对问题进行分解&am…

Python基于Django的课堂投票系统的设计与实现【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

C++ Primer 数组

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

CPU的基本结构

基本结构 控制器&#xff08;Control Unit&#xff09;&#xff1a;负责控制&#xff0c;如指令计数器&#xff0c;指令跳转。 算术逻辑控制器&#xff08;Arithmetic/Logic Unit&#xff09;&#xff1a;负责计算&#xff0c;如算术运算加减&#xff0c;逻辑比较大小等。 南北…

git SourceTree 使用

Source Tree 使用原理 文件的状态 创建仓库和提交 验证 再克隆的时候发发现一个问题&#xff0c;就是有一个 这个验证&#xff0c;起始很简单 就是 gitee 的账号和密码&#xff0c;但是要搞清楚的是账号不是名称&#xff0c;我之前一直再使用名称登录老是出问题 这个很简单的…

BFS算法篇——广度优先搜索,探索未知的旅程(上)

文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索&#xff08;BFS&#xff09;是一种广泛应用于图论中的算法&#xff0c;常用于寻找最短路径、图的遍历等问题。与深度优先搜索&#xff08;DFS&…

hot100(9)

81.104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 后序遍历&#xff0c;从下往上&#xff0c;需要用到下面返回的结果。 public int maxDepth(TreeNode root) {if(root null){return 0;}int left maxDepth(root.left);int right maxDepth(root.right);re…

Elasticsearch:向量搜索的快速介绍

作者&#xff1a;来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性&#xff0c;以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜…

U9成品入库单有提示 组织+单号已经存在

2025年首个问题出来了&#xff01;也是U9上线以来首次碰到的问题。看到这样的提示&#xff0c;头皮发麻了。深感不妙。看过all.log之后&#xff0c;果然是重复行的问题&#xff01; 怎么会有重复行的错误发生呢&#xff1f;百思不得其解。 无奈之下&#xff0c;只能将单据类型…

为什么要设计DTO类/什么时候设置DTO类?

为什么设计DTO类&#xff1f; 例如&#xff1a;根据新增员工接口设计对应的DTO 前端传递参数列表&#xff1a; 思考&#xff1a;是否可以使用对应的实体类来接收呢&#xff1f; 注意&#xff1a;前端提交的数据和实体类中对应的属性差别比较大&#xff0c;所以自定义DTO类。 …

【C++篇】C++11新特性总结1

目录 1&#xff0c;C11的发展历史 2&#xff0c;列表初始化 2.1C98传统的{} 2.2&#xff0c;C11中的{} 2.3&#xff0c;C11中的std::initializer_list 3&#xff0c;右值引用和移动语义 3.1&#xff0c;左值和右值 3.2&#xff0c;左值引用和右值引用 3.3&#xff0c;…

大语言模型遇上自动驾驶:AsyncDriver如何巧妙解决推理瓶颈?

导读 这篇论文提出了AsyncDriver框架&#xff0c;致力于解决大语言模型在自动驾驶领域应用中的关键挑战。论文的主要创新点在于提出了大语言模型和实时规划器的异步推理机制&#xff0c;实现了在保持性能的同时显著降低计算开销。通过设计场景关联指令特征提取模块和自适应注入…

【iOS自动化】Xcode配置WebDriverAgent

WebDriverAgent 是 iOS 端自动化测试的工具&#xff0c;这里记录下 MacOS 环境 Xcode 如何配置 WebDriverAgent。 【重要】环境准备 ‼️ 注意&#xff1a;Xcode 版本需要支持对应的 iOS 版本&#xff0c;而 Xcode 版本又依赖 MacOS 版本&#xff1b;在开始部署前&#xff0c…

洛谷题目: P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 题解 (本题较简)

题目传送门&#xff1a; P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 这是一道关于概率和期望的动态规划问题&#xff0c;解题的核心思路是通过建立状态转移方程来计算甲壳虫从树根爬到树顶所需时间的期望值。题…

力扣题库第495题目解析

文章目录 1.题目再现2.思路分析&&示例说明2.1第一个示例2.2第二个示例 3.代码解释 1.题目再现 这个题目的名字叫做提莫攻击&#xff0c;如果是玩游戏的小伙伴对于这个场景就很熟悉了&#xff1b; 这个实际上是说&#xff1a;已知的条件会给我们一个数组&#xff0c;在…

leetcode刷题日记 1

https://leetcode.cn/problems/decode-ways/description/ 题目分析 分析了一下题目&#xff0c;我的第一想法&#xff1a;和之前的上楼梯问题很像 为什么这么说呢&#xff0c;感觉他们的值和他们之前元素都有千丝万缕的联系 就像上楼梯问题 就是我们的dp问题 怎么解释呢&a…

matlab simulink 汽车四分之一模型轮胎带阻尼

1、内容简介 略 matlab simulink121-汽车四分之一模型轮胎带阻尼 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

广度优先搜索(BFS)算法详解——以走迷宫问题为例

引言&#xff1a;当算法遇见迷宫 想象你置身于一个复杂的迷宫&#xff0c;如何在最短时间内找到出口&#xff1f;这个问题不仅存在于童话故事中&#xff0c;更是计算机科学中经典的路径搜索问题。本文将带你通过走迷宫问题&#xff0c;深入理解广度优先搜索&#xff08;BFS&am…

网工_以太网MAC层

2025.02.05&#xff1a;网工老姜学习笔记 第12节 以太网MAC层 2.1 MAC层的硬件地址2.2 MAC地址特殊位含义2.3 终端适配器&#xff08;网卡&#xff09;具有过滤功能2.4 MAC帧的格式2.4.1 DIX Ethernet V2标准&#xff08;先私有&#xff0c;后开放&#xff0c;用得比较多&#…

解锁高效 Web 开发新姿势:Open WebUI 安装指南

在 Web 开发的浩瀚宇宙里&#xff0c;找到一款强大又好用的框架&#xff0c;就如同拥有了超级外挂&#xff0c;能让开发效率直线飙升。 今天要给大家介绍的 Open WebUI&#xff0c;便是这样一款神器&#xff0c;它作为开源框架&#xff0c;助力开发者轻松搭建现代感十足、交互性…