2013-04-12 19 views
7

別のチーム用のユーティリティを書いて、再帰的にフォルダを通過し、C#でWord Interopを使用してWord文書をPDFに変換します。開けばWord文書のフィールドが更新されないようにする

問題は、保存される前に今日の日付に更新される日付フィールドでドキュメントが作成されていることです。印刷する前にフィールドの更新を無効にする方法を見つけましたが、フィールドが開いている間更新されないようにする必要があります。

これは可能ですか?私はC#での修正をしたいと思いますが、Wordマクロを実行する必要がある場合はできます。

答えて

1

私はInteropでそれを行う方法は見つけられませんでしたが、私の会社はAspose.Wordsを購入し、Word文書をTIFF画像に変換するユーティリティを書きました。 Asposeツールは、明示的に指示しない限りフィールドを更新しません。 Asposeで使用したコードのサンプルを以下に示します。 Word文書を1ページのTIFF画像に変換する必要があり、このプロジェクトでは単なるユーティリティであったため、多くのオプションをハードコードしました。

private static bool ConvertWordToTiff(string inputFilePath, string outputFilePath) 
    { 
     try 
     { 
      Document doc = new Document(inputFilePath); 

      for (int i = 0; i < doc.PageCount; i++) 
      { 
       ImageSaveOptions options = new ImageSaveOptions(SaveFormat.Tiff); 
       options.PageIndex = i; 
       options.PageCount = 1; 
       options.TiffCompression = TiffCompression.Lzw; 
       options.Resolution = 200; 
       options.ImageColorMode = ImageColorMode.BlackAndWhite; 

       var extension = Path.GetExtension(outputFilePath); 
       var pageNum = String.Format("-{0:000}", (i+1)); 
       var outputPageFilePath = outputFilePath.Replace(extension, pageNum + extension); 

       doc.Save(outputPageFilePath, options); 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      LogError(ex); 
      return false; 
     } 
    } 
4

Microsoftの無限の迷路documentationに記載されているように、フィールドコードをロックすることができます。私は

{DATE \@ "M/d/yyyy h:mm:ss am/pm" \* MERGEFORMAT } 

の形で体内で単一の日付フィールドを持っている場合、VBAの例では、私は、ドキュメントに変更を加える場合は、その後、保存し再その後

ActiveDocument.Fields(1).Locked = True 

を実行することができますフィールドコードは更新されません。 C#のオフィス相互運用機能を使用して

例:

Word.Application wordApp = new Word.Application(); 
Word.Document wordDoc = wordApp.ActiveDocument; 
wordDoc.Fields.Locked = 1; //its apparently an int32 rather than a bool 

あなたはDocumentOpenイベントにコードを配置することができます。私はあなたがイベントを購読するアドインを持っていると仮定しています。そうでない場合は、それ自体が戦闘になる可能性があるので、明確にしてください。

EDIT:この方法でフィールドをロックすると、すべてStoryRangesにフィールドがロックされるため、ヘッダー、フッター、脚注、テキストボックスなどでフィールドインスタンスを取得する必要はありません。これは驚くべきことです治療する。

+0

私はこれをWord Interopサンプルアプリケーションを使用して試しましたが、「DocumentOpen」イベント内にロッキングコードを挿入するというトリックはそのようなことをしていないようです。日付フィールドは、イベントが発生する前に更新されます。つまり、この修正によって問題が解決されません。しかし、文書の最初の保存時にフィールドがロックされていた場合は、記述したように問題が解決されてしまいますが、残念なことにそうではありません。 –

+0

これにはXMLを使用する必要があります – JohnZaj

0

これは、Office InteropではなくXML処理を必要とするため、SOに関する新しい質問が適切だと思います。変換する.docファイル形式と.docxファイル形式の両方がある場合は、WordML(Word 2003 XML形式)とOpen XML(Word 2007/2010/2013 XML形式)の2種類のソリューションが必要になる場合があります。古いファイル形式を保存し、フィールドを更新せずに新しいものとして保存します。

ロックされたフィールドのOOXMLを検査すると、thisw:fldLock="1"という属性が表示されます。これは、OOXML SDKなどの適切なXML処理を使用して、または標準のXSLTトランスフォームを使用して、ドキュメントに対して挿入することができます。

役立つ可能性があります:how-do-i-unlock-a-content-control-using-the-openxml-sdk-in-a-word-2010-documentコンテンツコントロールの場合も同様の問題が考えられます。 LockおよびLockingValuesタイプが同じ方法をフィールドに適用する場合、Fieldsに同じソリューションを適用できます。私はしかし、これは確信していません。

これがより確実であることを確認するには、このベンダーのsolutionの例を参照してください。これを社内で開発する必要がある場合は、openxmldeveloper.orgを開始するのが良い場所です。thisなどのフィールドを操作するためのEric Whiteの例を探してください。

関連する問題