admin管理员组

文章数量:1122832

I am trying to create a new docx file and add footnotes to it using docx4j library in Java. I only want to use docx4j library. I could not found any sample implementation given by the docx4j library anywhere. I tried some code on my own but It is not generating the footnotes properly.

Below is the sample code I wrote with the help of ChatGPT:


    private static void createFootNotesPDF() {
        try {
            // Create a Word document
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

            // Add content to the document
            ObjectFactory factory = new ObjectFactory();
            MainDocumentPart mainDocPart = wordMLPackage.getMainDocumentPart();

            // Manually create and add the FootnotesPart to the MainDocumentPart
            FootnotesPart footnotesPart = new FootnotesPart();
            wordMLPackage.getParts().put(footnotesPart);

            // Create a paragraph for the main document
            P p = factory.createP();
            Text text = factory.createText();
            text.setValue("This is some text with a footnote.");
            R run = factory.createR();
            run.getContent().add(text);

            // Create Footnote Reference and add it to the run
            R.FootnoteRef footnoteRef = factory.createRFootnoteRef();
            run.getContent().add(footnoteRef);

            p.getContent().add(run);
            mainDocPart.getContent().add(p);

            // Create footnote content using CTFtnEdn
            CTFootnotes footnotes = factory.createCTFootnotes();
            CTFtnEdn footnote = createFootnote(factory);

            // Add the footnote to the CTFootnotes
            footnotes.getFootnote().add(footnote);
            // Add footnotes to the FootnotesPart
            footnotesPart.setJaxbElement(footnotes);

            // Save the document
            wordMLPackage.save(new File("document_with_footnotes.docx"));

            System.out.println("Document created successfully!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static CTFtnEdn createFootnote(ObjectFactory factory) {
        CTFtnEdn footnote = new CTFtnEdn();

        // Create the paragraph for the footnote content
        P footnoteParagraph = factory.createP();
        Text footnoteText = factory.createText();
        footnoteText.setValue("This is the footnote text.");
        R footnoteRun = factory.createR();
        footnoteRun.getContent().add(footnoteText);
        footnoteParagraph.getContent().add(footnoteRun);

        // Add paragraph to footnote
        footnote.getContent().add(footnoteParagraph);

        // Set the footnote ID (this is managed by docx4j)
        footnote.setId(BigInteger.valueOf(1)); // Footnote ID

        return footnote;
    }

Output generates is Docx file with below text:

This is some text with a footnote.1

Can anyone please suggest what am I missing? or anyone can provide sample implementation for footnotes?

I am trying to create a new docx file and add footnotes to it using docx4j library in Java. I only want to use docx4j library. I could not found any sample implementation given by the docx4j library anywhere. I tried some code on my own but It is not generating the footnotes properly.

Below is the sample code I wrote with the help of ChatGPT:


    private static void createFootNotesPDF() {
        try {
            // Create a Word document
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

            // Add content to the document
            ObjectFactory factory = new ObjectFactory();
            MainDocumentPart mainDocPart = wordMLPackage.getMainDocumentPart();

            // Manually create and add the FootnotesPart to the MainDocumentPart
            FootnotesPart footnotesPart = new FootnotesPart();
            wordMLPackage.getParts().put(footnotesPart);

            // Create a paragraph for the main document
            P p = factory.createP();
            Text text = factory.createText();
            text.setValue("This is some text with a footnote.");
            R run = factory.createR();
            run.getContent().add(text);

            // Create Footnote Reference and add it to the run
            R.FootnoteRef footnoteRef = factory.createRFootnoteRef();
            run.getContent().add(footnoteRef);

            p.getContent().add(run);
            mainDocPart.getContent().add(p);

            // Create footnote content using CTFtnEdn
            CTFootnotes footnotes = factory.createCTFootnotes();
            CTFtnEdn footnote = createFootnote(factory);

            // Add the footnote to the CTFootnotes
            footnotes.getFootnote().add(footnote);
            // Add footnotes to the FootnotesPart
            footnotesPart.setJaxbElement(footnotes);

            // Save the document
            wordMLPackage.save(new File("document_with_footnotes.docx"));

            System.out.println("Document created successfully!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static CTFtnEdn createFootnote(ObjectFactory factory) {
        CTFtnEdn footnote = new CTFtnEdn();

        // Create the paragraph for the footnote content
        P footnoteParagraph = factory.createP();
        Text footnoteText = factory.createText();
        footnoteText.setValue("This is the footnote text.");
        R footnoteRun = factory.createR();
        footnoteRun.getContent().add(footnoteText);
        footnoteParagraph.getContent().add(footnoteRun);

        // Add paragraph to footnote
        footnote.getContent().add(footnoteParagraph);

        // Set the footnote ID (this is managed by docx4j)
        footnote.setId(BigInteger.valueOf(1)); // Footnote ID

        return footnote;
    }

Output generates is Docx file with below text:

This is some text with a footnote.1

Can anyone please suggest what am I missing? or anyone can provide sample implementation for footnotes?

Share Improve this question asked yesterday QazazazazQazazazaz 136 bronze badges 1
  • Downvoting any question without giving reason or suggesting changes is really disappointing. This question contains my research as well as complete description of the issue I am facing. I think downvoting the questions in such a way kills the purpose of supporting and helping each other since it deprioritizes the question in some way and users are left without any help and support. – Qazazazaz Commented yesterday
Add a comment  | 

1 Answer 1

Reset to default 0

You shouldn't do wordMLPackage.getParts().put(footnotesPart)

That wodn't set up the relationships part properly.

Instead, use addTargetPart.

See the sample code at https://github.com/plutext/docx4j/blob/VERSION_11_5_2/docx4j-samples-docx4j/src/main/java/org/docx4j/samples/FootnoteAdd.java

本文标签: javaHow to add footnotes to a docx file using docx4j libraryStack Overflow