gpt4 book ai didi

java - 向Word文档添加脚注

转载 作者:行者123 更新时间:2023-12-01 21:16:31 24 4
gpt4 key购买 nike

如何使用 Apache POI 将脚注添加到 Word 文档 (.docx)? I know how to retrieve footnotes already in the document ,但我实际上无法添加更多。

最佳答案

我不确定这是否是向 Word 文档添加脚注的最佳方法,但它确实有效。查阅Open XML后在使用word添加脚注的文档中,我发现不仅需要脚注,还需要段落内的引用,并且可选但强烈推荐三种样式。

向文档添加脚注需要一个CTFtnEdn实例,可以通过使用CTFtnEdn.Factory.newInstance()来实现。现在要添加脚注的内容,我引用了使用 word 制作的脚注中的内容:

<xml-fragment w:id="1" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
<w:p w:rsidR="00B87AAC" w:rsidRDefault="00B87AAC">
<w:pPr>
<w:pStyle w:val="FootnoteText"/>
</w:pPr>
<w:r>
<w:rPr>
<w:rStyle w:val="FootnoteReference"/>
</w:rPr>
<w:footnoteRef/>
</w:r>
<w:r>
<w:t xml:space="preserve">Here is a Footnote</w:t>
</w:r>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
</w:p>
</xml-fragment>

这是一个使用 java 实现的示例:

CTFtnEdn ctfInstance = CTFtnEdn.Factory.newInstance();

BigInteger id = new BigInteger("1");

ctfInstance.setId(id);

CTP ctp = ctfInstance.addNewP();

ctp.addNewPPr().addNewPStyle().setVal("FootnoteText");

CTR ctr = ctp.addNewR();
ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
ctr.addNewFootnoteRef();

CTText cttext = ctp.addNewR().addNewT();
cttext.setStringValue("This is the text in the footnote");
cttext.setSpace(SpaceAttribute.Space.PRESERVE);

将标签添加到 CTFtnEdn 实例后,需要使用 document.addFootnote() 将其添加到 WMPFDocument

现在添加对文档段落的引用 - 我认为如果没有引用,脚注甚至不会在页面底部可见。引用的 Open XML 如下所示:

<w:r w:rsidR="00B87AAC">
<w:rPr>
<w:rStyle w:val="FootnoteReference"/>
</w:rPr>
<w:footnoteReference w:id="1"/>
</w:r>

这可以使用下面的代码在 java 中轻松完成:

ctr = document.getParagraphArray(0).getCTP().addNewR();
ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
ctr.addNewFootnoteReference().setId(id);

为了给脚注提供自己的样式和上标,需要添加三种样式。下面是它们三个的 Open XML:

<w:style w:styleId="FootnoteReference" w:type="character">
<w:name w:val="footnote reference"/>
<w:basedOn w:val="DefaultParagraphFont"/>
<w:uiPriority w:val="99"/>
<w:semiHidden/>
<w:unhideWhenUsed/>
<w:rPr>
<w:vertAlign w:val="superscript"/>
</w:rPr>
</w:style>
<w:style w:styleId="FootnoteText" w:type="paragraph">
<w:name w:val="footnote text"/>
<w:basedOn w:val="Normal"/>
<w:link w:val="FootnoteTextChar"/>
<w:uiPriority w:val="99"/>
<w:semiHidden/>
<w:unhideWhenUsed/>
<w:rPr>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:style>
<w:style w:customStyle="1" w:styleId="FootnoteTextChar" w:type="character">
<w:name w:val="Footnote Text Char"/>
<w:basedOn w:val="DefaultParagraphFont"/>
<w:link w:val="FootnoteText"/>
<w:uiPriority w:val="99"/>
<w:semiHidden/>
<w:rPr>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:style>

并在java中添加这个:

CTStyle style = CTStyle.Factory.newInstance();
style.setStyleId("FootnoteReference");
style.setType(STStyleType.CHARACTER);
style.addNewName().setVal("footnote reference");
style.addNewBasedOn().setVal("DefaultParagraphFont");
style.addNewUiPriority().setVal(new BigInteger("99"));
style.addNewSemiHidden();
style.addNewUnhideWhenUsed();
style.addNewRPr().addNewVertAlign().setVal(STVerticalAlignRun.SUPERSCRIPT);

document.getStyles().addStyle(new XWPFStyle(style));

