当前位置: 首页 > article >正文

别再手动数了!用Apache POI和iText,5行代码搞定Java批量统计文档页数

5行代码实现Java批量文档页数统计Apache POI与iText的高效实践当你在整理年度报告、审计文档或准备印刷材料时是否曾被成百上千份文档的页数统计折磨得焦头烂额手动打开每个文件查看页数不仅效率低下还容易出错。今天我将分享一个基于Java的轻量级解决方案只需5行核心代码就能自动扫描整个文件夹统计所有Word、PPT和PDF文档的页数。1. 环境准备与依赖配置在开始之前我们需要确保开发环境已经配置好必要的依赖库。Apache POI和iText是处理Office文档和PDF的两大Java利器它们能够帮助我们轻松获取各种文档的页数信息。创建一个新的Maven项目在pom.xml中添加以下依赖dependencies !-- 处理PDF文档 -- dependency groupIdcom.itextpdf/groupId artifactIditextpdf/artifactId version5.5.13.3/version /dependency !-- 处理Office文档 -- dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version5.2.3/version /dependency dependency groupIdorg.apache.poi/groupId artifactIdpoi-ooxml/artifactId version5.2.3/version /dependency dependency groupIdorg.apache.poi/groupId artifactIdpoi-scratchpad/artifactId version5.2.3/version /dependency /dependencies提示选择较新的稳定版本可以避免一些已知的兼容性问题同时获得更好的性能表现。2. 核心工具类设计我们将创建一个高度封装的工具类DocumentPageCounter它能够处理各种格式的文档页数统计。这个类的设计目标是简洁易用同时具备良好的扩展性。import org.apache.poi.hslf.usermodel.*; import org.apache.poi.xslf.usermodel.*; import org.apache.poi.xwpf.usermodel.*; import org.apache.poi.hwpf.extractor.*; import com.itextpdf.text.pdf.*; import java.io.*; import java.nio.file.*; import java.util.*; import java.util.zip.ZipFile; public class DocumentPageCounter { public static int getPageCount(File file) throws Exception { String name file.getName().toLowerCase(); if (name.endsWith(.pdf)) return new PdfReader(file.getPath()).getNumberOfPages(); if (name.endsWith(.docx)) return new XWPFDocument(new FileInputStream(file)).getProperties().getExtendedProperties().getUnderlyingProperties().getPages(); if (name.endsWith(.doc)) return new WordExtractor(new FileInputStream(file)).getSummaryInformation().getPageCount(); if (name.endsWith(.pptx)) return new XMLSlideShow(new FileInputStream(file)).getSlides().size(); if (name.endsWith(.ppt)) return new HSLFSlideShow(new FileInputStream(file)).getSlides().size(); throw new UnsupportedOperationException(Unsupported file type: name); } }这个工具类的核心优势在于简洁性每个文件类型的处理仅需一行代码扩展性可以轻松添加对其他文件格式的支持易用性通过统一的接口getPageCount处理所有文档类型3. 批量处理文件夹的实现有了核心工具类我们现在可以实现批量处理整个文件夹的功能。以下是一个完整的命令行工具实现import java.io.File; import java.util.Arrays; import java.util.Comparator; import java.util.stream.Collectors; public class BatchPageCounter { public static void main(String[] args) throws Exception { if (args.length 0) { System.out.println(Usage: java BatchPageCounter directory); return; } File dir new File(args[0]); if (!dir.isDirectory()) { System.out.println(Error: args[0] is not a directory); return; } Arrays.stream(dir.listFiles()) .filter(f - f.getName().matches(.*\\.(pdf|docx?|pptx?)$)) .sorted(Comparator.comparing(File::getName)) .forEach(f - { try { System.out.printf(%-40s %4d页%n, f.getName(), DocumentPageCounter.getPageCount(f)); } catch (Exception e) { System.out.printf(%-40s 解析失败: %s%n, f.getName(), e.getMessage()); } }); } }这个批量处理程序的特点包括支持命令行参数可以直接指定要扫描的文件夹路径智能过滤只处理PDF、Word和PPT文件排序输出按文件名排序便于查看错误处理对无法解析的文件会给出友好提示4. 性能优化与异常处理在实际应用中我们还需要考虑性能和稳定性问题。以下是几个关键的优化点4.1 内存管理优化处理大型文档时内存消耗可能成为问题。我们可以通过以下方式优化// PDF内存优化示例 PdfReader reader new PdfReader(new RandomAccessFile(file, r).getChannel()); int pages reader.getNumberOfPages(); reader.close(); // PPTX内存优化示例 ZipSecureFile.setMinInflateRatio(0.001); // 降低解压内存需求 XMLSlideShow ppt new XMLSlideShow(new FileInputStream(file)); int slides ppt.getSlides().size(); ppt.close();4.2 并发处理加速对于包含大量文件的文件夹可以使用并行流加速处理Arrays.stream(dir.listFiles()) .parallel() // 启用并行处理 .filter(f - f.getName().matches(.*\\.(pdf|docx?|pptx?)$)) .sorted(Comparator.comparing(File::getName)) .forEach(f - { /* 处理逻辑 */ });4.3 常见异常处理在实际应用中我们可能会遇到各种异常情况需要妥善处理异常类型可能原因解决方案IOException文件损坏或权限问题跳过该文件并记录错误OutOfMemoryError文档过大增加JVM内存或使用流式处理UnsupportedOperationException不支持的格式提前过滤文件类型NullPointerException文档元数据缺失使用备选方法获取页数5. 扩展应用场景这个工具不仅限于简单的页数统计还可以扩展应用到更多实际场景中5.1 文档管理系统集成将页数统计功能集成到文档管理系统中可以自动记录每个文档的页数信息public class DocumentInfo { private String name; private int pages; private long size; private Date lastModified; // 构造函数、getter和setter省略 public static DocumentInfo fromFile(File file) throws Exception { DocumentInfo info new DocumentInfo(); info.setName(file.getName()); info.setPages(DocumentPageCounter.getPageCount(file)); info.setSize(file.length()); info.setLastModified(new Date(file.lastModified())); return info; } }5.2 批量打印成本计算结合页数统计可以自动计算批量打印的成本public class PrintingCostCalculator { private static final double COST_PER_PAGE 0.5; // 每页打印成本 public static double calculate(File dir) throws Exception { return Arrays.stream(dir.listFiles()) .filter(f - f.getName().matches(.*\\.(pdf|docx?|pptx?)$)) .mapToDouble(f - { try { return DocumentPageCounter.getPageCount(f) * COST_PER_PAGE; } catch (Exception e) { return 0; } }) .sum(); } }5.3 文档质量分析通过分析文档页数分布可以发现潜在的问题public class DocumentAnalyzer { public static void analyze(File dir) throws Exception { IntSummaryStatistics stats Arrays.stream(dir.listFiles()) .filter(f - f.getName().matches(.*\\.(pdf|docx?|pptx?)$)) .mapToInt(f - { try { return DocumentPageCounter.getPageCount(f); } catch (Exception e) { return 0; } }) .summaryStatistics(); System.out.println(文档页数分析:); System.out.println(总文档数: stats.getCount()); System.out.println(总页数: stats.getSum()); System.out.println(平均页数: stats.getAverage()); System.out.println(最多页数: stats.getMax()); System.out.println(最少页数: stats.getMin()); } }在实际项目中我发现对于特别大的文件夹包含数千个文档将结果输出到CSV文件比直接打印到控制台更实用。可以使用OpenCSV等库轻松实现import com.opencsv.CSVWriter; // ... try (CSVWriter writer new CSVWriter(new FileWriter(result.csv))) { writer.writeNext(new String[]{文件名, 页数, 大小(KB), 修改日期}); Arrays.stream(dir.listFiles()) .filter(f - f.getName().matches(.*\\.(pdf|docx?|pptx?)$)) .forEach(f - { try { writer.writeNext(new String[]{ f.getName(), String.valueOf(DocumentPageCounter.getPageCount(f)), String.valueOf(f.length() / 1024), new Date(f.lastModified()).toString() }); } catch (Exception e) { writer.writeNext(new String[]{f.getName(), ERROR, , }); } }); }

