Search code examples
javaapache-poixwpf

Apache POI - add multiple paragraphs to header/footer on the same line


I am using Apace POI to process some documents and I would like to add a header/footer which would consist of multiple paragraphs, but I would like for them to be displayed on the same line.

This is my attempt so far:

XWPFDocument document = new XWPFDocument();

// adding header and footer
CTP ctp = CTP.Factory.newInstance();
CTR ctr = ctp.addNewR();

// create footer components
CTText footerCopyrightText = ctr.addNewT();
footerCopyrightText.setStringValue("\u00A9" + " My Website - " + Calendar.getInstance().get(Calendar.YEAR));

CTText footerPageText = ctr.addNewT();
footerPageText.setStringValue(document.getProperties().getExtendedProperties().getUnderlyingProperties().getPages() + "");

XWPFParagraph footerCopyrightParagraph = new XWPFParagraph( ctp, document );
footerCopyrightParagraph.setAlignment(ParagraphAlignment.CENTER);

XWPFParagraph footerPageParagraph = new XWPFParagraph(ctp, document);
footerPageParagraph.setAlignment(ParagraphAlignment.RIGHT);

XWPFParagraph[] footerParagraphs = {footerCopyrightParagraph, footerPageParagraph};
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy headerFooterPolicy = new  XWPFHeaderFooterPolicy(document, sectPr );
headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, footerParagraphs);

However, the end result so far is that I get a single right-aligned text, which consists of the two XWPFParagraphs, concatenated.

I have also checked some other examples here on Stack Overflow (there was one for a Header, but I didn't manage to get it to work).

A basic idea of what I want to achieve is this: https://i.sstatic.net/JkQfB.jpg

Any ideas on what I am doing wrong?

Thank you,


Solution

  • Add Tabstops and use them

    Here's my draft - printing my Name Left, Center and Right on a A4 Document. I have no clue whatsoever as to how those position elements are calculated though... Code to add tabstops is from Java Apache POI Tab Stop word document

    import java.awt.Desktop;
    import java.io.*;
    import java.math.BigInteger;
    
    import org.apache.poi.xwpf.usermodel.*;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
    
    public class POIExample {
        public static void main(String[] args) {
            try {
                XWPFDocument document = new XWPFDocument();
                XWPFParagraph paragraph = document.createParagraph();
    
                XWPFRun tmpRun = paragraph.createRun();
                tmpRun.setText("JAN");
                tmpRun.addTab();
                tmpRun.setText("JAN");
                tmpRun.addTab();
                tmpRun.setText("JAN");
    
                BigInteger pos1 = BigInteger.valueOf(4500);
                setTabStop(paragraph, STTabJc.Enum.forString("center"), pos1);
                BigInteger pos2 = BigInteger.valueOf(9000);
                setTabStop(paragraph, STTabJc.Enum.forString("right"), pos2);
    
                File f = File.createTempFile("poi", ".docx");
                try (FileOutputStream fo = new FileOutputStream(f)) {
                    document.write(fo);
                }
                Desktop.getDesktop().open(f);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void setTabStop(XWPFParagraph oParagraph, STTabJc.Enum oSTTabJc, BigInteger oPos) {
            CTP oCTP = oParagraph.getCTP();
            CTPPr oPPr = oCTP.getPPr();
            if (oPPr == null) {
                oPPr = oCTP.addNewPPr();
            }
    
            CTTabs oTabs = oPPr.getTabs();
            if (oTabs == null) {
                oTabs = oPPr.addNewTabs();
            }
    
            CTTabStop oTabStop = oTabs.addNewTab();
            oTabStop.setVal(oSTTabJc);
            oTabStop.setPos(oPos);
        }
    }