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

docx4j

转载原文:https://blog.csdn.net/zhyh1986/article/details/8766131

 

 

docx4j介绍

官方网站:http://www.docx4java.org/trac/docx4j

下载地址:http://www.docx4java.org/downloads.html

入门指南:Getting Started guide(PDF)(HTML)

得益于天朝伟大的GFW,docx4j的官方站点有时可能需要挂代理才能访问。

官方介绍:

docx4j is a Java library for creating and manipulating Microsoft Open XML (Word docx, Powerpoint pptx, and Excel xlsx) files.
It is similar to Microsoft's OpenXML SDK, but for Java.
docx4j uses JAXB to create the in-memory object representation.
It is available under the Apache License (v2).
docx4j was created by Plutext Pty Ltd in 2008 - using OpenXML4J for the OPC piece. Plutext still drives the project, but since then docx4j has benefited from contributions from many individuals. The contributors are listed in docx4j's pom.xml.

docx4j能做什么
打开已存在docx(从文件系统、SMB/CIFS、使用VFS的WebDAV),pptx,xlsx
创建新的docx、pptx、xlsx
编程式地操作上面打开的文档(很显示)
docx4j特殊的功能支持:
模版替换;CustomXML绑定
生产/消费Word2007的xmlPackage(pkg)格式
作为docx保存docx到文件系统(zipped)或者保存到JCR(unzipped)
应用转换,包括常见过滤器
作为HTML或者PDF导出
比较文档、段落或者sdt(内容控件)之间的差异
字体支持(字体替换及使用任何文档中嵌入的字体)

具体的使用技巧请看前面提到的几篇博客以及docx4j的入门指南,这里仅列出几个自己了解而前面博客没有提到的使用技巧:合并docx文档和转换PDF。


合并多个docx文档

现在所做的项目中,需要合并多个docx文档,这让我纠结了很长一段时间;其实在docx4j的基础上,作者还提供了合并多个docx文档的lib,但那是需要商业授权的,所以没法使用,但后来在docx4j的forum中看到了其他人提供的解决方案,详情如下:

 

public InputStream mergeDocx(final List<InputStream> streams)throws Docx4JException, IOException {WordprocessingMLPackage target = null;final File generated = File.createTempFile("generated", ".docx");int chunkId = 0;Iterator<InputStream> it = streams.iterator();while (it.hasNext()) {InputStream is = it.next();if (is != null) {if (target == null) {// Copy first (master) documentOutputStream os = new FileOutputStream(generated);os.write(IOUtils.toByteArray(is));os.close();target = WordprocessingMLPackage.load(generated);} else {// Attach the others (Alternative input parts)
                insertDocx(target.getMainDocumentPart(),IOUtils.toByteArray(is), chunkId++);}}}if (target != null) {target.save(generated);return new FileInputStream(generated);} else {return null;}
}// 插入文档
private void insertDocx(MainDocumentPart main, byte[] bytes, int chunkId) {try {AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(new PartName("/part" + chunkId + ".docx"));afiPart.setContentType(new ContentType(CONTENT_TYPE));afiPart.setBinaryData(bytes);Relationship altChunkRel = main.addTargetPart(afiPart);CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk();chunk.setId(altChunkRel.getId());main.addObject(chunk);} catch (Exception e) {e.printStackTrace();}}

 

 

docx文档转换为PDF

在做docx转换PDF时让我为难了好长一阵子,因为中文导致乱码,官方示例中是有这一部分内容的,但由于注释太少,所以一直没有注意到,后来才发现示例的作者将字体相关的两句代码注释掉了:

//    Set up font mapper
//    Mapper fontMapper = new BestMatchingMapper();
//    wordMLPackage.setFontMapper(fontMapper);

 

在将这段代码加上之后,中文乱码没有了,但是好像除了“宋体”以外的其它字体还会乱码,比如:华文行楷、隶书之类的,要解决这些问题,需要多做点工作:

Mapper fontMapper = new IdentityPlusMapper();
fontMapper.getFontMappings().put("华文行楷", PhysicalFonts.getPhysicalFonts().get("STXingkai"));
// 其它中文字体
mlPackage.setFontMapper(fontMapper);// 然后再创建转换器
PdfConversion conversion = new Conversion(mlPackage);

 

完整方法代码:

