5

PDFとして保存する前に、透かし画像(ひな形として使用)をドキュメントに追加する必要があるコードで大きな問題が発生しています。関連するすべてのヘッダーに画像を挿入しても問題ありません。しかし、画像(図形)をページの幅と高さ全体に拡大しようとすると、Word 2007(SP3)は例外をスローします。同じコードがWord2010(SP1)で正常に機能します。Office12またはOffice14の相互運用機能アセンブリを使用するかどうかは関係ありません(常に「埋め込み相互運用機能の種類」がtrueで使用されます)。

スローされる例外は次のとおりです。

System.Runtime.InteropServices.COMException (0x800A122C): Falscher Zeichnungselement-Typ für diesen Befehl.
   at Microsoft.Office.Interop.Word.Shape.set_RelativeHorizontalSize(WdRelativeHorizontalSize prop)
   at BEKO.PDB.AuxiliaryServices.Documents.WordCreationService.AddWatermarkToHeader(HeaderFooter header, String watermarkFilePath)

英語のエラーメッセージが何であるか正確にはわかりませんが、翻訳は「このコマンドの無効なペイントタイプ(またはおそらくシェイプタイプ)」のようなものです。

奇妙なことに、同じ相互運用機能の呼び出しで常にエラーが発生するとは限りません。プロパティを設定する行を削除すると、(同じ例外を除いて)のRelativeHorizontalSizeように、別のプロパティを設定するときに失敗します。(「使用しない」定数に)WidthRelative設定する行を追加すると、それ以外の場合は(同じ例外を除いて)同じように機能する行でも失敗します。shape.LeftRelativeshape.Top

私が使用しているコードは、失敗したWord 2007で記録されたマクロからのものです。また、他のヘッダー/フッターコードで既に必要だったため、ヘッダー関連のコードを実行する前に、ヘッダーSeekViewに正しく切り替えています。

これが形状を追加する完全なコードです。画像を挿入して、フルページサイズに拡大するだけです。headerFooter.Exists注:このメソッドは、実際に存在し( )、前の()にリンクされていないヘッダーに対してのみ呼び出され!headerFooter.LinkToPreviousます。

private static void AddWatermarkToHeader(HeaderFooter header, string watermarkFilePath) {
   header.Range.Editors.Add(WdEditorType.wdEditorEveryone);

   Shape shape = header.Shapes.AddPicture(
      FileName: watermarkFilePath,
      LinkToFile: false,
      SaveWithDocument: true
   );

   shape.WrapFormat.AllowOverlap = (int)MsoTriState.msoTrue;
   shape.WrapFormat.Type = WdWrapType.wdWrapNone;

   shape.RelativeHorizontalPosition = WdRelativeHorizontalPosition.wdRelativeHorizontalPositionPage;
   shape.RelativeVerticalPosition = WdRelativeVerticalPosition.wdRelativeVerticalPositionPage;
   shape.Left = 0;
   shape.Top = 0;

   shape.RelativeHorizontalSize = WdRelativeHorizontalSize.wdRelativeHorizontalSizePage;
   shape.RelativeVerticalSize = WdRelativeVerticalSize.wdRelativeVerticalSizePage;
   shape.WidthRelative = 100;
   shape.HeightRelative = 100;

   shape.ZOrder(MsoZOrderCmd.msoSendBehindText);
}

コードがWord2007とWord2010の両方で機能するように、これを修正する方法についてアドバイスをお願いします。

4

2 に答える 2

1

要求どおりに両方のバージョンの Word で実行するようにコードが修正されないことは承知していますが、代わりに画像の絶対サイズを使用してみましたか? 相対位置を維持しますが、絶対サイズを使用します。実際に相対的なサイズ変更が必要ですか (つまり、ドキュメントに複数のページ サイズが含まれていますか?)。

shape.Width = page.Width;
shape.Height = page.Height;
于 2012-10-08T14:56:49.007 に答える
0

Word 97 から Word 2003 まで、Word オブジェクト モデルには、アクティブな Word ドキュメントの倍率が 100% でな​​い場合に誤った情報を取得してしまうWdRelativeHorizontalPosition.wdRelativeHorizontalPositionPageという、ほとんど知られていないバグがありました。WdRelativeVerticalPosition.wdRelativeVerticalPositionPageこの問題は Word 2007 にも存在し、例外を引き起こしている可能性があると思われます。この問題を参照する 2 つのスレッド (どちらも VBA で同じ問題を扱っています) を次に示します。

情報によって返されるポイント wdHorizo​​ntalPosition サブルーチン

Word 97 wdHorizo​​ntalPositionRelativeToPage

ヘッダーに図形を追加した後 (ページの相対的な水平位置と垂直位置を取得する前) にコードを追加して、アクティブ ドキュメントのズームを 100% に変更し、ビュー タイプを印刷レイアウト ビューに変更することをお勧めします。(形状の位置とサイズを変更するためのコードが実行されたときに、Word 文書のどの部分が表示されるかを実験する必要がある場合があります。アクティブ ドキュメントが代わりにメイン文書を表示/編集できることが必要になる場合があります。ヘッダーの。)

于 2012-10-08T17:37:22.480 に答える