1

あなたのアイデアを共有してください!フォルダを確認し、PDF内の拡張子が異なる一連のドキュメントを変換する際に問題が発生しました

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Office.Interop.Word;
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {

            Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
            object oMissing = System.Reflection.Missing.Value;
            word.Visible = false;
            word.ScreenUpdating = false;


            object aa = WdOpenFormat.wdOpenFormatAuto;
            string errorMessage = null;


            word.DisplayAlerts = WdAlertLevel.wdAlertsNone;

            //selection extension 

            var allExtentionGroupFiles = Directory.GetFiles(@"C:\path", "*.*").
                Where(s=>!s.Contains("~$") && (s.EndsWith(".docx") 
                || s.EndsWith(".doc")
                || s.EndsWith(".docm")
                || s.EndsWith(".dotx")
                || s.EndsWith(".dotm")
                || s.EndsWith(".dot")
                || s.EndsWith(".mht")
                || s.EndsWith(".mhtml")
                || s.EndsWith(".rtf")
                || s.EndsWith(".txt")
                || s.EndsWith(".xml")
                || s.EndsWith(".odt")
                || s.EndsWith(".wps"))).
                GroupBy(s=>s.Substring(s.LastIndexOf('.'))).OrderBy(s=>s.Key);

            foreach (var currentExtentionGroup in allExtentionGroupFiles)
            {

                Console.WriteLine("-->>{0}", currentExtentionGroup.Key);
                foreach (var currentDoc in currentExtentionGroup)
                {

                    Object filename = (Object)currentDoc;



                    try
                    {
                        //open current document

                        Document document = word.Documents.Open(filename,ConfirmConversions:aa,OpenAndRepair:true,Revert:true);

                        document.Activate();


                        object outputFileName = currentDoc.Replace(currentExtentionGroup.Key, ".pdf").Insert(10, "TEST");
                        object fileFormat = WdSaveFormat.wdFormatPDF;


                        document.SaveAs(ref outputFileName,
                        ref fileFormat, ref oMissing, ref oMissing,
                        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                        ref oMissing, ref oMissing, ref oMissing, ref oMissing);



                        document.Close();

                    }
                    catch (Exception e1)
                    {
                        errorMessage = e1.ToString();

                    }
                }
            }

word.Quit();

}

    }
}

コードが機能している場合、問題は、ドキュメントを開くと、許可されている拡張子がすべて正しく機能することですが、たとえば、フォルダc:\pathが破損しているドキュメントの例DoSomething.exeDoSomething.docの拡張子を誰かが変更したとします。応答を停止するWordで、このファイルを手動で開こうとすると、モーダルウィンドウのファイル変換が表示されます。この場合の対処方法

4

2 に答える 2

1

残念ながら、私が知る限り、Officeオブジェクトモデルは、Officeアプリケーションのフリーズを検出または回復する手段を提供していません。ドキュメントを破損する必要はありません。WordからPDFへの変換は、他の方法で有効なドキュメントに対してフリーズすることがあります。

私が見つけた唯一の解決策は、単一のドキュメントで変換を実行する別のプロセス(スレッドだけでなく)を生成し、メインプロセスに限られた時間(たとえば5分)以内に完了するのを待つことでした。タイムアウトが経過した場合、メインプロセスは変換プロセスを終了し、ドキュメントを処理不可としてマークする必要があります。

コマンドラインパラメータを介してWordドキュメントへのフルパスを受け取る.NETコンソールアプリケーションとして、変換プロセスとして起動するプログラムを作成できます。

于 2012-04-04T19:05:40.777 に答える
1

私も同様の状況でした。1つの解決策は2つのスレッドでサブプロセスを作成することでした。1つはWordと対話し、もう1つは「ウォッチドッグ」です...「ウォッチドッグ」スレッドは、モーダルウィンドウが表示されたかどうかとプレ-定義されたタイムアウトは...これらのいずれの場合でも、ワードプロセスを強制終了し、他のスレッドが終了するのを待ちます-他のスレッドが事前定義された時間内に終了しなかった場合、他のスレッドを強制終了します...

これは問題なく機能しましたが、同じ状況で、単語を難しい方法で強制終了すると、一時ファイルがクリーンアップされないことから、一部の単語設定が破棄されることまで、不快な副作用が発生することがわかりました...

この変換には、Wordをまったくインストールする必要のないサードパーティのライブラリを使用することになりました。このソリューションには非常に満足しています。パフォーマンスが大幅に向上し、問題のあるドキュメントの場合は、それに応じて処理できる例外が発生します。 ...私が使用しているライブラリは商用のものです...それがあなたのオプションである場合、私はリンクを提供することができます...

于 2012-04-04T19:33:16.380 に答える