style = CTStyle.Factory.newInstance();
style.setType(STStyleType.PARAGRAPH);
style.setStyleId("FootnoteText");
style.addNewName().setVal("footnote text");
style.addNewBasedOn().setVal("Normal");
style.addNewLink().setVal("FootnoteTextChar");
style.addNewUiPriority().setVal(new BigInteger("99"));
style.addNewSemiHidden();
style.addNewUnhideWhenUsed();
CTRPr rpr = style.addNewRPr();
rpr.addNewSz().setVal(new BigInteger("20"));
rpr.addNewSzCs().setVal(new BigInteger("20"));

document.getStyles().addStyle(new XWPFStyle(style));

style = CTStyle.Factory.newInstance();
style.setCustomStyle(STOnOff.X_1);
style.setStyleId("FootnoteTextChar");
style.setType(STStyleType.CHARACTER);
style.addNewName().setVal("Footnote Text Char");
style.addNewBasedOn().setVal("DefaultParagraphFont");
style.addNewLink().setVal("FootnoteText");
style.addNewUiPriority().setVal(new BigInteger("99"));
style.addNewSemiHidden();
rpr = style.addNewRPr();
rpr.addNewSz().setVal(new BigInteger("20"));
rpr.addNewSzCs().setVal(new BigInteger("20"));

document.getStyles().addStyle(new XWPFStyle(style));

请注意,document.getStyles().addStyle(new XWPFStyle(style)) 用于向文档添加新样式。

这是一个SSCCE (确保最后更改输出路径):

public static void main(String[] args) throws FileNotFoundException, IOException, XmlException{
// create doc
XWPFDocument document = new XWPFDocument();

// some sample text
document.createParagraph().createRun().setText("This is a Test.");

// check to add footnotes in case of empty
if (document.getFootnotes().isEmpty()){
document.createFootnotes();
}

// add footnote
CTFtnEdn ctfInstance = CTFtnEdn.Factory.newInstance();

BigInteger id = new BigInteger("1");

ctfInstance.setId(id);
CTP ctp = ctfInstance.addNewP();

ctp.addNewPPr().addNewPStyle().setVal("FootnoteText");

CTR ctr = ctp.addNewR();
ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
ctr.addNewFootnoteRef();

CTText cttext = ctp.addNewR().addNewT();
cttext.setStringValue("This should be a footnote");
cttext.setSpace(SpaceAttribute.Space.PRESERVE);

// add footnote to document
document.addFootnote(ctfInstance);

// add reference to footnote at end of first paragraph
ctr = document.getParagraphArray(0).getCTP().addNewR();
ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
ctr.addNewFootnoteReference().setId(id);

// styles

// if styles dont already exist then create them
if (document.getStyles()==null){
document.createStyles();
}

CTStyle style = CTStyle.Factory.newInstance();
style.setStyleId("FootnoteReference");
style.setType(STStyleType.CHARACTER);
style.addNewName().setVal("footnote reference");
style.addNewBasedOn().setVal("DefaultParagraphFont");
style.addNewUiPriority().setVal(new BigInteger("99"));
style.addNewSemiHidden();
style.addNewUnhideWhenUsed();
style.addNewRPr().addNewVertAlign().setVal(STVerticalAlignRun.SUPERSCRIPT);

// add style
document.getStyles().addStyle(new XWPFStyle(style));

style = CTStyle.Factory.newInstance();
style.setType(STStyleType.PARAGRAPH);
style.setStyleId("FootnoteText");
style.addNewName().setVal("footnote text");
style.addNewBasedOn().setVal("Normal");
style.addNewLink().setVal("FootnoteTextChar");
style.addNewUiPriority().setVal(new BigInteger("99"));
style.addNewSemiHidden();
style.addNewUnhideWhenUsed();
CTRPr rpr = style.addNewRPr();
rpr.addNewSz().setVal(new BigInteger("20"));
rpr.addNewSzCs().setVal(new BigInteger("20"));

// add style
document.getStyles().addStyle(new XWPFStyle(style));

style = CTStyle.Factory.newInstance();
style.setCustomStyle(STOnOff.X_1);
style.setStyleId("FootnoteTextChar");
style.setType(STStyleType.CHARACTER);
style.addNewName().setVal("Footnote Text Char");
style.addNewBasedOn().setVal("DefaultParagraphFont");
style.addNewLink().setVal("FootnoteText");
style.addNewUiPriority().setVal(new BigInteger("99"));
style.addNewSemiHidden();
rpr = style.addNewRPr();
rpr.addNewSz().setVal(new BigInteger("20"));
rpr.addNewSzCs().setVal(new BigInteger("20"));

// add style
document.getStyles().addStyle(new XWPFStyle(style));

// save document
FileOutputStream out = new FileOutputStream(new File("yourPathHere.docx"));
document.write(out);
out.close();
}

关于java - 向Word文档添加脚注,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39939057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com