当前位置: 首页 > 知识库问答 >
问题:

如何在Apache POI Word中添加图片的交叉引用?[副本]

金珂
2023-03-14

我想使用Apache POI创建一个带有文本和图片的文档。文本的某些部分必须与图片交叉引用。我尝试按照这个问题的答案将AddExternalRelationship方法更改为AddRelationship,但没有成功:

如何在Apache POI Word中创建超链接?

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHyperlinkRun;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType;

public class CrossReference {
    public static void main(String[] args) throws InvalidFormatException, FileNotFoundException, IOException {
        XWPFDocument document = new XWPFDocument();
        XWPFParagraph paragraph = document.createParagraph();
        document.createParagraph();

        document.createParagraph().createRun().addBreak(BreakType.PAGE);

        XWPFParagraph pictureParagraph = document.createParagraph();
        pictureParagraph.setSpacingAfter(0);

        XWPFRun pictureRun = pictureParagraph.createRun();
        String imgPath = "img.png";
        pictureRun.addPicture(new FileInputStream(imgPath), 
                XWPFDocument.PICTURE_TYPE_PNG, 
                imgPath, 
                Units.toEMU(288), 
                Units.toEMU(288));

        String anchor = "anchor";

        XWPFParagraph captionParagraph = document.createParagraph();
        XWPFRun captionRun = captionParagraph.createRun();
        captionRun.setText("Figure ");
        CTBookmark bookmark = captionParagraph.getCTP().addNewBookmarkStart();
        bookmark.setName(anchor);
        bookmark.setId(BigInteger.valueOf(0));
        captionParagraph.createRun().getCTR().addNewFldChar().setFldCharType(STFldCharType.BEGIN);
        captionParagraph.getCTP().addNewFldSimple().setInstr("SEQ Figure \\* ARABIC");
        captionParagraph.createRun().getCTR().addNewFldChar().setFldCharType(STFldCharType.END);
        captionParagraph.getCTP().addNewBookmarkEnd().setId(BigInteger.valueOf(0));

        CTHyperlink ctHyperlink = paragraph.getCTP().addNewHyperlink();
        ctHyperlink.setAnchor(anchor);
        XWPFHyperlinkRun hyperlinkRun = new XWPFHyperlinkRun(ctHyperlink, 
                ctHyperlink.addNewR(), paragraph);
        hyperlinkRun.setText("Figure 1");
        hyperlinkRun.setUnderline(UnderlinePatterns.SINGLE);

        FileOutputStream out = new FileOutputStream(new File("test.docx"));
        document.write(out);
        out.close();
        document.close();
    }
}

  <w:p>
     <w:hyperlink w:anchor="anchor">
        <w:r>
           <w:rPr>
              <w:u w:val="single" />
           </w:rPr>
           <w:t>Figure 1</w:t>
        </w:r>
     </w:hyperlink>
  </w:p>
  <w:p />
  <w:p>
     <w:pPr>
        <w:pStyle w:val="Normal" />
        <w:rPr />
     </w:pPr>
     <w:r>
        <w:rPr />
        <w:t xml:space="preserve">Figure </w:t>
     </w:r>
     <w:r>
        <w:rPr />
        <w:fldChar w:fldCharType="begin" />
     </w:r>
     <w:r>
        <w:rPr />
        <w:instrText>REF Ref_Figure0_number_only \h</w:instrText>
     </w:r>
     <w:r>
        <w:rPr />
        <w:fldChar w:fldCharType="separate" />
     </w:r>
     <w:r>
        <w:rPr />
        <w:t>1</w:t>
     </w:r>
     <w:r>
        <w:rPr />
        <w:fldChar w:fldCharType="end" />
     </w:r>
  </w:p>

共有1个答案

洪光霁
2023-03-14

我发现问题的解决方案是通过书签而不是超链接获得的:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute.Space;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType;

public class CrossReference {