相关文章:

别再手动数了!用Apache POI和iText,5行代码搞定Java批量统计文档页数

5行代码实现Java批量文档页数统计:Apache POI与iText的高效实践 当你在整理年度报告、审计文档或准备印刷材料时,是否曾被成百上千份文档的页数统计折磨得焦头烂额?手动打开每个文件查看页数不仅效率低下,还容易出错。今天&#x…...

广告防欺诈与广告验证:住宅代理如何帮助监测点击欺诈

广告欺诈正在持续侵蚀企业的广告预算,并导致数据分析结果失真。常见形式包括点击欺诈、虚假流量以及域名伪造,这些问题使广告主难以准确评估真实投放效果。在实际业务中,如何获取“接近真实用户视角”的广告数据,成为广告验证的关…...

Qwerty Learner设计系统构建:组件库与样式指南终极指南

Qwerty Learner设计系统构建:组件库与样式指南终极指南 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https://gi…...

Mathtype公式识别:Magma多模态AI在教育领域的应用

Mathtype公式识别:Magma多模态AI在教育领域的应用 1. 引言 作为一名长期关注AI技术发展的从业者,我最近在测试微软开源的Magma多模态模型时,发现了一个特别有意思的应用场景——数学公式识别与处理。想象一下这样的场景:老师批改…...

