2016-10-28 9 views
0

내 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 

끝에서 헤더는 apache poiXWPF 이후

답변

1

지금까지 베타 상태에 정말 this

감사 같아야 하나 Word 저장하는 방법을 정확히 알고 있다면, 그런 것들에만 가능하다 그 내용은 XML입니다. 그렇다면 apache poiXWPF의 부적합 함을 해결할 수 있습니다. 머리글이나 바닥 글에서 그림을 추가 할 때 놓친 blipID을 수정하는 해결 방법을 이미 사용했습니다.

Word에 내용을 저장하는 방법을 발견하려면 XML 로켓 과학이 아닙니다. *.docx 파일은 단순히 ZIP 파일입니다. Zip 소프트웨어를 사용하여이 파일의 압축을 풀면 XML 파일을 간단히 살펴볼 수 있습니다.

지금까지 Word 문서에서 도형 (이 경우 텍스트 상자)을 추가하는 것이 apache poi에 의해 직접 지원된다는 것을 알고 있습니다. 이를 위해 낮은 수준의 기본 객체 (이 경우 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")); 

} 
}