有没有办法如何在java中禁用Word文档的拼写检查?

时间:2017-02-16 13:51:46

标签: java apache-poi docx4j

我正在使用docx4j创建MS Word文档,而在MS Word中,所有文本都标有拼写检查,因为文本被归为英语,但它是不同的语言。有没有办法如何使用docx4j或Apache POI禁用拼写检查?

4 个答案:

答案 0 :(得分:1)

没有一个地方可以关闭整个文档的校样。相反,必须为文档中的每次运行关闭它。您可以使用Apache POI执行此操作,但必须使用CT类,因为此属性尚未浮出水面。以下是一次运行 switch(Choice){ case 1 : //do something case 2 : //do something case 8 : //do something default: //to do default operation break; case 3 : case 4 : } 的方法。

r

现在循环运行,并为每次运行调用此方法。

答案 1 :(得分:1)

有可能“仅在此文档中隐藏拼写错误”和“仅在此文档中隐藏语法错误”。见How to Temporarily Disable Spell Check in Word

使用XWPF(*.docx),XML的内容包含在/word/settings.xml中,如下所示:

<w:settings ...>
...
 <w:hideSpellingErrors/>
 <w:hideGrammaticalErrors/>
...
</w:settings >

我们可以设置此项,而无需使用XWPFWorkbookOPCPackagePackagePart对象创建整个org.openxmlformats.schemas.wordprocessingml.x2006.main.*

示例:

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();

 }

}

在此代码之后,文档XWPFDisableSpellCheck.docx中设置了“仅在此文档中隐藏拼写错误”和“仅隐藏此文档中的语法错误”选项。

答案 2 :(得分:0)

据我所知,POI无法达到用户偏好。但是您可以自己更改它并将该文档用作所有未来文档的模板。

答案 3 :(得分:0)

披露:我维护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"/>

您可以维护每种语言的模板,也可以使用docx4j动态更改这些设置。如果你想这样做并有任何问题,请发一个单独的问题。

关于隐藏拼写/语法错误,假设MainDocumentPart mdp:

DocumentSettingsPart dsp = mdp.getDocumentSettingsPart();
dsp.getContents().setHideGrammaticalErrors(new BooleanDefaultTrue());
dsp.getContents().setHideSpellingErrors(new BooleanDefaultTrue());