当前位置: 首页 > 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.zskr.cn/news/181163.html

相关文章:

  • 2026北京财产执行律师事务所测评排行榜:权威解析靠谱机构,精准匹配专业解决方案 - 苏木2025
  • 2025年中频点焊机厂家专业推荐榜:铜点焊机/凸焊机/银触点点焊机优质供应商盘点 - 品牌推荐官
  • EasyGBS赋能城市街道可视化智能监管
  • 【AI×实时Linux:极速实战宝典】C++推理 - 基于 LibTorch(PyTorch C++)构建强实时的深度学习推理应用
  • 测试数据管理工具的选择策略
  • 【AI×实时Linux:极速实战宝典】零拷贝 - 利用 CUDA Unified Memory 与 Zero-Copy 技术消除 CPU-GPU 数据传输耗时
  • 2025年实验室通风家具源头厂家权威推荐榜单:实验室通风柜台/化学实验室通风柜/无菌实验室通风设备/实验室通风实验台/实验室通风台源头厂家精选 - 品牌推荐官
  • 【AI×实时Linux:极速实战宝典】文件系统 - 优化 Ext4 日志模式与 Tmpfs(内存盘)应用,消除 IO 操作对推理的阻塞
  • 基于python的可可成熟度动态评估模型设计毕设源码及需求
  • 一款 24bit 绝对角度 TMR 磁性编码器,KTM5900支持自校准
  • 计算机毕设开题报告/基于springboot同学录管理系统的设计与实现
  • CKEditor5粘贴Word公式转MathML的插件
  • 站群系统JAVA大文件分块上传的插件开发
  • 2025-2026江苏省自建房设计公司权威测评排行榜:核心推荐机构深度解析 - 苏木2025
  • Web编辑器自动处理Word图片转存CDN组件
  • 山西省自建房设计公司哪家强?2026年最新权威靠谱测评榜单抢先看 - 苏木2025
  • 嵌入式物联网毕设爆款项目学习推荐:小智AI桌宠机器狗_基于STM32F103+ESP32-S3的四足机器人(附开发教程/源码)
  • 修改vscode插件语法高亮
  • 【TextIn大模型加速器 + 火山引擎】在Coze平台快速搭建智能文档解析与合规审查Agent
  • 【收藏必备】大模型RAG系统架构全解:知识库三大核心层详解
  • 有关软件需求与分析的复习总结
  • 国密加密在JAVA大文件分块上传中的实现
  • 频谱分析仪与电压探头匹配指南
  • 本章节我们将讨论如何在 React 中使用表单
  • 湖北省仙桃市自建房设计靠谱机构评测排行榜:5星平台优势及客户评价 - 苏木2025
  • 堆垛机控制系统 FC12货叉清零功能块实现
  • 湖南省衡阳市自建房设计公司/机构权威测评推荐排行榜 - 苏木2025
  • 儿童去屑止痒洗发水哪个好?2025年权威实验室封神榜:这五款品牌止痒去屑双效合一 - 资讯焦点
  • 湖北省荆州市市自建房设计公司哪家强?2026年最新权威靠谱测评榜单抢先看 - 苏木2025
  • 一文读懂大数据分析与应用:核心概念、关键技术与实践框架