Может кто-нибудь поделиться, как удалить абзац из текстового поля - PullRequest
0 голосов
/ 23 декабря 2019

В настоящее время я работаю над проектом по манипулированию файлом Docx с помощью проекта Apache POI. Я использовал API для удаления текста из прогона внутри текстового поля, но не могу понять, как удалить абзац внутри текстового поля. Я предполагаю, что мне нужно использовать класс CTP, чтобы получить объект абзаца для удаления. Любые примеры или предложения будут с благодарностью.

1 Ответ

0 голосов
/ 25 декабря 2019

In Заменить текст в текстовом поле docx с помощью Apache POI Я показал, как заменить текст в Word text-box-content. Подход заключается в получении списка XML элементов текстового прогона из XPath .//*/w:txbxContent/w:p/w:r с использованием XmlCursor, который выбирает этот путь из /word/document.xml.

То же самое можно сделать, используяпуть .//*/w:txbxContent/w:p, который получает текстовые абзацы в text-box-content. Имея эти низкоуровневые абзацы XML, мы можем преобразовать их в XWPFParagraph s, чтобы получить из них простой текст. Затем, если обычный текст содержит некоторый критерий, мы можем просто удалить абзац XML.

Источник:

enter image description here

Код:

import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlCursor;

import  org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;

import java.util.List;
import java.util.ArrayList;

public class WordRemoveParagraphInTextBox {

 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument(new FileInputStream("WordRemoveParagraphInTextBox.docx"));

  for (XWPFParagraph paragraph : document.getParagraphs()) {
   XmlCursor cursor = paragraph.getCTP().newCursor();
   cursor.selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:txbxContent/w:p");

   List<XmlObject> ctpsintxtbx = new ArrayList<XmlObject>();

   while(cursor.hasNextSelection()) {
    cursor.toNextSelection();
    XmlObject obj = cursor.getObject();
    ctpsintxtbx.add(obj);
   }
   for (XmlObject obj : ctpsintxtbx) {
    CTP ctp = CTP.Factory.parse(obj.xmlText());
    //CTP ctp = CTP.Factory.parse(obj.newInputStream());
    XWPFParagraph bufferparagraph = new XWPFParagraph(ctp, document);
    String text = bufferparagraph.getText();
    if (text != null && text.contains("remove")) {
     obj.newCursor().removeXml();
    }
   }
  }

  FileOutputStream out = new FileOutputStream("WordRemoveParagraphInTextBoxNew.docx");
  document.write(out);
  out.close();
  document.close();
 }
}

Результат:

enter image description here

...