Я предлагаю немного другой способ сохранить файл Word.Document
, используя внутренний метод Document.SaveAs2 , используя Кодированный текст в качестве выходного формата.
Это позволяет вам использовать кодировку Microsoft Office Unicode , которая должна охватывать все возможные языковые кодировки.
Это также позволяет указать, как двунаправленные меткиследует лечить.Если для этого параметра установлено значение true
, первоначальная двунаправленная настройка сохраняется.
Microsoft.Office.Interop.Word.Application WordApplication = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document DefaultDocument;
DefaultDocument = WordApplication.Documents.Open(FilePath);
CultureInfo culture = new CultureInfo((int)DefaultDocument.Content.LanguageID);
string SaveFileName = Path.Combine(Path.GetDirectoryName(FilePath),
Path.GetFileNameWithoutExtension(FilePath));
DefaultDocument.SaveAs2(SaveFileName, WdSaveFormat.wdFormatEncodedText, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing,
MsoEncoding.msoEncodingUnicodeLittleEndian, Type.Missing, Type.Missing,
Type.Missing, true); //<- BiDi Marks
//Release the Document
foreach (Document WDocument in WordApplication.Documents)
{
WDocument.Close(WdSaveOptions.wdDoNotSaveChanges);
Marshal.ReleaseComObject(WDocument);
}
//Release the WINWORD Process
WordApplication.Quit(WdSaveOptions.wdDoNotSaveChanges);
Marshal.ReleaseComObject(WordApplication);
Marshal.CleanupUnusedObjectsInCurrentContext();
//Test the results using a RichTextBox
richTextBox1.RightToLeft = (culture.TextInfo.IsRightToLeft) ? RightToLeft.Yes : RightToLeft.No;
richTextBox1.ImeMode = ImeMode.On;
richTextBox1.Text = File.ReadAllText(SaveFileName + ".txt");
Это результат, как показано в элементе управления RichTextBox.
В качестве альтернативы Document.SaveAs2
вы можете получить кодировку из числового значения Document.LanguageID , которое ссылается на CultureInfo
идентификатор культуры (LCID).
(culture
уже был определен в предыдущем коде)
Encoding encoding = (culture.TextInfo.IsRightToLeft)
? Encoding.GetEncoding(culture.TextInfo.ANSICodePage)
: Encoding.Unicode;
using (MemoryStream MemStream = new MemoryStream(encoding.GetBytes(DefaultDocument.Content.Text)))
using (StreamReader reader = new StreamReader(MemStream, encoding))
File.WriteAllText(SaveFileName + ".txt", reader.ReadToEnd());