我需要使用Apache POI在word文檔中用圖像替換佔位符。我能夠使用Apache poi將圖片插入word文檔中。但我不知道如何用圖像替換佔位符。任何人都可以請幫忙嗎?用word中的圖像替換佔位符?
我知道這很容易,如果我們通過docx4j或其他API來做到這一點,我只允許使用Apache poi。
我需要使用Apache POI在word文檔中用圖像替換佔位符。我能夠使用Apache poi將圖片插入word文檔中。但我不知道如何用圖像替換佔位符。任何人都可以請幫忙嗎?用word中的圖像替換佔位符?
我知道這很容易,如果我們通過docx4j或其他API來做到這一點,我只允許使用Apache poi。
它可以完成,但我相信你必須插入原始XML來完成它目前。這個鏈接的問題「Insert picture in word document」有基本的想法。你可以只使用POI需要的庫,而不是dom4j。如果您查看添加圖片的XWPFRun上的方法源,它也嘗試添加原始XML。但是,如果您使用該方法,則會在寫回到磁盤時使您的文檔不可讀。因此,您必須使用XWPFDocument級別方法將圖片添加到文檔,該方法會爲圖片返回生成的ID。然後將原始XML添加到具有該ID的運行中,如示例鏈接所示。
我們解決問題的方式是讓我們的用戶在其Word文檔文件中插入佔位符圖像而不是文本。然後,我們:添加要在文檔級別插入的替換圖像,使用圖像大小作爲條件查找包含佔位符圖像的運行,然後獲取並替換用於交換新圖像ID的XML運行。只要佔位符和替換圖像的尺寸相同即可。如果需要在更換後調整圖像的大小,則可以用相同的方式操作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文檔複製到另一臺PC上的另一個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;
}
如果您可以毫無問題地添加圖片,爲什麼不能在佔位符處添加它,然後刪除佔位符文本? – Gagravarr
感謝您的回覆,我正在嘗試您所說的話。 – user2724215
我能夠追加圖像,但我無法插入。我正在使用CustomXWPFDocument添加圖像。任何人都可以告訴如何做到這一點? – user2724215