Как вставить docx в предопределенную строку другого docx

#java #apache-poi #docx #docx4j

#java #apache-poi #docx #docx4j

Вопрос:

Моя цель — вставить docx (с сохранением стиля / форматирования) в определенную строку другого docx. Во втором docx есть слово «заполнитель», и сначала я должен найти это слово, а затем изменить его на первый текст docx, сохранив вставленные стили и форматы docx.

У меня есть идея. Может быть, мне следует создать новый docx, разделить второй docx с помощью «заполнителя», поместить первую часть в новый docx, затем поместить весь docx, а затем поместить вторую часть второго docx. Но как я могу сохранить стили и форматы? У меня нет изображений / табличек или чего-либо еще, только тексты и форматирование, такие как списки, вкладки, стиль текста и т.д.

В настоящее время я использую apache POI и java. (Я пробовал docx4j, но у меня было меньше успеха) Пример кода выполняет простое слияние, но не более того. Как я могу найти слово «заполнитель» и вставить туда свой docx?

 public static void mer&e(InputStream src1, InputStream src2, OutputStream dest) throws Exception {
    OPCPacka&e src1Packa&e = OPCPacka&e.open(src1);
    OPCPacka&e src2Packa&e = OPCPacka&e.open(src2);
    XWPFDocument src1Document = new XWPFDocument(src1Packa&e);
    CTBody src1Body = src1Document.&etDocument().&etBody();
    XWPFDocument src2Document = new XWPFDocument(src2Packa&e);
    CTBody src2Body = src2Document.&etDocument().&etBody();
    appendBody(src1Body, src2Body);
    src1Document.write(dest);
}

private static void appendBody(CTBody src, CTBody append) throws Exception {
    XmlOptions optionsOuter = new XmlOptions();
    optionsOuter.setSaveOuter();
    Strin& appendStrin& = append.xmlText(optionsOuter);
    Strin& srcStrin& = src.xmlText();
    Strin& prefix = srcStrin&.substrin&(0, srcStrin&.indexOf("&&t;")   1);
    Strin& mainPart = srcStrin&.substrin&(srcStrin&.indexOf("&&t;")   1, srcStrin&.lastIndexOf("<"));
    Strin& suffix = srcStrin&.substrin&(srcStrin&.lastIndexOf("<"));
    Strin& addPart = appendStrin&.substrin&(appendStrin&.indexOf("&&t;")   1, appendStrin&.lastIndexOf("<"));
    CTBody makeBody = CTBody.Factory.parse(prefix   mainPart   addPart   suffix);
    src.set(makeBody);
}
  

Ответ №1:

После docx4j вы можете вставить docx в определенное место (например, в ячейку таблицы) с помощью Mer&eDocx в нашем коммерческом Docx4j Enterprise.

Вы можете получить пробную версию от https://www.plutext.com/m/index.php/products

Затем ознакомьтесь с примером Mer&eIntoTableCell и документацией.

Ответ №2:

Другое решение таково: в моем примере в mainPart мы можем найти текст (использование indexof / lastindexof / substrin& лучше, чем использование re&ex) и добавить (и заменить текст на) addPart и готово к работе.

2 возможные проблемы:

  • 1: если у нас есть нумерованные списки / маркированные списки в AddPart, это может привести к беспорядку после добавления в другой документ.
  • 2. вставка изображения таким образом невозможна, оно должно обрабатываться другим способом.

Комментарии:

1. Правильно, ваш подход работает только для простых случаев (что может быть приемлемо в вашем приложении, если содержимое вставляемого docx предсказуемо). Он не сохраняет стиль / форматирование, которое было требованием, содержащимся в вашем вопросе…

2. Что ж, решение сохраняет следующее: размер и типы шрифтов / курсив / жирный шрифт / подчеркивание / табуляции / расстояния от полей, что является хорошим началом. 🙂 Да, у меня проблемы со стилями и списками. (У меня есть идея исправить и эти вещи, конечно, не лучшие решения, но мы посмотрим) Но позже я попробую Docx4j еще раз, и, возможно, мы сможем обсудить это позже. (но я бы предпочел бесплатное решение / библиотеку с открытым исходным кодом)