由于本人在做一个网上打印网站,遇到了一个需求是“准确读取word文件页数,从而实现计费功能”,通过很长时间的学习、查资料后,终于解决了这个问题,因此把方法写出来,方便有同样需求的人少走弯路。
首先需要感谢kookob博主的一篇博文(http://blog.csdn.net/kookob/article/details/45038563?locationNum=3&fps=1)对我帮助很大,但里面介绍的不够完善,故在此更加细化的讲解一下,希望对大家有所帮助。
一、本人已经实验过,使用poi方法、java2word方法、itext方法等,都不能很好的读取word文件的页数,大部分问题都是读取的不准确。因为这里涉及到金钱问题,所以必须准确,所以才有了本文。
二、本文思路是“pdf格式直接读取,word格式先转pdf再读取”,由于在word转pdf时需要一些时间,我们开发者如果单单用进度条,当word较大时,会造成转的太慢,所以我在我的网站(已上线)中,在用户“选择文件”后,后台开始转格式,此时不让用户看到,而去让用户做一些配置,比如打印的份数、是否双面打印等,用户设置完了,在最后的结算页面显示“正在读取格式”的进度条,然后再显示“正在计算金额”,这样用户体验会更好。
三、下面将一步步实现准确读取word页数:
3.1 准备工作:
3.1.1开发环境:windows。请务必在windows操作系统中进行本操作,因为word需要在服务器上转为pdf。
3.1.2 请在电脑上安装word,注意是安装word,不是安装wps。
3.1.3 请在电脑上安装word转pdf的插件:“软件名:SaveAsPDFandXPS”,下载地址:http://download.csdn.net/download/tiandixuanwuliang/10006993
3.1.4 请把系统需要调用的dll文件放置在java环境的jre的bin目录下,例如:E:\software\java\jre7\bin\jacob-1.18-x64.dll,(请注意自己电脑32位还是64位)下载地址:http://download.csdn.net/download/tiandixuanwuliang/10007003
3.1.5 java环境jdk1.7
3.2 word转pdf:
3.2.1新建java工程,把jacob.jar添加到工程中,此jar包在3.1.4节下载的文件夹里面有。
同时把jacob.jar文件拷贝一份放到C:/windows/system32下
如图:
3.2.2Word2PdfUtil.java代码如下:
package testJavaReadWordpage; import java.io.File;import java.io.IOException; import com.jacob.activeX.ActiveXComponent;import com.jacob.com.Dispatch; public class Word2PdfUtil { static final int wdDoNotSaveChanges = 0;// 不保存待定的更改。 static final int wdFormatPDF = 17;// word转PDF 格式 public static boolean word2pdf(String source, String target) { System.out.println("Word转PDF开始启动..."); long start = System.currentTimeMillis(); ActiveXComponent app = null; try { app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", false); Dispatch docs = app.getProperty("Documents").toDispatch(); System.out.println("打开文档:" + source); Dispatch doc = Dispatch.call(docs, "Open", source, false, true).toDispatch(); System.out.println("转换文档到PDF:" + target); File tofile = new File(target); if (tofile.exists()) { tofile.delete(); } Dispatch.call(doc, "SaveAs", target, wdFormatPDF); Dispatch.call(doc, "Close", false); long end = System.currentTimeMillis(); System.out.println("转换完成,用时:" + (end - start) + "ms"); return true; } catch (Exception e) { System.out.println("Word转PDF出错:" + e.getMessage()); return false; } finally { if (app != null) { app.invoke("Quit", wdDoNotSaveChanges); } } } }
注意:请在e盘下放一个test.doc的word文件,经过上面代码,转换成功显示如下:
3.3开始读取pdf:
3.3.1先请导入java读取pdf文件页码的jar,下载地址:http://download.csdn.net/download/tiandixuanwuliang/10007010
3.3.2代码如下:
package testJavaReadWordpage; import java.io.IOException; import com.itextpdf.text.pdf.PdfReader; public class GetPdfpage { public static int getPdfPage(String filepath){ int pagecount = 0; PdfReader reader; try { reader = new PdfReader("e:\\test1.pdf"); pagecount= reader.getNumberOfPages(); } catch (IOException e) { e.printStackTrace(); } System.out.println(pagecount); return pagecount; }}
注:读取成功如下:
3.4总结:利用java准确读取word页码,采用先把word转为pdf,再读取pdf页码的方式,经过测试,本方法得到的word页码准确率为100%
【项目工程】:http://download.csdn.net/download/tiandixuanwuliang/10007015
注:虽说代码看起来不难,但是本人也是研究了大半个月才找出了这个方法,其中下载了很多无用的资源,尝试了很多方法,故本文中有些工具、工程都设置了下载分数,也恳请大家理解,希望大家多多支持,本人将尽己所能写出更好的博文。
四、如果有错误,请看下面:
4.1如果报错:java.lang.UnsatisfiedLinkError: no jacob-1.14-x86 in java.library.path说明是jacob.dll文件错误,可能是位数错误,请把64位的换成32的;还有可能是jacob.dll放的位置有问题,具体请看:http://blog.csdn.net/li346985170/article/details/38365889
4.2如果报错:Unsupported major.minor version 51.0,是jdk版本错误,请用jdk1.7及以上,具体方法请看:https://jingyan.baidu.com/article/bea41d437363bdb4c51be6e3.html
4.3如果程序一直不能转成功,请检查,电脑是否安装了word,是否安装了转pdf的插件。另外,还可以,把jacod.all和jacod.jar两个文件在jre的bin、jdk的bin和C:\Windows\System32下到处放,但是要注意是32位还是64位(有时候调用可以有问题,本人对java底层不太熟悉,反正经过这些操作,就可以转pdf成功了)。
4.4如果报错:Could not initialize class com.jacob.activeX.ActiveXComponent请把jacob.jar文件拷贝到C:/windows/System32中
五、本人使用上述方法,成功准确地获取了word页码,本人能力有限错误地方,欢迎大家批评指正;或者大家有更好的办法,或者大家在操作过程中遇到任何问题,都欢迎在评论区留言。
本文链接:http://blog.csdn.net/tiandixuanwuliang/article/details/71298406
原网址: 访问
创建于: 2023-05-08 18:01:21
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论