2016-10-28 406 views
0

我試圖在Word docx文檔的標題中添加一些形狀和標誌文件。添加圖片適用於我,但我沒有找到任何解決方案如何添加形狀。誰能幫我?Apache POI XWPF將標題添加到標題

String imgFile="logo.png"; 

XWPFDocument document = new XWPFDocument(new FileInputStream("myfile.docx")); 

CTSectPr sectPr = document.getDocument().getBody().addNewSectPr(); 

XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);    
XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT); 

XWPFParagraph paragraph = header.getParagraphArray(0); 
paragraph.setAlignment(ParagraphAlignment.CENTER); 

XWPFRun run = paragraph.createRun(); 
XWPFPicture picture = run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(195), Units.toEMU(22)); 

String blipID = ""; 
for(XWPFPictureData picturedata : header.getAllPackagePictures()) { 
    blipID = header.getRelationId(picturedata); 
} 
picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID); //now they have a blipID too 

在結束時,頭部應該像this

感謝

回答

1

由於apache poiXWPF真的是處於測試狀態,直至現在,這樣的事情僅僅是可能的,如果一個人知道究竟是如何Word將存儲它的內容進入XML。然後可以解決apache poiXWPF的不足之處。您已經使用了這樣一種解決方法,可以在將圖片添加到頁眉或頁腳中運行時更正丟失的blipID

要發現Word如何將其內容存儲到XML不是火箭科學。 A *.docx文件只是一個ZIP文件。如果使用Zip軟件解壓縮此文件,可以簡單查看XML文件。

據我所知直接在apache poi不支持在Word文檔中添加形狀(在本例中爲文本框)。爲此,需要使用底層對象(本例中爲CTGroupCTShape)。

實施例:(代碼應該是自解釋)

import java.io.*; 

import org.apache.poi.util.Units; 

import org.apache.poi.xwpf.usermodel.*; 

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; 

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTxbxContent; 

import com.microsoft.schemas.vml.CTGroup; 
import com.microsoft.schemas.vml.CTShape; 

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc; 

import org.w3c.dom.Node; 

import java.math.BigInteger; 

public class CreateWordHeaderFooterTextBoxPicture { 

public static void main(String[] args) throws Exception { 

    XWPFDocument doc= new XWPFDocument(); 

    // the body content 
    XWPFParagraph paragraph = doc.createParagraph(); 
    XWPFRun run=paragraph.createRun(); 
    run.setText("The Body:"); 

    paragraph = doc.createParagraph(); 
    run=paragraph.createRun(); 
    run.setText("Lorem ipsum...."); 

    // create header start 
    XWPFHeaderFooterPolicy headerFooterPolicy = doc.createHeaderFooterPolicy(); 
    XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT); 

    // header's first paragraph 
    paragraph = header.getParagraphArray(0); 
    paragraph.setAlignment(ParagraphAlignment.LEFT); 

    // create tab stops 
    CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab(); 
    tabStop.setVal(STTabJc.CENTER); 
    int twipsPerInch = 1440; 
    tabStop.setPos(BigInteger.valueOf(3 * twipsPerInch)); 

    tabStop = paragraph.getCTP().getPPr().getTabs().addNewTab(); 
    tabStop.setVal(STTabJc.RIGHT); 
    twipsPerInch = 1440; 
    tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch)); 

    // first run in header's first paragraph, to be for first text box 
    run = paragraph.createRun(); 

    // create inline text box in run 
    CTGroup ctGroup = CTGroup.Factory.newInstance(); 

    CTShape ctShape = ctGroup.addNewShape(); 
    ctShape.setStyle("width:80pt;height:24pt"); 
    CTTxbxContent ctTxbxContent = ctShape.addNewTextbox().addNewTxbxContent(); 
    XWPFParagraph textboxparagraph = new XWPFParagraph(ctTxbxContent.addNewP(), (IBody)header); 
    XWPFRun textboxrun = textboxparagraph.createRun(); 
    textboxrun.setText("The TextBox 1..."); 
    textboxrun.setFontSize(10); 

    Node ctGroupNode = ctGroup.getDomNode(); 
    CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode); 
    CTR cTR = run.getCTR(); 
    cTR.addNewPict(); 
    cTR.setPictArray(0, ctPicture); 

    // add tab to run 
    run.addTab(); 

    // second run in header's first paragraph, to be for logo picture 
    run = paragraph.createRun(); 

    // add the picture in the headers run 
    String imgFile="Logo.png"; 
    XWPFPicture picture = run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(195), Units.toEMU(22)); 

    String blipID = ""; 
    for(XWPFPictureData picturedata : header.getAllPackagePictures()) { 
    blipID = header.getRelationId(picturedata); 
    } 
    picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID); 

    // add tab to run 
    run.addTab(); 

    // third run in header's first paragraph, to be for second text box 
    run = paragraph.createRun(); 

    // create inline text box in run 
    ctGroup = CTGroup.Factory.newInstance(); 

    ctShape = ctGroup.addNewShape(); 
    ctShape.setStyle("width:80pt;height:24pt"); 
    ctTxbxContent = ctShape.addNewTextbox().addNewTxbxContent(); 
    textboxparagraph = new XWPFParagraph(ctTxbxContent.addNewP(), (IBody)header); 
    textboxrun = textboxparagraph.createRun(); 
    textboxrun.setText("The TextBox 2..."); 
    textboxrun.setFontSize(10); 

    ctGroupNode = ctGroup.getDomNode(); 
    ctPicture = CTPicture.Factory.parse(ctGroupNode); 
    cTR = run.getCTR(); 
    cTR.addNewPict(); 
    cTR.setPictArray(0, ctPicture); 

    // create header end 


    // create footer start 
    XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT); 

    paragraph = footer.getParagraphArray(0); 
    paragraph.setAlignment(ParagraphAlignment.CENTER); 

    run = paragraph.createRun(); 
    run.setText("The Footer:"); 


    doc.write(new FileOutputStream("test.docx")); 

} 
}