2012-03-08 2 views
1

이미지를 문서 본문에 복사 할 때를 포함하여 모든 상황에서 작동하는 코드가 있습니다.두 개의 Word 문서를 OpenXML SDK와 병합 중이지만 이미지를 머리글에 복사 할 때 손상된 문서가 표시됩니다.

코드는 복사되는 머리글/바닥 글에 이미지가없는 한 한 문서에서 다른 문서로 머리글과 바닥 글을 복사 (추가) 할 때 작동합니다.

이미지가있는 헤더를 복사하면 결과 파일이 손상되고 OpenXML SDK로 열려고하면 "압축 된 부분의 데이터 길이가 일치하지 않습니다."라는 예외가 발생합니다. 본문으로 복사 할 때 MainDocumentPart에 대한 것과 같이 이미지가 HeaderPart에서 만들어 져야한다는 것을 알고 있습니다.

이미지의 병합은 같은 모양을 수행하는 코드 : 소스 및 대상 HeaderParts을 통과라고 위의

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)); 
     } 
    } 

을,이은에 복사됩니다 후 소스 헤더의 XML 대상 문서. 위의 프로 시저를 호출하면 destinationHeaderPart.Header.Save()가 호출됩니다.

위에서 말했듯이 소스 헤더에 이미지가 없으면 결과 문서가 양호합니다 (예 : foreach가 소스 XML에서 드로잉 요소를 찾지 못한 경우).

머리글에있는 이미지의 증상이 아마도 빨간 청어인지 진짜 문제인지는 궁금합니다. 나는이 질문에 대한 코멘트에 말했듯이

+0

솔루션에 조금 더 가깝습니다. 위의 코드 스 니펫은 실제로 필요한 것입니다. 문제는 올바른 SDK 호출을 가져 와서 XML에서 수행 한 작업과 ImageParts를 추가하여 출력 문서에 올바르게 기록되도록하는 것입니다. 아직 일하고 ... – Peter

답변

3

이 코드는 헤더에 이미지를 포함하고 바닥 글 잘했다 - 그것은 트릭을했다.

내 코드 (다른 곳)에서 작성한 손상된 파일의 문제점을 어떻게 해결 했습니까? 시행 착오를 거쳤습니다. 다른 공헌자들이 말했듯이, OpenXML에 관한 문서는 그다지 좋지는 않습니다. 따라서이 문제에 대한 또 다른 해결책이있을 수 있으며, 아마도 다른 "부작용"으로 인해 "솔루션"이 작동 할 수도 있습니다.

private MemoryStream _memoryStream; 
    private WordprocessingDocument _wordDocument; 
     ... 
    _wordDocument = WordprocessingDocument.Open(_memoryStream, true); 
     ... 

    private void ReopenDocument() { 
     _wordDocument.Package.Flush(); 
     _wordDocument.Close(); 
     MemoryStream newStream = new MemoryStream(); 
     _memoryStream.WriteTo(newStream); 
     _memoryStream.Close(); 
     _memoryStream = newStream; 
     _memoryStream.Position = 0L; 
     _wordDocument = WordprocessingDocument.Open(_memoryStream, true); 
    } 

내가하여 FileStream에 _memoryStream를 작성에 ReopenDocument 방법은 바로 전에 호출 할 경우, 손상은 피할 수 :

어쨌든, 나는이처럼 보이는 몇 가지 코드가 있습니다.

+0

안녕하세요. 이 대답은 나에게 도움이되었다. 그러나 비슷한 문제가 있었는데, 그 내용을 읽으 려하기 전에 _wordDocument를 적절히 처리해야한다는 것을 발견했습니다. – eburgos