使用Docx4j向docx文档中指定书签位置插入图片
2017-06-12 15:55
357 查看
import org.apache.commons.io.IOUtils; import org.docx4j.TraversalUtil; import org.docx4j.dml.wordprocessingDrawing.Inline; import org.docx4j.finders.RangeFinder; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.wml.*; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; public class Main { public static void main(String[] args) { // 模板文件路径 String templatePath = "D:\\Projects\\lib\\generateDocx\\demo.docx"; // 生成的文件路径 String targetPath = "D:\\Projects\\lib\\generateDocx\\target.docx"; // 书签名 String bookmarkName = "sq2"; // 图片路径 String imagePath = "D:\\Projects\\lib\\generateDocx\\1.jpg"; try { // 载入模板文件 WordprocessingMLPackage wPackage = WordprocessingMLPackage.load(new FileInputStream(templatePath)); // 提取正文 MainDocumentPart mainDocumentPart = wPackage.getMainDocumentPart(); Document wmlDoc = (Document) mainDocumentPart.getJaxbElement(); Body body = wmlDoc.getBody(); // 提取正文中所有段落 List<Object> paragraphs = body.getContent(); // 提取书签并创建书签的游标 RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange"); new TraversalUtil(paragraphs, rt); // 遍历书签 for (CTBookmark bm : rt.getStarts()) { // 这儿可以对单个书签进行操作,也可以用一个map对所有的书签进行处理 if (bm.getName().equals(bookmarkName)) { // 读入图片并转化为字节数组,因为docx4j只能字节数组的方式插入图片 InputStream is = new FileInputStream(imagePath); byte[] bytes = IOUtils.toByteArray(is); // 穿件一个行内图片 BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wPackage, bytes); // createImageInline函数的前四个参数我都没有找到具体啥意思,,,, // 最有一个是限制图片的宽度,缩放的依据 Inline inline = imagePart.createImageInline(null, null, 0, 1, false, 800); // 获取该书签的父级段落 P p = (P) (bm.getParent()); ObjectFactory factory = new ObjectFactory(); // R对象是匿名的复杂类型,然而我并不知道具体啥意思,估计这个要好好去看看ooxml才知道 R run = factory.createR(); // drawing理解为画布? Drawing drawing = factory.createDrawing(); drawing.getAnchorOrInline().add(inline); run.getContent().add(drawing); p.getContent().add(run); } } wPackage.save(new FileOutputStream(targetPath)); } catch (Exception e) { e.printStackTrace(); } } }
需要的jar包:
找的也是欲仙欲死,我已打包在上传CSDN:点击打开链接
相关文章推荐
- C# 操作word 指定书签位置插入图片并设置图片大小和位置
- Java 替换word文档文字并指定位置插入图片
- 黄聪:C# web word文档操作,任意指定位置插入图片,表格简单操作
- java2Word在Word文档指定位置插入图片或者文字
- 在word里指定书签的位置插入图片
- 黄聪:C# web word文档操作,任意指定位置插入图片,表格简单操作
- C# 在word文档指定位置插入图片
- java2Word在Word文档指定位置插入图片或者文字
- 使用dom4j向xml任意指定位置插入节点
- 操作Word对象----在指定位置插入图片并设置大小(原)
- 在页面的指定位置插入文本——jise使用指南
- 使用sed在一个文件中指定位置插入另外一个文件的内容-r命令的使用
- C# asp.net Word中使用书签插入图片导出
- 使用jQuery创建节点、将节点插入到指定的位置
- 操作Word对象----在指定位置插入图片并设置大小(原)
- AE导出图片并插入到word文档中某一固定位置
- 使用docx4j编程式地创建复杂的Word(.docx)文档
- c#操作word 在指定书签插入文字或者图片
- 如何使用C#在Word文档中插入图片以及读取Word文档中的图片?
- 使用ASPOSE.WORD组件,在word文档指定的位置动态生成表格,支持单元格合并及背景填充