/*** docx文档转换为PDF* @param docx docx文档* @param pdfPath PDF文档存储路径* @throws Exception 可能为Docx4JException, FileNotFoundException, IOException等*/
public void convertDocxToPDF(File docx, String pdfPath) throws Exception {OutputStream os = null;try {WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(docx);
//            Mapper fontMapper = new BestMatchingMapper();Mapper fontMapper = new IdentityPlusMapper();fontMapper.getFontMappings().put("华文行楷", PhysicalFonts.getPhysicalFonts().get("STXingkai"));fontMapper.getFontMappings().put("华文仿宋", PhysicalFonts.getPhysicalFonts().get("STFangsong"));fontMapper.getFontMappings().put("隶书", PhysicalFonts.getPhysicalFonts().get("LiSu"));mlPackage.setFontMapper(fontMapper);PdfConversion conversion = new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(mlPackage);os = new FileOutputStream(pdfPath);conversion.output(os, new PdfSettings());} finally {IOUtils.closeQuietly(os);}
}

 


另外,docx4j还支持通过iTtext将docx文档转换为PDF,不过好像只能支持iText2.X版本,新版本不能用!
其实这样转换好像还不够完美,比如页眉页脚、目录什么的,都会出乱子;由于项目中word文档较为复杂,最终没有采用docx4j做PDF转换,换成了jacob......

http://www.jsqmd.com/news/165657/

相关文章:

  • 程序员必看!这个被99%开发者忽略的AI核心组件,竟决定了你的RAG系统成败!小白也能从0到1掌握Embedding模型!
  • 2025年钻杆除锈机源头厂家权威推荐榜单:钢刷打磨除锈机/型钢除锈机/钢刷除锈机/钢刷内外除锈机/钢管外壁除锈机源头厂家精选 - 品牌推荐官
  • 从AI三大基石看EasyGBS:算法、算力、数据,用简单逻辑搞定智能化
  • 2026北京财产执行律师事务所测评排行榜:权威解析靠谱机构,精准匹配专业解决方案 - 苏木2025
  • 2025年绝缘陶瓷厂家权威榜单推荐:绝缘陶瓷管/氧化铝绝缘陶瓷支架/氧化铝绝缘陶瓷管/绝缘陶瓷继电器/绝缘陶瓷底座 /氧化铝绝缘陶瓷源头厂家精选 - 品牌推荐官
  • 零基础带你走进大模型的世界,揭秘ChatGPT背后的AI原理!
  • Windows Bitlocker
  • 2025年中频点焊机厂家专业推荐榜:铜点焊机/凸焊机/银触点点焊机优质供应商盘点 - 品牌推荐官
  • 高效计算欧拉函数(Rust语言实现详解)
  • 【AI×实时Linux:极速实战宝典】去Python化 - 为什么实时系统要慎用Python?GIL锁对确定性的影响分析
  • EasyGBS赋能城市街道可视化智能监管
  • 掌握Rust并发数据结构(从零开始构建线程安全的多线程应用)
  • 2025年上海appASO优化推广公司推荐榜:谷歌ASO优化推广/苹果ASO优化推广/安卓ASO优化推广/小程序ASO优化推广/应用市场ASO优化推广/小米商店ASO优化推广公司精选 - 品牌推荐官
  • 2025年北京红木家具回收公司推荐榜:北京众耀家具有限公司,上门红木家具回收/红木家具回收正规平台/二手红木家具回收/旧家具回收/黄花梨家具回收公司精选 - 品牌推荐官
  • 26-WASM介绍
  • 【AI×实时Linux:极速实战宝典】C++推理 - 基于 LibTorch(PyTorch C++)构建强实时的深度学习推理应用
  • 移动测试云平台优化:提升测试效率的实践指南‌
  • 2025年国产显微硬度计实力厂商盘点,涵盖品质与性价比及选购建议 - 品牌推荐大师1
  • 布谷鸟哈希详解(Python语言布谷鸟哈希实现教程)
  • HTTP是
  • 【AI×实时Linux:极速实战宝典】极致加速 - TensorRT C++ API集成实战:从ONNX解析到推理引擎构建
  • 请求与响应
  • 2025年锌铝镁电缆桥架厂家实力推荐榜单:槽式电缆桥架/模压电缆桥架/不锈钢电缆桥架/防火电缆桥架/铝合金电缆桥架/镀锌电缆桥架/光伏桥架优质供应商精选 - 品牌推荐官
  • 测试数据管理工具的选择策略
  • Rust语言BM算法实现(从零开始掌握Boyer-Moore字符串搜索算法)
  • 【AI×实时Linux:极速实战宝典】零拷贝 - 利用 CUDA Unified Memory 与 Zero-Copy 技术消除 CPU-GPU 数据传输耗时
  • 2025年实验室通风家具源头厂家权威推荐榜单:实验室通风柜台/化学实验室通风柜/无菌实验室通风设备/实验室通风实验台/实验室通风台源头厂家精选 - 品牌推荐官
  • 计算机毕业设计附项目源码帮做/社区医疗服务可视化系统设计与实现(毕设项目源码+论文)
  • 日志分析在测试调试中的核心价值
  • 2025金融AI市场舆情分析榜单:原圈科技如何做到风险预警