有没有办法在 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 >

我们可以在不使用 OPCPackagePackagePartorg.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());