Scream:构建网络音频共享的虚拟声卡解决方案

Scream:构建网络音频共享的虚拟声卡解决方案 【免费下载链接】scream Virtual network sound card for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/sc/scream 一、核心价值:突破物理限制的音频传输革命 在数字化办公与家庭娱乐…...

Youtu-Parsing模型C盘空间优化部署:清理与迁移实战指南

Youtu-Parsing模型C盘空间优化部署:清理与迁移实战指南 你是不是也遇到过这种情况?兴致勃勃地在Windows电脑上部署Youtu-Parsing这类大模型,准备大干一场,结果没跑几天,C盘就亮起了刺眼的红色警告。系统盘空间告急&am…...

北斗高精度数据解算:破解城市峡谷/长基线/无网区难题,从毫米级定位到自动化交付——(GAMIT/GLOBK底层核心解算技术方法)

北斗三号全面应用已至深水区,一线甲级测绘单位与科研院所正面临三重实战拷问:城市峡谷多路径干扰下如何实现毫米级收敛?西部高海拔无网区如何依托离线精密轨道完成长基线高精度解算?国家重大工程"零误差"标准下&#xf…...

美胸-年美-造相Z-Turbo与Anaconda环境配置指南

美胸-年美-造相Z-Turbo与Anaconda环境配置指南 如果你对AI绘画感兴趣,最近肯定听说过“美胸-年美-造相Z-Turbo”这个模型。它生成的人像图片质量确实不错,特别是那种半写实、带点东方韵味的风格,很受大家喜欢。 但很多朋友在第一步就卡住了…...

Qwen3.5-4B模型在嵌入式系统日志智能分析中的实践

Qwen3.5-4B模型在嵌入式系统日志智能分析中的实践 1. 嵌入式日志分析的痛点与机遇 在物联网网关、工业控制器等嵌入式设备运行过程中,系统日志就像设备的"健康日记",记录着每一次心跳、每一次异常。传统运维人员需要像"破译密码"一…...

全知视角与隐私边界的冲突

当测试工程师扮演“上帝视角”时,数据采集的伦理红线成为首要挑战。金融软件测试中,为复现键盘劫持漏洞需记录用户输入轨迹;医疗系统验证需模拟真实患者数据流。这种全知能力却暗藏致命陷阱——某电商平台测试环境因未彻底脱敏,导…...

毕业设计实战:基于SpringBoot的饮食分享平台设计与实现全攻略

毕业设计实战:基于SpringBoot的饮食分享平台设计与实现全攻略 在开发“饮食分享平台”这套毕设时,我曾因“菜谱信息与趣味答题数据脱节”踩过一个关键坑。初期设计时,我将“菜谱推荐”和“趣味答题”视为两个独立模块,导致用户在浏…...

2026年中国企业AI应用场景报告

当多模态技术突破模态壁垒,当超级智能体成为业务重构的核心执行者,AI 正从实验室走向产业深水区,成为企业降本增效、创新增长的关键引擎。但与此同时,“AI 应用停留在工具层面”“落地效果不及预期”“行业场景适配难” 等痛点&am…...

抖音下载器技术解析:突破平台限制的高效内容获取方案

抖音下载器技术解析:突破平台限制的高效内容获取方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

基于LSTM与SmolVLA的时序多模态数据分析

基于LSTM与SmolVLA的时序多模态数据分析 想象一下,你面前有一段监控视频,画面里有人正在行走、停留、再行走。如果只看其中一帧,你只能知道“这里有个人”;但如果把连续几帧连起来看,你就能判断出“这个人正在从A点走…...

GeoServer REST API实战:手把手教你用Python封装自己的批量发布工具

