Удаление элементов управления контентом из Docx - PullRequest
0 голосов
/ 01 июля 2019

Я хочу заменить элементы управления содержимым (только раскрывающийся список) в docx реальным текстом, а затем применить некоторую логику к документу для извлечения таблиц, используя apache-poi. Если я этого не сделаю, то ячейки с контролем содержимого не будут извлечены. Если я сохраню docx вручную как Word 97-2003 (*.doc), то он попросит удалить все элементы управления содержимым и заменить его выделенным текстом, поэтому я планирую преобразовать docx в doc, чтобы избавиться от него. элементов управления контентом. Я исследовал до сих пор:

  • Я наткнулся на Aspose.words библиотеку, но она платная и может сделать работа всего за 3 строки кода (проверено в пробной версии).
  • Я сам попробовал POI, но не понял, как именно это сделать. Я попробовал ниже код:

XWPFDocument doc = new XWPFDocument(new FileInputStream("<DOCX_FILE_PATH>"));

FileOutputStream fos = new FileOutputStream("<PATH_FOR_DOC_FILE>");
doc.write(fos);
fos.close();

Он создает файл документа, но не удаляет элементы управления содержимым, как это было с aspose.

  • Сейчас я пытаюсь попробовать JODConverter, потому что он опирается на LibreOffice или OpenOffice - у нас его нет на сервере и у нас нет разрешения на установку новых программ.
  • Я посмотрел на Docx4J, но похоже, что он не может сделать это после проверки его API.

Как лучше всего справиться с этим сценарием, есть ли способ напрямую заменить элементы управления контентом? Спасибо!

1 Ответ

1 голос
/ 02 июля 2019

docx4j может удалить элементы управления содержимым

Суть примера кода на https://github.com/plutext/docx4j/blob/master/docx4j-samples-docx4j/src/main/java/org/docx4j/samples/ContentControlRemove.java воспроизведена ниже:

    String input_DOCX = System.getProperty("user.dir") + "/some.docx";

    // resulting docx
    String OUTPUT_DOCX = System.getProperty("user.dir") + "/OUT_ContentControlRemove.docx";

    // Load input_template.docx
    WordprocessingMLPackage wordMLPackage = Docx4J.load(new File(input_DOCX));

    // There is no xml stream
    FileInputStream xmlStream = null;

    Docx4J.bind(wordMLPackage, xmlStream, Docx4J.FLAG_BIND_REMOVE_SDT);

    //Save the document 
    Docx4J.save(wordMLPackage, new File(OUTPUT_DOCX), Docx4J.FLAG_NONE);
...