将占位符替换为单词中的图像



我需要使用 Apache POI 将占位符替换为 Word 文档中的图像。我能够使用 Apache poi 在 word 文档中插入图片。但是我不知道如何用图像替换占位符。任何人都可以帮忙吗?

我知道如果我们通过docx4j或其他一些API来做到这一点会很容易,我只能使用Apache poi。

它可以完成,但我相信您当前必须插入原始 XML 才能完成它。 这个链接的问题"在word文档中插入图片"具有基本思想。 您可以仅使用 POI 所需的库来执行此操作,而不是 dom4j。 如果您查看 XWPFRun 上添加图片的方法的源代码,它也在尝试添加原始 XML。 但是,如果您使用该方法,则在写回磁盘时会使您的文档不可读。 因此,您必须使用 XWPFDocument 级别方法将图片添加到文档中,该方法返回图片的生成 ID。 然后将原始 XML 添加到包含该 ID 的运行中,如示例链接所示。
我们解决问题的方法是让用户将占位符图像插入到他们的 Word 文档文件中,而不是文本中。 然后,我们:添加要在文档级别插入的替换图像,使用图像大小作为条件查找包含占位符图像的运行,然后获取该运行的 XML 并将其替换为交换的新图像的 ID。 只要占位符和替换图像的大小相同,就可以了。 如果需要在替换后调整图像的大小,则可以以相同的方式操作 XML 大小值。 我更喜欢我们的解决方案,因为它不太容易受到 Word doc 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 文档,则该名称将丢失。

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;
}

最新更新