РЕДАКТИРОВАТЬ [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-схемы 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;
все в этом классе является автономным.
РЕДАКТИРОВАТЬ [FIX]
Исправление состоит в добавлении второй строки в этот фрагмент.
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.