使用 docx4j 为图像添加标题

Add a caption to an image with docx4j

我想 link 使用 docx4j 为图像添加标题。

BinaryPartAbstractImage imagePart;
imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
Inline inline = imagePart.createImageInline(filenameHint, altText, id1, id2, false);

ObjectFactory factory = new ObjectFactory();
P imageParagraph = factory.createP();
R run = factory.createR();
imageParagraph.getContent().add(run);
Drawing drawing = factory.createDrawing();
run.getContent().add(drawing);
drawing.getAnchorOrInline().add(inline);   

我看过一些东西 link CTCaption,但我不知道如何 link 它。

Word 在包含图像的标题后添加标题作为同级 w:p,使用 w:fldSimple 作为编号:

<w:p>
  <w:r>
    <w:drawing>
      <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="27B5888C" wp14:editId="054E2550">
        <wp:extent cx="6010910" cy="2385060"/>
        <wp:effectExtent l="0" t="0" r="8890" b="0"/>
        <wp:docPr id="1" name="Picture 1" descr="Graphical user interface, text&#xA;&#xA;Description automatically generated"/>
        <wp:cNvGraphicFramePr>
          <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
        </wp:cNvGraphicFramePr>
        <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
          <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
            <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
              <pic:nvPicPr>
                <pic:cNvPr id="1" name="Picture 1" descr="Graphical user interface, text&#xA;&#xA;Description automatically generated"/>
                <pic:cNvPicPr/>
              </pic:nvPicPr>
              <pic:blipFill>
                <a:blip r:embed="rId4"/>
                <a:stretch>
                  <a:fillRect/>
                </a:stretch>
              </pic:blipFill>
              <pic:spPr>
                <a:xfrm>
                  <a:off x="0" y="0"/>
                  <a:ext cx="6010910" cy="2385060"/>
                </a:xfrm>
                <a:prstGeom prst="rect">
                  <a:avLst/>
                </a:prstGeom>
              </pic:spPr>
            </pic:pic>
          </a:graphicData>
        </a:graphic>
      </wp:inline>
    </w:drawing>
  </w:r>
</w:p>
<w:p>
  <w:pPr>
    <w:pStyle w:val="Caption"/>
  </w:pPr>
  <w:r>
    <w:t xml:space="preserve">Figure </w:t>
  </w:r>
  <w:fldSimple w:instr=" SEQ Figure \* ARABIC ">
    <w:r>
      <w:rPr>
        <w:noProof/>
      </w:rPr>
      <w:t>1</w:t>
    </w:r>
  </w:fldSimple>
  <w:r>
    <w:t>YOUR CAPTION HERE</w:t>
  </w:r>
</w:p>

指示性 Java 代码 w:p

    // Create object for p
    P p4 = wmlObjectFactory.createP(); 
    body.getContent().add( p4); 
        // Create object for r
        R r4 = wmlObjectFactory.createR(); 
        p4.getContent().add( r4); 
            // Create object for t (wrapped in JAXBElement) 
            Text text3 = wmlObjectFactory.createText(); 
            JAXBElement<org.docx4j.wml.Text> textWrapped3 = wmlObjectFactory.createRT(text3); 
            r4.getContent().add( textWrapped3); 
                text3.setValue( "Figure "); 
                text3.setSpace( "preserve"); 
        // Create object for r
        R r5 = wmlObjectFactory.createR(); 
        p4.getContent().add( r5); 
            // Create object for fldChar (wrapped in JAXBElement) 
            FldChar fldchar = wmlObjectFactory.createFldChar(); 
            JAXBElement<org.docx4j.wml.FldChar> fldcharWrapped = wmlObjectFactory.createRFldChar(fldchar); 
            r5.getContent().add( fldcharWrapped); 
                fldchar.setFldCharType(org.docx4j.wml.STFldCharType.BEGIN);
        // Create object for r
        R r6 = wmlObjectFactory.createR(); 
        p4.getContent().add( r6); 
            // Create object for instrText (wrapped in JAXBElement) 
            Text text4 = wmlObjectFactory.createText(); 
            JAXBElement<org.docx4j.wml.Text> textWrapped4 = wmlObjectFactory.createRInstrText(text4); 
            r6.getContent().add( textWrapped4); 
                text4.setValue( " SEQ Figure \* ARABIC "); 
                text4.setSpace( "preserve"); 
        // Create object for r
        R r7 = wmlObjectFactory.createR(); 
        p4.getContent().add( r7); 
            // Create object for fldChar (wrapped in JAXBElement) 
            FldChar fldchar2 = wmlObjectFactory.createFldChar(); 
            JAXBElement<org.docx4j.wml.FldChar> fldcharWrapped2 = wmlObjectFactory.createRFldChar(fldchar2); 
            r7.getContent().add( fldcharWrapped2); 
                fldchar2.setFldCharType(org.docx4j.wml.STFldCharType.SEPARATE);
        // Create object for r
        R r8 = wmlObjectFactory.createR(); 
        p4.getContent().add( r8); 
            // Create object for t (wrapped in JAXBElement) 
            Text text5 = wmlObjectFactory.createText(); 
            JAXBElement<org.docx4j.wml.Text> textWrapped5 = wmlObjectFactory.createRT(text5); 
            r8.getContent().add( textWrapped5); 
                text5.setValue( "1"); 
            // Create object for rPr
            RPr rpr3 = wmlObjectFactory.createRPr(); 
            r8.setRPr(rpr3); 
                // Create object for noProof
                BooleanDefaultTrue booleandefaulttrue3 = wmlObjectFactory.createBooleanDefaultTrue(); 
                rpr3.setNoProof(booleandefaulttrue3); 
        // Create object for r
        R r9 = wmlObjectFactory.createR(); 
        p4.getContent().add( r9); 
            // Create object for fldChar (wrapped in JAXBElement) 
            FldChar fldchar3 = wmlObjectFactory.createFldChar(); 
            JAXBElement<org.docx4j.wml.FldChar> fldcharWrapped3 = wmlObjectFactory.createRFldChar(fldchar3); 
            r9.getContent().add( fldcharWrapped3); 
                fldchar3.setFldCharType(org.docx4j.wml.STFldCharType.END);
            // Create object for rPr
            RPr rpr4 = wmlObjectFactory.createRPr(); 
            r9.setRPr(rpr4); 
                // Create object for noProof
                BooleanDefaultTrue booleandefaulttrue4 = wmlObjectFactory.createBooleanDefaultTrue(); 
                rpr4.setNoProof(booleandefaulttrue4); 
        // Create object for r
        R r10 = wmlObjectFactory.createR(); 
        p4.getContent().add( r10); 
            // Create object for t (wrapped in JAXBElement) 
            Text text6 = wmlObjectFactory.createText(); 
            JAXBElement<org.docx4j.wml.Text> textWrapped6 = wmlObjectFactory.createRT(text6); 
            r10.getContent().add( textWrapped6); 
                text6.setValue( "YOUR CAPTION HERE"); 
        // Create object for pPr
        PPr ppr2 = wmlObjectFactory.createPPr(); 
        p4.setPPr(ppr2); 
            // Create object for pStyle
            PPrBase.PStyle pprbasepstyle = wmlObjectFactory.createPPrBasePStyle(); 
            ppr2.setPStyle(pprbasepstyle); 
                pprbasepstyle.setVal( "Caption");