2016-10-28 44 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

おかげのようになります。1はWordを保存する方法を正確に知っている場合、そのようなことは可能ですそれはXMLの内容です。その後、apache poiXWPFという不適格を回避することができます。ヘッダーまたはフッターで画像が追加されたときに、紛失したblipIDを修正する回避策を既に使用しています。

XMLWordの内容を保存する方法を知るには、ロケット科学ではありません。 *.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")); 

} 
} 
関連する問題