2013-10-08 21 views
1

我需要使用Apache POI在word文檔中用圖像替換佔位符。我能夠使用Apache poi將圖片插入word文檔中。但我不知道如何用圖像替換佔位符。任何人都可以請幫忙嗎?用word中的圖像替換佔位符?

我知道這很容易,如果我們通過docx4j或其他API來做到這一點,我只允許使用Apache poi。

+0

如果您可以毫無問題地添加圖片,爲什麼不能在佔位符處添加它,然後刪除佔位符文本? – Gagravarr

+0

感謝您的回覆,我正在嘗試您所說的話。 – user2724215

+0

我能夠追加圖像,但我無法插入。我正在使用CustomXWPFDocument添加圖像。任何人都可以告訴如何做到這一點? – user2724215

回答

1

它可以完成,但我相信你必須插入原始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; 
}