有没有办法在 java 中禁用 Word 文档的拼写检查?
Is there a way how to disable spell checking for Word document in java?
我正在使用 docx4j 创建 MS Word 文档,在 MS Word 中,所有文本都标有拼写检查器,因为文本被归类为英语,但它是不同的语言。有没有办法使用 docx4j 或 Apache POI 禁用拼写检查?
据我所知,POI 达不到那个用户偏好。但您可以自己更改它,并将该文档用作所有未来文档的模板。
没有一个地方可以关闭整个文档的校对。相反,必须为文档中的每个 运行 关闭它。您可以使用 Apache POI 做到这一点,但您必须使用 CT 类,因为此 属性 尚未浮出水面。这是您可以针对单个 运行 r
.
执行此操作的一种方法
public static void setNoProof (XWPFRun run) {
CTR ctR = run.getCTR();
CTRPr ctRPr = ctR.isSetRPr() ? ctR.getRPr() : ctR.addNewRPr();
if (!ctRPr.isSetNoProof()) {
// If the noProof property is missing, add it
ctRPr.addNewNoProof();
} else {
// If the noProof property is present, make sure it is not
// FALSE, OFF, or X_0
CTOnOff noProof = ctRPr.getNoProof();
if (noProof.isSetVal() &&
(noProof.getVal() == STOnOff.FALSE ||
noProof.getVal() == STOnOff.OFF ||
noProof.getVal() == STOnOff.X_0)) {
noProof.setVal(STOnOff.TRUE);
}
}
}
现在遍历您的 运行,并为每个 运行.
调用此方法
有可能"Hide spelling errors in this document only"和"Hide grammar errors in this document only"。参见 How to Temporarily Disable Spell Check in Word。
使用 XWPF (*.docx
) XML 包含在 /word/settings.xml
中,看起来像:
<w:settings ...>
...
<w:hideSpellingErrors/>
<w:hideGrammaticalErrors/>
...
</w:settings >
我们可以在不使用 OPCPackage
、PackagePart
和 org.openxmlformats.schemas.wordprocessingml.x2006.main.*
对象创建整个 XWPFWorkbook
的情况下进行设置。
示例:
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.regex.Pattern;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.SettingsDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSettings;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
import org.apache.xmlbeans.XmlOptions;
import javax.xml.namespace.QName;
import java.util.Map;
import java.util.HashMap;
public class XWPFDisableSpellCheck {
public static void main(String[] args) throws Exception {
File file = new File("XWPFDisableSpellCheck.docx");
OPCPackage opcPackage = OPCPackage.open(file);
PackagePart settingsPart = opcPackage.getPartsByName(Pattern.compile("/word/settings.xml")).get(0);
SettingsDocument settingsDocument = SettingsDocument.Factory.parse(settingsPart.getInputStream());
CTSettings settings = settingsDocument.getSettings();
if (settings.getHideSpellingErrors() == null) settings.addNewHideSpellingErrors();
if (settings.getHideGrammaticalErrors() == null) settings.addNewHideGrammaticalErrors();
//settings.getHideSpellingErrors().setVal(STOnOff.ON);
//settings.getHideGrammaticalErrors().setVal(STOnOff.ON);
//create XmlOptions for saving the settings
XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setSaveOuter();
xmlOptions.setUseDefaultNamespace();
xmlOptions.setSaveAggressiveNamespaces();
xmlOptions.setCharacterEncoding("UTF-8");
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTSettings.type.getName().getNamespaceURI(), "settings"));
Map<String, String> map = new HashMap<String, String>();
map.put(STRelationshipId.type.getName().getNamespaceURI(), "w");
map.put(STRelationshipId.type.getName().getNamespaceURI(), "m");
map.put(STRelationshipId.type.getName().getNamespaceURI(), "o");
xmlOptions.setSaveSuggestedPrefixes(map);
//save the settings
OutputStream out = settingsPart.getOutputStream();
settings.save(out, xmlOptions);
out.close();
opcPackage.close();
}
}
在此代码之后,选项 "Hide spelling errors in this document only" 和 "Hide grammar errors in this document only" 在文档 XWPFDisableSpellCheck.docx
中设置。
披露:我维护 docx4j
当您使用 XHTMLImporter 时,您应该使用合适的语言设置导入到 docx。
通常这是在样式部分完成的,w:styles/w:docDefaults/w:rPrDefault/w:rPr:
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:docDefaults>
<w:rPrDefault>
<w:rPr>
<w:lang w:val="en-US" w:eastAsia="ko-KR" w:bidi="ar-SA"/>
</w:rPr>
</w:rPrDefault>
</w:docDefaults>
这个值将有效,除非在样式中被覆盖,或者在其他一些答案讨论的直接格式中被覆盖。
此外,在 /word/settings.xml 中,检查 w:themeFontLang:
<w:settings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" >
<w:themeFontLang w:val="en-US" w:eastAsia="ko-KR"/>
您可以维护 per-language 模板,也可以使用 docx4j 动态更改这些设置。如果您想这样做但遇到任何问题,请 post 单独提问。
关于隐藏 spelling/grammar 错误,假设 MainDocumentPart mdp:
DocumentSettingsPart dsp = mdp.getDocumentSettingsPart();
dsp.getContents().setHideGrammaticalErrors(new BooleanDefaultTrue());
dsp.getContents().setHideSpellingErrors(new BooleanDefaultTrue());
我正在使用 docx4j 创建 MS Word 文档,在 MS Word 中,所有文本都标有拼写检查器,因为文本被归类为英语,但它是不同的语言。有没有办法使用 docx4j 或 Apache POI 禁用拼写检查?
据我所知,POI 达不到那个用户偏好。但您可以自己更改它,并将该文档用作所有未来文档的模板。
没有一个地方可以关闭整个文档的校对。相反,必须为文档中的每个 运行 关闭它。您可以使用 Apache POI 做到这一点,但您必须使用 CT 类,因为此 属性 尚未浮出水面。这是您可以针对单个 运行 r
.
public static void setNoProof (XWPFRun run) {
CTR ctR = run.getCTR();
CTRPr ctRPr = ctR.isSetRPr() ? ctR.getRPr() : ctR.addNewRPr();
if (!ctRPr.isSetNoProof()) {
// If the noProof property is missing, add it
ctRPr.addNewNoProof();
} else {
// If the noProof property is present, make sure it is not
// FALSE, OFF, or X_0
CTOnOff noProof = ctRPr.getNoProof();
if (noProof.isSetVal() &&
(noProof.getVal() == STOnOff.FALSE ||
noProof.getVal() == STOnOff.OFF ||
noProof.getVal() == STOnOff.X_0)) {
noProof.setVal(STOnOff.TRUE);
}
}
}
现在遍历您的 运行,并为每个 运行.
调用此方法有可能"Hide spelling errors in this document only"和"Hide grammar errors in this document only"。参见 How to Temporarily Disable Spell Check in Word。
使用 XWPF (*.docx
) XML 包含在 /word/settings.xml
中,看起来像:
<w:settings ...>
...
<w:hideSpellingErrors/>
<w:hideGrammaticalErrors/>
...
</w:settings >
我们可以在不使用 OPCPackage
、PackagePart
和 org.openxmlformats.schemas.wordprocessingml.x2006.main.*
对象创建整个 XWPFWorkbook
的情况下进行设置。
示例:
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.regex.Pattern;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.SettingsDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSettings;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
import org.apache.xmlbeans.XmlOptions;
import javax.xml.namespace.QName;
import java.util.Map;
import java.util.HashMap;
public class XWPFDisableSpellCheck {
public static void main(String[] args) throws Exception {
File file = new File("XWPFDisableSpellCheck.docx");
OPCPackage opcPackage = OPCPackage.open(file);
PackagePart settingsPart = opcPackage.getPartsByName(Pattern.compile("/word/settings.xml")).get(0);
SettingsDocument settingsDocument = SettingsDocument.Factory.parse(settingsPart.getInputStream());
CTSettings settings = settingsDocument.getSettings();
if (settings.getHideSpellingErrors() == null) settings.addNewHideSpellingErrors();
if (settings.getHideGrammaticalErrors() == null) settings.addNewHideGrammaticalErrors();
//settings.getHideSpellingErrors().setVal(STOnOff.ON);
//settings.getHideGrammaticalErrors().setVal(STOnOff.ON);
//create XmlOptions for saving the settings
XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setSaveOuter();
xmlOptions.setUseDefaultNamespace();
xmlOptions.setSaveAggressiveNamespaces();
xmlOptions.setCharacterEncoding("UTF-8");
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTSettings.type.getName().getNamespaceURI(), "settings"));
Map<String, String> map = new HashMap<String, String>();
map.put(STRelationshipId.type.getName().getNamespaceURI(), "w");
map.put(STRelationshipId.type.getName().getNamespaceURI(), "m");
map.put(STRelationshipId.type.getName().getNamespaceURI(), "o");
xmlOptions.setSaveSuggestedPrefixes(map);
//save the settings
OutputStream out = settingsPart.getOutputStream();
settings.save(out, xmlOptions);
out.close();
opcPackage.close();
}
}
在此代码之后,选项 "Hide spelling errors in this document only" 和 "Hide grammar errors in this document only" 在文档 XWPFDisableSpellCheck.docx
中设置。
披露:我维护 docx4j
当您使用 XHTMLImporter 时,您应该使用合适的语言设置导入到 docx。
通常这是在样式部分完成的,w:styles/w:docDefaults/w:rPrDefault/w:rPr:
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:docDefaults>
<w:rPrDefault>
<w:rPr>
<w:lang w:val="en-US" w:eastAsia="ko-KR" w:bidi="ar-SA"/>
</w:rPr>
</w:rPrDefault>
</w:docDefaults>
这个值将有效,除非在样式中被覆盖,或者在其他一些答案讨论的直接格式中被覆盖。
此外,在 /word/settings.xml 中,检查 w:themeFontLang:
<w:settings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" >
<w:themeFontLang w:val="en-US" w:eastAsia="ko-KR"/>
您可以维护 per-language 模板,也可以使用 docx4j 动态更改这些设置。如果您想这样做但遇到任何问题,请 post 单独提问。
关于隐藏 spelling/grammar 错误,假设 MainDocumentPart mdp:
DocumentSettingsPart dsp = mdp.getDocumentSettingsPart();
dsp.getContents().setHideGrammaticalErrors(new BooleanDefaultTrue());
dsp.getContents().setHideSpellingErrors(new BooleanDefaultTrue());