文書の本文に画像をコピーする場合を含め、あらゆる状況で動作するコードがあります。2つのWord文書をOpenXML SDKとマージしていますが、画像をヘッダにコピーするときに壊れた文書を取得します。
コードは、コピーされているヘッダー/フッターにイメージが含まれていない限り、あるドキュメントから別のドキュメントにヘッダーとフッターをコピー(追加)するときに機能します。
イメージがあるヘッダーをコピーすると、結果のファイルが破損し、OpenXML SDKで開こうとすると「圧縮された部分のデータの長さが一貫しません」という例外がスローされます。 私は、画像をHeaderPartで作成しなければならないことを知っています(本体にコピーするときは、MainDocumentPartと同じように)。上記ソース及び宛先HeaderPartsを渡すと呼ばれ、この後にコピーされるソースヘッダのXML
private void AddSourceImagesToDestination(XElement sourceXml, OpenXmlPart sourcePart, OpenXmlPart destPart) {
foreach(XElement drawingElement in sourceXml.Descendants(_mswDrawingElementName)) {
XAttribute aBlipEmbedAttribute = drawingElement.Descendants(_ablipElementName).First().Attribute(_embedAttributeName);
string relationshipId = aBlipEmbedAttribute.Value;
ImagePart sourceImagePart = (ImagePart)sourcePart.GetPartById(relationshipId);
ImagePart destinationImagePart = ((HeaderPart)destPart).AddImagePart(sourceImagePart.ContentType);
string newRelationshipId = destPart.GetIdOfPart(destinationImagePart);
aBlipEmbedAttribute.SetValue(newRelationshipId);
destinationImagePart.FeedData(sourceImagePart.GetStream(FileMode.Open, FileAccess.Read));
}
}
:
画像のマージを行うコードは次のように見えます宛先文書。上記のプロシージャを呼び出した後、destinationHeaderPart.Header.Save()が呼び出されます。
ソースヘッダーにイメージがない場合、結果のドキュメントは正常です(つまり、foreachがソースXMLで描画要素を見つけられない場合)。
ヘッダー内の画像のこの症状が、おそらく赤ちゃんであり、本当の問題がどこか他の場所にあるのかどうか、私は不思議です。
解決策にもう少し近づいています。上記のコードスニペットは、実際に必要なものです。この問題は、私がXMLで行ったこととImagePartを追加することで出力文書に正しく書かれるように、正しいSDK呼び出しを取得してどこかにあるようだ。まだ働いています... – Peter