Apache POI 3.13 .doc的离线/偏移元素

时间:2016-01-16 00:15:37

标签: java apache-poi

所以基本上我需要验证生成的.doc,当一些内容/元素段落或表传递给另一个页面时,如果某个元素/内容单独在另一个页面上,我需要采取另一个元素/内容并放置它与单独的元素/内容

public void investigarDoc(XWPFDocument doc){
    try {          

        creacionDeFooter(doc);//FOOTER CREATION METHOD

        XWPFParagraph cuerpoObservaciones = doc.createParagraph(); //PARAGRAPH 1
        cuerpoObservaciones.setAlignment(ParagraphAlignment.DISTRIBUTE);
        XWPFRun imprimeObservaciones = cuerpoObservaciones.createRun();            
        seccionObservaciones(doc,imprimeObservaciones,cuerpoObservaciones); //TABLE CREATION METHOD

        XWPFParagraph cuerpoFirma = doc.createParagraph();  //PARAGRAPH 2
        cuerpoFirma.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun imprimeFirma = cuerpoFirma.createRun();
        seccionFirma(doc,imprimeFirma,cuerpoFirma); //SIGNATURE CREATION METHOD

        doc.write(new FileOutputStream("C:\\test.doc"));

    } catch (IOException iox) {
        iox.printStackTrace();
        System.out.println("Error: IOException Verificar Rutas de Archivos o Fotos!");
    }
}

//页脚方法

public void creacionDeFooter(XWPFDocument doc){ //FOOTER METHOD
    try {
        CTP ctp = CTP.Factory.newInstance();
        //this add page number incremental
        ctp.addNewR().addNewPgNum();

        XWPFParagraph parrafoFotter = new XWPFParagraph(ctp, doc);
        XWPFParagraph[] paragraphs = new XWPFParagraph[1];
        paragraphs[0] = parrafoFotter;

        //position of number
        parrafoFotter.setAlignment(ParagraphAlignment.RIGHT);

        CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();

        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);
        headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, paragraphs);

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

//第1段的方法

public void seccionObservaciones(XWPFDocument doc, XWPFRun otrasObservaciones,XWPFParagraph observaciones){ //TABLE METHOD

    otrasObservaciones = observaciones.createRun();
    otrasObservaciones.setText(".");
    otrasObservaciones.addBreak();
     //create table
    XWPFTable table = doc.createTable();
    //create first row
    XWPFTableRow tableRowOne = table.getRow(0);
    tableRowOne.getCell(0).setText("Otras Operaciones/Observaciones");

    //create second row
    XWPFTableRow tableRowTwo = table.createRow();
    tableRowTwo.getCell(0).getTableRow(); 
    tableRowTwo.getCell(0).setText("col fore, row fore");

 }

//第2段的方法

public void seccionFirma(XWPFDocument doc, XWPFRun imprimeFirma,XWPFParagraph firma){ //SIGNATURE METHOD
    imprimeFirma = firma.createRun();
    imprimeFirma.addBreak();
    imprimeFirma.setFontFamily("Arial");
    imprimeFirma.addBreak();
    imprimeFirma.setText("_________________________________________");
    imprimeFirma.addBreak();
    imprimeFirma.setText("NOMBRE PERSONA");
    imprimeFirma.addBreak();
    imprimeFirma.setText("PUESTO");
    imprimeFirma.addBreak();
    imprimeFirma.setText("GRUPO FINANCIERO BLABLA BLA");
    imprimeFirma.setText(".");

} 

这是最终结果的图片,这张照片都很好:

The good result

但问题是如果发生这样的事情:

The validation and bad final result

这是大多数情况下验证的例子

YEAAA

我尝试在数字页面的基础上处理这个问题,但似乎poi不存储页面数。

我需要比桌子和签名段落来到另一页,如果其中一些2在新页面上。

我将非常感激,非常感谢!问候。

1 个答案:

答案 0 :(得分:2)

好像你想把一行上的行和段落放在一起。这可以通过Word查看https://support.office.com/en-us/article/Keep-text-together-af94e5b8-3a5a-4cb0-9c53-dea56b43d96d

因此,我们必须为每个段落设置属性KeepLinesKeepNext。也适用于表内的人。

粗糙的线条是我的补充。

public void seccionObservaciones(XWPFDocument doc, XWPFRun otrasObservaciones, XWPFParagraph observaciones){ //TABLE METHOD

    otrasObservaciones = observaciones.createRun();
    otrasObservaciones.setText(".");
    otrasObservaciones.addBreak();
     //create table
    XWPFTable table = doc.createTable();
    //create first row
    XWPFTableRow tableRowOne = table.getRow(0);
    tableRowOne.getCell(0).setText("Otras Operaciones/Observaciones");

for (XWPFParagraph p : tableRowOne.getCell(0).getParagraphs()) {
 p.getCTP().addNewPPr().addNewKeepLines().setVal(STOnOff.ON);
 p.getCTP().getPPr().addNewKeepNext().setVal(STOnOff.ON);
}

    //create second row
    XWPFTableRow tableRowTwo = table.createRow();
    tableRowTwo.getCell(0).getTableRow(); 
    tableRowTwo.getCell(0).setText("col fore, row fore");

for (XWPFParagraph p : tableRowTwo.getCell(0).getParagraphs()) {
 p.getCTP().addNewPPr().addNewKeepLines().setVal(STOnOff.ON);
 p.getCTP().getPPr().addNewKeepNext().setVal(STOnOff.ON);
}

 }

//主要方法

...
        creacionDeFooter(doc);//FOOTER CREATION METHOD

        XWPFParagraph cuerpoObservaciones = doc.createParagraph(); //PARAGRAPH 1
        cuerpoObservaciones.setAlignment(ParagraphAlignment.DISTRIBUTE);

cuerpoObservaciones.getCTP().getPPr().addNewKeepLines().setVal(STOnOff.ON); //has already a CPPr through setAlignment
cuerpoObservaciones.getCTP().getPPr().addNewKeepNext().setVal(STOnOff.ON);

        XWPFRun imprimeObservaciones = cuerpoObservaciones.createRun();            
        seccionObservaciones(doc,imprimeObservaciones,cuerpoObservaciones); //TABLE CREATION METHOD

        XWPFParagraph cuerpoFirma = doc.createParagraph();  //PARAGRAPH 2

cuerpoFirma.getCTP().addNewPPr().addNewKeepLines().setVal(STOnOff.ON);
cuerpoFirma.getCTP().getPPr().addNewKeepNext().setVal(STOnOff.ON);

        cuerpoFirma.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun imprimeFirma = cuerpoFirma.createRun();
        seccionFirma(doc,imprimeFirma,cuerpoFirma); //SIGNATURE CREATION METHOD

        doc.write(new FileOutputStream("test.docx"));
...
org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff需要

STOnOff.ON。但是你已经使用了其他org.openxmlformats.schemas.wordprocessingml.x2006.main.个对象了。所以你会知道怎么做到这一点。

修改

忘了提。请不要将XWPFDocument保存为*.doc文件。 *.doc文件主要用于Word到版本2003的二进制文件格式。XWPFDocument基于XML,应保存为*.docx。< / p>