为什么用docx4j在文档标签处插入一个图片,永远在最后一行????

坚默不语hj 发布于 2018/08/30 12:06
阅读 478
收藏 0

MySQL连接为什么挂死了?别踩坑!>>>

这是代码:

public class InsertPicture {
    private static String templatePath="C:/Users/huangjian/Desktop/test/test.docx";    
    private static String targetPath="C:/Users/huangjian/Desktop/test/new/new.docx";
    private static String bookmarkName="hhhs";
    private static String imagePath="C:/Users/huangjian/Desktop/test/1.png";
    @SuppressWarnings("deprecation")
    public static void insertPicture(String templatePath, String targetPath, String bookmarkName, String imagePath) throws Exception {

        // 载入模板文件
        WordprocessingMLPackage wPackage = WordprocessingMLPackage.load(new FileInputStream(templatePath));
        // 提取正文
        MainDocumentPart mainDocumentPart = wPackage.getMainDocumentPart();
        org.docx4j.wml.Document wmlDoc = mainDocumentPart.getJaxbElement();
        Body body = ((org.docx4j.wml.Document) 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));
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try {
            insertPicture(templatePath, targetPath, bookmarkName, imagePath);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("success" );
    }
}

 

这是效果:胖虎每次都在文档的结尾处,显然是不对的,是代码有问题吗???

加载中
返回顶部
顶部