Apache POI - добавить несколько абзацев в верхний/нижний колонтитул в одной строке

Я использую Apace POI для обработки некоторых документов и хочу добавить верхний/нижний колонтитул, который будет состоять из нескольких абзацев, но я хочу, чтобы они отображались в одной строке.

Это моя попытка до сих пор:

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);

Однако конечным результатом на данный момент является то, что я получаю один выровненный по правому краю текст, состоящий из двух конкатенированных параграфов XWPFP.

Я также проверил некоторые другие примеры здесь, в Stack Overflow (был один для заголовка, но мне не удалось заставить его работать).

Основная идея того, чего я хочу достичь, заключается в следующем: http://imgur.com/jrwVO0F

Любые идеи о том, что я делаю неправильно?

Спасибо,


person SSJVegito    schedule 26.11.2015    source источник
comment
Ты имеешь в виду как стол? Один слева, один по центру, один справа? Может быть, визуальный набросок того, где на странице вы хотите разместить то, что было бы полезно   -  person Jan    schedule 26.11.2015
comment
Да, это основная идея. Что-то вроде идеи бутстрапа о строке с текстом слева, текстом в центре и текстом справа, но в слове.   -  person SSJVegito    schedule 26.11.2015
comment
У вас случайно нет примера кода, как это выглядит? Потому что я немного смущен тем, как это транспонируется в Java и Apache POI, поскольку я точно не знаю, как установить интервал для объекта CTText (если это то, что я должен использовать).   -  person SSJVegito    schedule 26.11.2015


Ответы (2)


Добавляйте вкладки и используйте их

Вот мой черновик - печать моего имени слева, по центру и справа на документе формата А4. Я понятия не имею, как рассчитываются эти элементы позиции... Код для добавления табуляции взят из 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);
    }
}
person Jan    schedule 26.11.2015
comment
Хотя мне нужно внести небольшие коррективы, он работает так, как я бы хотел. Спасибо! - person SSJVegito; 27.11.2015

Итак, немного повозившись, у меня наконец-то есть работающая версия. Мы надеемся, что это окажется полезным и для других пользователей.

Создание кода объекта нижнего колонтитула

    // create footer components
    XWPFDocument document = new XWPFDocument();
    CTP footerCtp = CTP.Factory.newInstance();
    CTR footerCtr = footerCtp.addNewR();
    XWPFParagraph footerCopyrightParagraph = new XWPFParagraph(footerCtp, document);
    document.getProperties().getExtendedProperties().getUnderlyingProperties().getPages();
    XWPFRun run = footerCopyrightParagraph.getRun(footerCtr);
    run.setText("My Website.com");
    run.addTab();
    run.setText("\u00A9" + " My Website - " + Calendar.getInstance().get(Calendar.YEAR));
    run.addTab();
    run.setText("Right Side Text");

    setTabStop(footerCtp, STTabJc.Enum.forString("right"), BigInteger.valueOf(9000));

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

Метод SetTabStop

private static void setTabStop(CTP oCTP, STTabJc.Enum oSTTabJc, BigInteger oPos) {
    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);
}
person SSJVegito    schedule 27.11.2015