0

私の現在の作業では、ファイルからコンテンツを読み取り、.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. txt ファイル内のテキストは左インデントにあります。
  2. 段落が数字で始まる場合 (画像 1)、その数字はテキスト ファイルの左側に表示されますが (画像 2)、他のアラビア文字シーケンスはそのままで、これは私の 2 番目のツールの問題です。

.docx入力 (ファイル) と出力 (ファイル) のサンプル.txtは、以下の場所にアップロードされます。問題をよく検索しましたが、どこでもアラビア語のテキストファイルを読む方法の解決策を得ています。

Docx ファイル: https://1drv.ms/w/s!Ah-Jh2Ok5SuHgQEl90D9NXlM0CJw
テキスト ファイル: https://1drv.ms/t/s!Ah-Jh2Ok5SuHgQAEPZur1A3379mr

DOCXファイルからのオリジナルテキスト
TXT ファイルから変換されたテキスト

4

1 に答える 1

0

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 コントロールに示されている結果です。

ここに画像の説明を入力

の代わりに、カルチャ識別子 (LCID)を参照するDocument.LanguageID数値Document.SaveAs2からエンコーディングを取得できます。 (は前のコードで既に定義されています)CultureInfo
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());
于 2018-05-15T16:43:35.310 に答える