Как написать арабский текстовый файл с отступом? - PullRequest
0 голосов
/ 15 мая 2018

В моей текущей работе мне нужно прочитать содержимое из файла .docx и записать его содержимое в простой текстовый файл, который будет введен для другой задачи.

Ниже приведен мой пример кодакоторый работает для меня для большинства языков, но для арабского языка у меня возникла проблема, так как арабский язык справа налево.

StringBuilder docText = new StringBuilder();
Document currentDoc = word.Documents.Open(file.FullName);
foreach (Paragraph p in currentDoc.Paragraphs)
{
    string paraText = p.Range.Text;
    docText.AppendLine(paraText);
}
currentDoc.Close(false);
if (docText.Length > 0)
{
    string outputTxtpath = output + @"\" + Path.GetFileNameWithoutExtension(file.Name) + ".txt";
    File.WriteAllText(outputTxtpath, docText.ToString(), Encoding.UTF8);
}

Для арабского языка я сталкиваюсь с 2 проблемами:

  1. Текст в текстовом файле находится с левым отступом.
  2. Если абзац начинается с цифры (Изображение 1), то этот номер идет слева от текстового файла.(Рисунок 2), в то время как последовательность других арабских символов такая же, как и у меня, что является проблемой для моего второго инструмента.

Пример ввода (.docx файл) и вывода (.txtфайл) загружен в расположении ниже.много раз искал проблему, но везде я получаю решение о том, как читать арабский текстовый файл.

Docx файл: https://1drv.ms/w/s!Ah-Jh2Ok5SuHgQEl90D9NXlM0CJw
текстовый файл: https://1drv.ms/t/s!Ah-Jh2Ok5SuHgQAEPZur1A3379mr

OriginalText from DOCX file
Converted Text from TXT file

1 Ответ

0 голосов
/ 15 мая 2018

Я предлагаю немного другой способ сохранить файл 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.

enter image description here

В качестве альтернативы 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());
...