EDIT[FIX] - см. внизу.
MS Office создает этот элемент во всех документах с некоторым базовым знанием того, что ограничения NS должны соблюдаться до определенной степени...
Пример документа MS:
<w:document
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
mc:Ignorable="w14 w15 wp14">
<!--whatever-->
</w:document>
Пример вывода POI
<w:document
mc:Ignorable="w14 w15 wp14"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
<!--whatever-->
</w:document>
Обратите внимание, что элемент MC:IGNORABLE смещен... Изменение этого элемента вручную внутри самого архива docx «исправляет» ошибку, вызванную программой MSOffice, которая указывает на ошибку в строке 2, столбце 0.
До сих пор я пробовал:
xwpfDocument.getDocument().getDomNode()
^ пробовали изменять, удалять и добавлять атрибуты в правильном порядке... не работает, поскольку сдвиг, кажется, происходит где-то в процедуре XWPFDocument.write().
Я также пытался извлечь файл document.xml из архива docx, изменить его и вставить обратно в архив... и это, похоже, не работает... Проблемы с CRC...
Есть ли способ получить доступ к OPCPackage или его части или чему-либо, чтобы разрешить прямой вызов встроенного «recalculateAttributesRelativeToNS» в этом элементе?
... или в качестве альтернативы .. как мне автоматизировать изменения dom в файле xml документа внутри архива и при этом обеспечить совместимость с ms?
[РЕДАКТИРОВАТЬ: "XY"]
Такое поведение проявляется в следующем сценарии:
fis = new FileInputStream(new File(path));
XWPFPicture picture = imageRun.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG, path, Units.toEMU(450), Units.toEMU(290));
Документ открывается нормально. проблема отсутствует.
Добавление этой строки (я знаю, что это технически неправильно, однако об ошибке не следует сообщать в строке 2 — столбец 0, так как об этом следует сообщать дальше по xml) все портит.
picture.getCTPicture().getSpPr().addNewEffectLst().addNewOuterShdw().setBlurRad(10000);
С добавлением этой строки атрибуты w:document переходят в состояние 2 (пример poi), тем самым запуская процедуру аннулирования схемы NS MS Office.
Атрибуты правильные. Порядок неправильный. Перемещение вручную атрибута mc:ignorable в конец списка атрибутов решает проблему, и документ загружается без проблем.
Это, скорее всего, связано с тем, что (в правильной реализации) атрибут xmlns:mc предшествует атрибуту mc:ignorable в списке атрибутов, тогда как в выводе poi это не так (mc:Ignorable является первым элементом в списке). ).
отсюда... вопрос.
дополнительно... список импорта:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.POIXMLProperties;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFPicture;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;
все в этом классе самодостаточно.
РЕДАКТИРОВАТЬ [ИСПРАВИТЬ]
Исправление заключается в добавлении второй строки в этот фрагмент.
picture.getCTPicture().getSpPr().addNewEffectLst().addNewInnerShdw().setBlurRad(Units.toEMU(3));
picture.getCTPicture().getSpPr().getEffectLst().getInnerShdw().addNewPrstClr().setVal(org.openxmlformats.schemas.drawingml.x2006.main.STPresetColorVal.BLACK);
Еще раз спасибо, @AxelRichter.
apache poi
создали*.docx
файлов с помощьюapache poi
без этой проблемы. Так что я подозреваю, что проблема где-то за пределамиapache poi
. Пожалуйста, предоставьте самый простой*.docx
исходный файл и самый простойapache poi
код, который приводит к повреждению этого файла. И, пожалуйста, опишите свое окружение. Какаяapache poi
версия используется? КакаяJava
версия используется? Какие дополнительныеJava
библиотеки, особенно для созданияXML
, задействованы? - person Axel Richter   schedule 14.11.2018