GeoServer REST API深度封装:Python自动化发布框架设计与实战 1. 为什么需要自定义GeoServer发布工具? 在GIS项目实施过程中,我们经常面临数百个地理数据文件需要快速发布的场景。传统手动操作不仅效率低下(单个文件平均耗时2分钟…...

终极指南:如何用Scream实现Windows音频网络共享

终极指南:如何用Scream实现Windows音频网络共享 【免费下载链接】scream Virtual network sound card for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/sc/scream 想要将Windows电脑的音频无线传输到其他设备?厌倦了复杂的音频线…...

闽北哥-一个人最顶级的能力:复归于朴

一个人最顶级的能力 ——复归于朴**“道家说‘复归于朴’, 儒家说‘赤子之心’, 佛家说‘本自具足’, 鬼谷子说‘知世故而不世故’—— 他们都指向同一种状态: 在红尘中,活出婴儿般的清澈。”🌿 这不是天真…...

万象视界灵坛实战教程:构建小红书爆款笔记封面图‘高点击率特征’预测模型

万象视界灵坛实战教程:构建小红书爆款笔记封面图高点击率特征预测模型 1. 项目背景与价值 在内容创作领域,封面图的质量直接影响用户点击率。小红书平台数据显示,优质封面图能带来300%以上的点击率提升。然而,传统封面设计依赖人…...

ROS Melodic/Noetic下,为Jetson Xavier NX源码编译Realsense-ROS 2.3.1与SDK 2.48.0的完整流程

ROS Melodic/Noetic下为Jetson Xavier NX源码编译Realsense-ROS 2.3.1与SDK 2.48.0的完整指南 在机器人视觉领域,Intel RealSense深度相机凭借其出色的性能与稳定性成为众多开发者的首选。然而,当我们将目光投向Jetson Xavier NX这样的边缘计算平台时&am…...

CnOpenData 中国全部银行对外投资信息数据

银行是经营货币和信用业务的金融机构,通过发行信用货币、管理货币流通、调剂资金供求、办理货币存贷与结算,是商品货币经济发展到一定阶段的产物。自改革开放以来,我国的商品经济愈发活跃,银行业的规模发展十分迅速。但在如今利率…...

计算机毕业设计:汽车销售数据采集分析系统 Flask框架 requests爬虫 可视化 数据分析 大数据 机器学习 大模型(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

机械键盘连击终极解决方案:Keyboard Chatter Blocker全方位技术解析

机械键盘连击终极解决方案:Keyboard Chatter Blocker全方位技术解析 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker Keyboar…...

终极指南:STL到STEP格式转换神器stltostp使用教程

终极指南:STL到STEP格式转换神器stltostp使用教程 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在3D设计和工程制造领域,格式转换是连接创意与生产的关键桥梁。今天我…...

基于AkShare构建A股基础数据自动化采集方案

1. 为什么需要自动化采集A股基础数据 做量化研究的朋友都知道,获取准确、完整的股票基础数据是策略开发的基石。我刚开始做量化时,最头疼的就是每次跑策略前都要手动更新股票列表,经常因为数据不全导致回测结果失真。后来发现AkShare这个宝藏…...

“吸收液中间冷却与调整填料高度组合应用” — aspenplusv11百万吨碳捕集系统的关键优化策略

aspenplusv11百万吨碳捕集系统,复配胺溶液,工艺流程优化,吸收液中间冷却、调整吸收段填料高度、贫液入塔分流等。 吸收液中间冷却与调整填料高度组合应用凌晨三点的实验室,咖啡杯底结着褐色的垢。盯着Aspen Plus界面里那个持续报警…...

Gemma-3-12B-IT WebUI保姆级教程:多模型切换与Gemma-3-27B对比体验

Gemma-3-12B-IT WebUI保姆级教程:多模型切换与Gemma-3-27B对比体验 1. 开篇:为什么你需要一个更聪明的AI助手? 想象一下,你手头有一个能写代码、能解答技术难题、还能陪你聊天的AI助手。它运行在你自己的服务器上,数…...

UI-TARS-desktop快速上手:10分钟完成Qwen3-4B多模态Agent桌面版部署与任务验证

UI-TARS-desktop快速上手:10分钟完成Qwen3-4B多模态Agent桌面版部署与任务验证 想体验一个能看懂屏幕、操作软件、帮你完成任务的AI助手吗?今天要介绍的UI-TARS-desktop,就是一个内置了强大视觉理解能力的多模态AI Agent桌面应用。它基于Qwe…...

Ubuntu系统优化下的LiuJuan20260223Zimage高性能部署

Ubuntu系统优化下的LiuJuan20260223Zimage高性能部署 本文基于Ubuntu 22.04 LTS系统测试,适用于NVIDIA GPU环境 1. 环境准备与系统优化 在开始部署LiuJuan20260223Zimage之前,我们先对Ubuntu系统进行一些基础优化,这些调整能让后续的模型运行…...

Streamlit像素UI深度优化教程:解决Ostrakon-VL终端文字遮挡问题

Streamlit像素UI深度优化教程:解决Ostrakon-VL终端文字遮挡问题 1. 项目背景与问题分析 在开发Ostrakon-VL零售扫描终端时,我们选择了一种独特的像素艺术风格UI设计。这种高饱和度的8-bit复古游戏美学虽然提升了用户体验的趣味性,但也带来了…...

别再手动调了!用Visio这个隐藏的字体设置窗口,一键切换泳道图标题横竖排

Visio高效技巧:解锁泳道图标题排版的隐藏技能 每次在Visio中调整泳道图标题方向时,你是否还在反复右键点击、寻找格式选项?其实Visio内置了一个被多数用户忽略的高效设置窗口——"字体"对话框。这个看似普通的设置面板,…...