替换字图像占位符?(Replace a placeholder with image in word

2019-10-18 17:31发布

我需要使用Apache POI在Word文档中的图像来替换占位符。 我可以插入使用Apache POI在Word文档中的图片。 但我不知道如何与图像替换占位符。 任何人都可以请帮助呢?

我知道这将是容易的,如果我们做到这一点通过docx4j或其他一些API,允许我只使用了Apache POI。

Answer 1:

这是可以做到,但我相信你必须插入原始XML到目前完成它。 这个链接的问题“ Word文档中插入图片 ”具有的基本理念。 你可以只使用POI要求,不dom4j的库做到这一点。 如果你看一下源,增加了画面的XWPFRun方法它也试图加入生XML。 但是,如果您使用的方法写回磁盘时,它使您的文件不可读。 所以,你必须将图片添加到使用XWPFDocument水平的方法,该方法返回一个生成的ID为图片文件。 然后原始XML添加到在它该ID的运行,作为例子链接一样。
我们解决了这个问题的方法是不是有我们的用户插入一个占位符图像到他们的Word文档文件,而不是文本。 然后,我们:添加在文档级别要插入替换图像,查找包含使用图像作为标准的尺寸,然后获取和替换XML与换入新的图像的ID是运行中的占位符图像的运行方式。只要占位符和替换图像大小相同工作的。 如果需要更换后调整图像的大小,你可以以同样的方式操作XML大小值。 我喜欢我们的解决方案更好,因为它是在Word文档的XML格式,然后将自己的完整的XML为画面的变化不敏感。 干杯

    InputStream newImageIS = getImageForCorporation(corporationID);

    String relationID = run.getParagraph().getDocument().addPictureData(newImageIS, Document.PICTURE_TYPE_GIF);
    replaceRunImageData(run, relationID);

private void replaceRunImageData(XWPFRun run, String relationID) {
    CTGraphicalObjectData graph = run.getCTR().getDrawingArray(0).getInlineArray(0).getGraphic()
            .getGraphicData();

    String currentGraphicXML = graph.toString();

    String originalID = RegularExpressionUtil.capture("<a:blip r:embed=\"(\\w+)\"", currentGraphicXML);

    String newXML = StringUtils.replace(currentGraphicXML, originalID, relationID);

    try {
        graph.set(XmlToken.Factory.parse(newXML));
    } catch (XmlException e) {
        throw new RuntimeException(e);
    }

    replaced = true;
}

我们确定了图像的运行被搜索,以取代满足下列标准,嵌入式图片的每次运行的名单。 我们尝试使用图像作为标准的名称,但我们发现,如果占位符图像从一个Word文档复制到另一个Word文档不同的PC上,名字被丢失。

private boolean isRunForExistingImage(XWPFPicture pic) {
    if (pic == null || pic.getCTPicture() == null || pic.getCTPicture().getSpPr() == null
            || pic.getCTPicture().getSpPr().getXfrm() == null
            || pic.getCTPicture().getSpPr().getXfrm().getExt() == null) {
        return false;
    }

    long x = pic.getCTPicture().getSpPr().getXfrm().getExt().getCx();
    long y = pic.getCTPicture().getSpPr().getXfrm().getExt().getCy();

    return x == 2066925 && y == 590550;
}


文章来源: Replace a placeholder with image in word?