Скопируйте (и измените) файл docx, обходя его при помощи docx4j - PullRequest
0 голосов
/ 03 мая 2019

Я нашел здесь пример, который пересекает существующий файл docx и печатает его необработанный XML на стандартном выводе. Я хотел бы преобразовать такой пример в фрагмент кода, который копирует документ при его обходе в новый файл, а не просто выводит его на стандартный вывод. Моя цель в конечном итоге скопировать его с некоторыми предписанными добавлениями текста.

Я не знаю точно, как изменить приведенный ниже фрагмент кода, чтобы воссоздать элементы в новом WordprocessingMLPackage, когда они встречаются в исходном.

new TraversalUtil(body,
            new Callback() {
              String indent = "";
              @Override
              public List<Object> apply(Object o) {
                String wrapped = "";
                if (o instanceof JAXBElement)
                  wrapped =  " (wrapped in JAXBElement)";
                o = XmlUtils.unwrap(o);
                String text = "";
                if (o instanceof org.docx4j.wml.Text)
                  text = ((org.docx4j.wml.Text) o).getValue();
                System.out.println(indent + o.getClass().getName() + wrapped + "  \""
                        + text + "\"");
                return null;
              }
              // other code
            } // end of Callback(){ ... }
);

Я также попробовал другой подход: изменить необработанный XML, разархивировав docx и манипулируя файлом "word / document.xml". Когда я заархивирую разархивированную папку и переименую ее в docx, MS Word не сможет ее открыть.

1 Ответ

1 голос
/ 04 мая 2019

Копирование объектов легко; Вы можете использовать XmlUtils.deepCopy: https://github.com/plutext/docx4j/blob/master/docx4j-core/src/main/java/org/docx4j/XmlUtils.java#L1022

НО многие фрагменты WordML имеют неявные или явные формальные отношения с другими частями XML-файла, которыми вы должны управлять, чтобы получить ожидаемые результаты. Подробнее https://www.docx4java.org/blog/2010/11/merging-word-documents/

Например, если объект ссылается на изображение, вам необходимо включить его. Если абзац ссылается на стиль, который отсутствует, он останется без стиля. и т. д.

...