簡體   English   中英

圖片標題POI WORD

[英]Picture caption POI WORD

我正在嘗試使用Apache POI插入圖片標題,但我對此沒有任何想法。 我正在使用

doc.createParagraph().createRun().addPicture(input, 
Document.PICTURE_TYPE_PNG, "picture.png", 
           Units.pixelToEMU(603), Units.pixelToEMU(226));

插入圖片,現在我想為其添加標題以便能夠創建圖表。 我試過使用某些樣式的paradise.setStyle(“ Legends”); 但是它只會更改我無法使用“ Header1”(我有模板)的字體。 我已經研究了styles.xml(在我使用word插入圖片標題的模板中),

-<w:style w:type="paragraph" w:styleId="Legenda">
<w:name w:val="caption"/>
<w:basedOn w:val="Normalny"/>
<w:next w:val="Normalny"/>
<w:unhideWhenUsed/>
<w:qFormat/>

所以看起來我只需要將w:name w:val段落設置為“標題”即可。 我對嗎? 我如何到達?

關於在Word 插入數字表的工作原理,應該知道些什么:

添加字幕時 ,每個字幕段落都包含一個序列字段{SEQ figure \\* ARABIC} 名稱“ figure”是序列字段的名稱。 然后,如果將要創建一個數字表, Word收集包含這樣一個字段的所有段落以從中建立數字表。

到目前為止,至少就我所知,到目前為止( apache poi版本3.17)還沒有提供給圖形添加標題,插入或創建圖形表格的功能。 因此,我們必須使用低級CTSimpleField自己進行操作

例:

import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

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

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;

public class CreateWordTableOfFigures {

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

  XWPFDocument document = new XWPFDocument();

  XWPFParagraph paragraph;
  XWPFRun run;
  InputStream in; 
  CTSimpleField seq;

  paragraph = document.createParagraph();
  run = paragraph.createRun();
  run.setText("Document containing figures");

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

  //create paragraph containing figure
  paragraph = document.createParagraph();
  paragraph.setSpacingAfter(0); //Set spacing after to 0. So caption will follow immediately under the figure.
  run = paragraph.createRun();
  in = new FileInputStream("samplePict1.png");
  run.addPicture(in, Document.PICTURE_TYPE_PNG, "samplePict1.png", Units.toEMU(150), Units.toEMU(100));
  in.close();  
  paragraph = document.createParagraph(); //caption for figure
  run = paragraph.createRun();
  run.setText("Picture ");
  seq = paragraph.getCTP().addNewFldSimple();
  seq.setInstr("SEQ figure \\* ARABIC"); //This field is important for creating the table of figures then.
  run = paragraph.createRun();
  run.setText(": Description of sample picture 1");

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

  paragraph = document.createParagraph();
  paragraph.setSpacingAfter(0);
  run = paragraph.createRun();
  in = new FileInputStream("samplePict2.png");
  run.addPicture(in, Document.PICTURE_TYPE_PNG, "samplePict1.png", Units.toEMU(150), Units.toEMU(100));
  in.close();  
  paragraph = document.createParagraph();
  run = paragraph.createRun();
  run.setText("Picture ");
  seq = paragraph.getCTP().addNewFldSimple();
  seq.setInstr("SEQ figure \\* ARABIC");
  run = paragraph.createRun();
  run.setText(": Description of sample picture 2");


  paragraph = document.createParagraph();
  run = paragraph.createRun();
  run.setText("Index of figures:");

  //Create table of figures field. Word will updating that field while opening the file.
  paragraph = document.createParagraph();
  CTSimpleField toc = paragraph.getCTP().addNewFldSimple();
  toc.setInstr("TOC \\c \"figure\" \\* MERGEFORMAT");
  toc.setDirty(STOnOff.TRUE); //set dirty to forcing update


  FileOutputStream out = new FileOutputStream("CreateWordTableOfFigures.docx"); 
  document.write(out);
  document.close();

 }

}

請注意,插入的字段{TOC \\c "figure" \\* MERGEFORMAT}由於設置為骯臟,因此僅在Word打開文件時才強制更新該字段。 使用apache poi創建整個圖形表而不用強迫Word這樣做會花費更多的精力。

更進一步,我需要使標題圖形序列遵循標題序列。 因此,對於header1 / header2,我將字幕設置為1.1.1、1.1.2等。然后添加另一個header2,它們將在1.2.1、1.2.2重新啟動。 這是代碼。 它也不需要您創建目錄作為Richter的答案(我要感謝他為此指出正確的方向)。

