buscar y reemplazar un texto en un encabezado diferente para cada sección en docx usando java

Estoy tratando de encontrar y reemplazar un texto con diferentes secciones de encabezado en cada página usando Apache poi pero obteniendo solo datos nulos, pero Docx también tiene diferentes secciones de encabezado y pie de página

    package com.concretepage;
    import java.io.FileInputStream;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFFooter;
    import org.apache.poi.xwpf.usermodel.XWPFHeader;
    public class ReadDOCXHeaderFooter {
        public static void main(String[] args) {
            try {
                FileInputStream fis = new FileInputStream("D:/docx/read-test.docx");
                XWPFDocument xdoc=new XWPFDocument(OPCPackage.open(fis));
                XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(xdoc);
                //read header

                for(int i=0;i<90;i++)
                {
                 XWPFHeader header = policy.getHeader(i);
       List<XWPFRun> runs = header.getRuns();
  if (runs != null) {
         for (XWPFRun r : runs) {
          String text = r.getText(0);
          if (text != null && text.contains("$$key$$")) {
           text = text.replace("$$key$$", "ABCD");//your content
           r.setText(text, 0);
          }
         }
                    System.out.println(header.getText());

                    //read footer
                    XWPFFooter footer = policy.getFooter(i);
                    System.out.println(footer.getText());
                }
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        }
    }

1. Captura de pantalla de las secciones del encabezado Docx.

Secciones de encabezado de Docx

2. Captura de pantalla del encabezado Docx en otra sección.

Docx encabezado otra sección

3. Captura de pantalla del encabezado Docx en otra sección.

Docx encabezado otra sección

4 captura de pantalla

Captura de pantalla

Respuesta 1

En un *.docxdocumento, que contiene varias secciones, cada sección comienza en un párrafo que tiene propiedades de sección establecidas. Para sacar los encabezados y pies de página de las propiedades de sección, hay un constructor público XWPFHeaderFooterPolicy (XWPFDocument doc, org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr sectPr) .

Solo las propiedades de sección para la última sección se establecen en el cuerpo del documento.

Por lo tanto, el siguiente código debería eliminar todos los encabezados y pies de página de todas las secciones del documento.

import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;

public class ReadWordAllHeaderFooters {

 static void getAllHeaderFooterFromPolicy(XWPFHeaderFooterPolicy headerFooterPolicy) {
  XWPFHeader header;
  XWPFFooter footer;
  header = headerFooterPolicy.getDefaultHeader();
  if (header != null) System.out.println("DefaultHeader: " + header.getText());
  header = headerFooterPolicy.getFirstPageHeader();
  if (header != null) System.out.println("FirstPageHeader: " + header.getText());
  header = headerFooterPolicy.getEvenPageHeader();
  if (header != null) System.out.println("EvenPageHeader: " + header.getText());
  header = headerFooterPolicy.getOddPageHeader();
  if (header != null) System.out.println("OddPageHeader: " + header.getText());

  footer = headerFooterPolicy.getDefaultFooter();
  if (footer != null) System.out.println("DefaultFooter: " + footer.getText());
  footer = headerFooterPolicy.getFirstPageFooter();
  if (footer != null) System.out.println("FirstPageFooter: " + footer.getText());
  footer = headerFooterPolicy.getEvenPageFooter();
  if (footer != null) System.out.println("EvenPageFooter: " + footer.getText());
  footer = headerFooterPolicy.getOddPageFooter();
  if (footer != null) System.out.println("OddPageFooter: " + footer.getText());
 }

 public static void main(String[] args) throws Exception {
  XWPFDocument document = new XWPFDocument(new FileInputStream("MultipleHeaderFooters.docx"));
  XWPFHeaderFooterPolicy headerFooterPolicy;

  //are there paragraphs to start sections?
  int section = 1;
  for (XWPFParagraph paragraph : document.getParagraphs()) {
   if (paragraph.getCTP().isSetPPr()) { //paragraph has paragraph properties set
    if (paragraph.getCTP().getPPr().isSetSectPr()) { //paragraph property has section properties set
     //headers and footers in paragraphs section properties:
     headerFooterPolicy = new XWPFHeaderFooterPolicy(document, paragraph.getCTP().getPPr().getSectPr());
     System.out.println("headers and footers in section properties of section " + section++ + ":");
     getAllHeaderFooterFromPolicy(headerFooterPolicy);
    }
   }
  }

  //headers and footers in documents body = headers and footers of last section:
  headerFooterPolicy = new XWPFHeaderFooterPolicy(document);
  System.out.println("headers and footers in documents body = headers and footers of last section " + section + ":");
  getAllHeaderFooterFromPolicy(headerFooterPolicy);

 }
}
Respuesta: 2

Tengo un método que es responsable de crear un archivo XLS usando el libro de trabajo de Apache POI y quiero guardar ese archivo usando JFileChooser. Ahora mismo puedo crear ese archivo usando el escritor de archivos y guardar ...

Actualmente estoy cargando un archivo en Android. Ahora quiero enviar algunos datos, digamos e ID con esa carga de archivo. Así que me ocuparé de esta ID en el lado del servidor. Así es como estoy cargando el archivo. Este código ...

Mi cadena json se produce de la siguiente manera: encabezado ('Tipo de contenido: texto / json'); if (mysql_num_rows ($ result)! = 0) {$ row = mysql_fetch_assoc ($ result); $ jobj = new stdclass (); ...

Primero Scenerio cargó una textura con Stick-util.jar, donde el tamaño de la imagen = 50x50 y el tamaño de la textura = 64x64. Limitó la textura y dibujó un Quad de tamaño 64x64. Y da una imagen de tamaño 50x50. ...