    public static void main(String[] args) throws InvalidFormatException, IOException {
        XWPFDocument document = new XWPFDocument();
        XWPFParagraph paragraph = document.createParagraph();

        document.createParagraph().createRun().addBreak(BreakType.PAGE);

        XWPFParagraph pictureParagraph = document.createParagraph();
        pictureParagraph.setSpacingAfter(0);

        XWPFRun pictureRun = pictureParagraph.createRun();
        String imgPath = "img.png";
        pictureRun.addPicture(new FileInputStream(imgPath), 
                XWPFDocument.PICTURE_TYPE_PNG, 
                imgPath, 
                Units.toEMU(288), 
                Units.toEMU(288));

        XWPFParagraph captionParagraph = document.createParagraph();
        XWPFRun captionRun = captionParagraph.createRun();
        CTText ctText = captionRun.getCTR().addNewInstrText();
        ctText.setSpace(Space.PRESERVE);
        ctText.setStringValue("Figure ");
        CTBookmark bookmark = captionParagraph.getCTP().addNewBookmarkStart();
        bookmark.setName("Figure-1");
        bookmark.setId(BigInteger.valueOf(0));

        CTSimpleField ctSimpleField = captionParagraph.getCTP().addNewFldSimple();
        ctSimpleField.setInstr("SEQ Figure \\* ARABIC");
        CTR ctR = ctSimpleField.addNewR();
        ctR.addNewRPr().setNoProof(CTOnOff.Factory.newInstance());
        ctR.addNewT().setStringValue(Integer.toString(1));

        captionParagraph.getCTP().addNewBookmarkEnd().setId(BigInteger.valueOf(0));
        captionParagraph.setSpacingAfter(0);

        paragraph.createRun().getCTR().addNewFldChar().setFldCharType(STFldCharType.BEGIN);

        ctText = paragraph.createRun().getCTR().addNewInstrText();
        ctText.setSpace(Space.PRESERVE);
        ctText.setStringValue("REF Figure-1 \\h");

        paragraph.createRun().getCTR().addNewFldChar().setFldCharType(STFldCharType.SEPARATE);

        ctText = paragraph.createRun().getCTR().addNewT();
        ctText.setSpace(Space.PRESERVE);
        ctText.setStringValue("Figure ");

        ctR = paragraph.createRun().getCTR();
        ctR.addNewRPr().setNoProof(CTOnOff.Factory.newInstance());
        ctR.addNewT().setStringValue(Integer.toString(1));

        paragraph.createRun().getCTR().addNewFldChar().setFldCharType(STFldCharType.END);

        FileOutputStream out = new FileOutputStream(new File("test.docx"));
        document.write(out);
        out.close();
        document.close();
    }

}
 类似资料:
  • 我刚刚开始用libGDX做原型,以了解它是如何工作的。我想实现一个网格(像象棋游戏),当我点击/触摸网格的一个盒子,这改变了它的形象。 我找到了一个很好的教程,但它只使用键盘监听器,在网络上,我找不到一个很好的例子来阐明这些机制。 我不明白的是:用什么来渲染框(目前我只使用了SpriteBatch和ShapeRenderer)以及如何检测何时哪个框被点击(我认为计算坐标不是一个好方法。我认为最好的

  • 我正在创建一个Word VBA宏来插入一个包含图像及其标题的文本框,然后在主文档文本中创建对它的交叉引用。 但是Word在文本框中找不到标题。 下面是说明性代码: 如果标题是一个在主文档文本中内联的东西(比如,图片、表格或只是一个段落),它会找到它。但是如果标题在文本框或文本框中,无论是我在文本框中创建的标题段落,还是我简单地单击文本框并执行插入标题(实际上在框架下方创建了一个文本框),我得到零。

  • 我正在读这本书:Flask Web developmen。下面是这本书在地址栏中添加图标的代码: 我的问题是:为什么它需要两个链接来添加一个图标。在HTML中,这个oneline就足以完成这个任务了。不是吗?

  • 我正在当前视图底部的UIViewController中添加一个视图作为子视图。我可以使用alpha制作淡入淡出动画,但我想将其显示为类似键盘弹出窗口的幻灯片。 如何设置动画?

  • 在图片和图片模式被激活后,我试图从任务中杀死活动,到目前为止,我尝试,,,以编程方式设置,但活动仍然在后台存在。 当我们单击该十字图标时,我们可以在中看到相同的行为。应用程序仍然存在于后台,但我需要残忍地杀死它:) 这就是我如何发射意图: 重要提示:当此活动不进入时,一切都按预期工作,并且在我需要时活动会正常杀死自己! 当我点击这个十字图标时: pipActivity中的onStop被调用: 此时

  • 我有一个关于在LinkedList中添加“像素”的问题。 完成方法: > public Pixel pixelAt(int zeile,int spalte)这个方法在“图片”的行/列中返回一个后面的“Pixel”。如果没有黑色“像素”,则返回NULL。 public void printBild()为黑色像素打印一个“*”,为白色像素打印一个“-”。 公共空像素(int zeile,int sp