public void addCaption(String text) {
    paragraph = doc.createParagraph();
    paragraph.setStyle(STYLE_CAPTION);
    paragraph.setSpacingAfter(0); // Set spacing after to 0. So caption will follow immediately under the figure.
    run = paragraph.createRun();
    run.setText("Figure ");
    CTR ctr;
    CTRPr ctrpr;
    CTText ctText;

    CTSimpleField seq = getParagraph().getCTP().addNewFldSimple();
    String figureText1 = " STYLEREF 2 \\s ";
    seq.setInstr(figureText1);
    ctr = seq.addNewR();
    ctrpr = ctr.addNewRPr();
    ctrpr.addNewNoProof();
    ctText = ctr.addNewT();
    ctText.setStringValue("1");

    ctr = paragraph.getCTP().addNewR();
    ctr.addNewNoBreakHyphen();

    seq = getParagraph().getCTP().addNewFldSimple();
    String figureText = " SEQ Figure \\* ARABIC \\s 2 ";
    seq.setInstr(figureText);
    ctr = seq.addNewR();
    ctrpr = ctr.addNewRPr();
    ctrpr.addNewNoProof();
    ctText = ctr.addNewT();
    ctText.setStringValue("1");

    run = paragraph.createRun(); // needed or numbers are at end, ie Figure : some text1.1
    run.setText(": " + text);

}

對...因此,在屬於@AxelRichter的代碼生成的文檔的xml文檔中,我手動插入了一張表格。 生成的xml提取數據顯示,ms word生成的文本略有不同。

axel的結果:

<w:p w:rsidR="009B13D9" w:rsidRDefault="009B13D9">
    <w:pPr>
        <w:pStyle w:val="TableofFigures"/>
        <w:tabs>
            <w:tab w:val="right" w:leader="dot" w:pos="9350"/>
        </w:tabs>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
    </w:pPr>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:t>Picture 2: Description of sample picture 2</w:t>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:tab/>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:fldChar w:fldCharType="begin"/>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:instrText xml:space="preserve"> PAGEREF _Toc521591239 \h </w:instrText>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:fldChar w:fldCharType="separate"/>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:t>1</w:t>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:fldChar w:fldCharType="end"/>
    </w:r>
</w:p>

手動插入結果

<w:p w:rsidR="009B13D9" w:rsidRDefault="009B13D9">
    <w:pPr>
        <w:pStyle w:val="TableofFigures"/>
        <w:tabs>
            <w:tab w:val="right" w:leader="dot" w:pos="9350"/>
        </w:tabs>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
    </w:pPr>
    <w:hyperlink w:anchor="_Toc521591266" w:history="1">
        <w:r w:rsidRPr="003A5F7D">
            <w:rPr>
                <w:rStyle w:val="Hyperlink"/>
                <w:noProof/>
            </w:rPr>
            <w:t>Picture 2: Description</w:t>
        </w:r>
        <w:bookmarkStart w:id="4" w:name="_GoBack"/>
        <w:bookmarkEnd w:id="4"/>
        <w:r w:rsidRPr="003A5F7D">
            <w:rPr>
                <w:rStyle w:val="Hyperlink"/>
                <w:noProof/>
            </w:rPr>
            <w:t xml:space="preserve"> of sample picture 2</w:t>
        </w:r>
        <w:r>
            <w:rPr>
                <w:noProof/>
                <w:webHidden/>
            </w:rPr>
            <w:tab/>
        </w:r>
        <w:r>
            <w:rPr>
                <w:noProof/>
                <w:webHidden/>
            </w:rPr>
            <w:fldChar w:fldCharType="begin"/>
        </w:r>
        <w:r>
            <w:rPr>
                <w:noProof/>
                <w:webHidden/>
            </w:rPr>
            <w:instrText xml:space="preserve"> PAGEREF _Toc521591266 \h </w:instrText>
        </w:r>
        <w:r>
            <w:rPr>
                <w:noProof/>
                <w:webHidden/>
            </w:rPr>
        </w:r>
        <w:r>
            <w:rPr>
                <w:noProof/>
                <w:webHidden/>
            </w:rPr>
            <w:fldChar w:fldCharType="separate"/>
        </w:r>
        <w:r>
            <w:rPr>
                <w:noProof/>
                <w:webHidden/>
            </w:rPr>
            <w:t>1</w:t>
        </w:r>
        <w:r>
            <w:rPr>
                <w:noProof/>
                <w:webHidden/>
            </w:rPr>
            <w:fldChar w:fldCharType="end"/>
        </w:r>
    </w:hyperlink>
</w:p>

略過這件事之后,似乎應該將運行包裹在一個超鏈接對象中。 ...並且有一些細微的區別只是為了使事情變得有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM