2013-09-24 265 views
2

如何通過Apache POI或其他Java框架將背景圖像添加到docx文檔。 我想有一些XML塊,其中定義的背景下,這樣的如何通過apache poi添加背景圖像到docx文件?

<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 wp14"> 
<w:background w:color="FFFFFF"> 
    <v:background id="_x0000_s1025" o:bwmode="white" o:targetscreensize="1024,768"> 
     <v:fill r:id="rId2" o:title="Alien 1" recolor="t" type="frame"/> 
    </v:background> 
</w:background> 
<w:body> 
     ..... 
</w:body></w:document> 
+0

你知道你想要把該文件嗎?如果是這樣,應該很容易抓住底層的CT對象並添加它。如果你明確了你想要的文檔的位置,很容易就能告訴你如何做到這一點 – Gagravarr

+0

我添加了一個模板生成文檔,你可以幫幫我嗎? –

回答

2

結果文檔中假設你想要一個背景元素添加到文檔的根,你需要做的是這樣:

XWPFDocument doc = new XWPFDocument(OPCPackage.open("test.docx")); 
if (doc.getDocument().getBackground() == null) { 
    doc.getDocument.addNewBackground(); 
}; 

CTBackground bkgnd = doc.getDocument().getBackground(); 
bkgnd.setColor("FFFFFF"); 

現在,要將您的新背景添加到不同命名空間中的背景列表中,這有點棘手。如果你像XWPFRun,你會看到一個不同的命名空間在XML中添加的例子看

String xml = 
    "<v:background id=\"_x0000_s1025\" o:bwmode=\"white\" o:targetscreensize=\"1024,768\">" + 
    "<v:fill r:id=\"rId2\" o:title=\"Alien 1\" recolor=\"t\" type=\"frame\"/>" + 
    "</v:background>"; 
bkgnd.set(XmlToken.Factory.parse(xml)); 

:我們會做這樣的事情。如果所有這些都在.docx命名空間中,你可以使用CT對象完成所有操作,但遺憾的是你的設計很複雜......

如果手動XML東西對你來說有點煩,請嘗試使用POI來處理與Word中添加的文件,並與CTBackground對象玩耍。這可以讓你找出xmlbeans對象的內部v:background xml,這將提供一個更簡單的方法。如果你得到它的工作,發送patch to POI

+0

好的,謝謝你,我會試着玩CTBackground,如果這樣做,我會讓你知道的。 –

1

使用docx4j的在線代碼生成器:

方法1種

import javax.xml.bind.JAXBElement; 
import org.docx4j.vml.CTBackground; 
import org.docx4j.vml.CTFill; 
import org.docx4j.wml.CTBackground; 


public class Foo { 
public CTBackground createBackground() { 

org.docx4j.wml.ObjectFactory wmlObjectFactory = new org.docx4j.wml.ObjectFactory(); 

CTBackground background = wmlObjectFactory.createCTBackground(); 
    background.setColor("FFFFFF"); 
org.docx4j.vml.ObjectFactory vmlObjectFactory = new org.docx4j.vml.ObjectFactory(); 
    // Create object for background (wrapped in JAXBElement) 
    CTBackground background2 = vmlObjectFactory.createCTBackground(); 
    JAXBElement<org.docx4j.vml.CTBackground> backgroundWrapped = vmlObjectFactory.createBackground(background2); 
    background.getAnyAndAny().add(backgroundWrapped); 
     background2.setTargetscreensize("1024,768"); 
     background2.setVmlId("_x0000_s1025"); 
     background2.setBwmode(org.docx4j.vml.officedrawing.STBWMode.WHITE); 
     // Create object for fill 
     CTFill fill = vmlObjectFactory.createCTFill(); 
     background2.setFill(fill); 
      fill.setTitle("Alien 1"); 
      fill.setId("rId5"); 
      fill.setType(org.docx4j.vml.STFillType.FRAME); 
      fill.setRecolor(org.docx4j.vml.STTrueFalse.T); 

return background; 
} 
} 

方法2

String openXML = "<w:background w:color=\"FFFFFF\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"> 
       + "<v:background id=\"_x0000_s1025\" o:bwmode=\"white\" o:targetscreensize=\"1024,768\"> 
         + "<v:fill o:title=\"Alien 1\" r:id=\"rId5\" recolor=\"t\" type=\"frame\"/>" 

       +"</v:background>" 

      +"</w:background>"; 
CTBackground background = (CTBackground)XmlUtils.unmarshalString(openXML); 
+0

請注意,背景圖像與圖片水印不同。後者可能是你想要的。分別查看docx4j樣本BackgroundImage和WatermarkPicture。 – JasonPlutext