2013-07-18 5 views
7

Для моего проекта генерации документов в формате OpenXML требуется текст, таблицы и изображения. Но сначала Мне нужен заголовок документа с логотипом (изображением) в нем.Как вставить изображение в заголовок документа OpenXML Word?

Я использовал пример Microsoft для создания и колонтитулов в Generating Documents with Headers and Footers in Word 2007 by Using the Open XML SDK 2.0 for Microsoft Office и текстовые заголовки работает нормально, но изображения отображаются в заголовке с разорванными изображениями, границаправильно размером, и сообщение «Это изображение в настоящее время не отображается». Кроме того, я могу загрузить выбранное изображение в тело документа просто отлично. Вот как я создаю ImagePart:

// Create AG logo part. 
_agLogoPart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg); 
using (FileStream stream = new FileStream(_agLogoFilename, FileMode.Open)) 
{ 
    _agLogoPart.FeedData(stream); 
} 
_agLogoRel = mainDocumentPart.GetIdOfPart(_agLogoPart); 

Изображения загружаются с помощью метода LoadImage, полученной из примера Microsoft, но добавление параметров ширины и высоты, и возвращает объект рисования:

private static Drawing LoadImage(string relationshipId, 
          string filename, 
          string picturename, 
          double inWidth, 
          double inHeight) 
{ 
double emuWidth = Konsts.EmusPerInch * inWidth; 
double emuHeight = Konsts.EmusPerInch * inHeight; 

var element = new Drawing(
    new DW.Inline(
    new DW.Extent { Cx = (Int64Value)emuWidth, Cy = (Int64Value)emuHeight }, 
    new DW.EffectExtent { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L }, 
    new DW.DocProperties { Id = (UInt32Value)1U, Name = picturename }, 
    new DW.NonVisualGraphicFrameDrawingProperties(
    new A.GraphicFrameLocks { NoChangeAspect = true }), 
    new A.Graphic(
    new A.GraphicData(
    new PIC.Picture(
    new PIC.NonVisualPictureProperties(
    new PIC.NonVisualDrawingProperties { Id = (UInt32Value)0U, Name = filename }, 
    new PIC.NonVisualPictureDrawingProperties()), 
    new PIC.BlipFill(
    new A.Blip(
    new A.BlipExtensionList(
    new A.BlipExtension { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" })) 
    { 
    Embed = relationshipId, 
    CompressionState = A.BlipCompressionValues.Print }, 
    new A.Stretch(
    new A.FillRectangle())), 
    new PIC.ShapeProperties(
    new A.Transform2D(
    new A.Offset { X = 0L, Y = 0L }, 
    new A.Extents { Cx = (Int64Value)emuWidth, Cy = (Int64Value)emuHeight }), 
    new A.PresetGeometry(
    new A.AdjustValueList()) { Preset = A.ShapeTypeValues.Rectangle }))) 
    { 
     Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" 
    })) 
    { 
     DistanceFromTop = (UInt32Value)0U, 
     DistanceFromBottom = (UInt32Value)0U, 
     DistanceFromLeft = (UInt32Value)0U, 
     DistanceFromRight = (UInt32Value)0U, 
     EditId = "50D07946" 
    }); 
return element; 
} 

Используя это, следующий код работа, погрузочное изображение в любом месте в тело, я хочу:

Paragraph paraImage = new Paragraph(new Run(LoadImage(_genomeImageRel, _genomeImageFilename, "name" + _genomeImageRel, 7.5, 2.925))); 
body.AppendChild(paraImage); 

И следующий код не работает, чтобы поместить изображение логотипа в заголовке:

private static Header GeneratePageHeaderPart(string headerText) 
{ 
    Header hdr = new Header(new Paragraph(new Run(LoadImage(_agLogoRel, _agLogoFilename, "name" + _agLogoRel, 2.57, 0.73)))); 
    return hdr; 
} 

Я подозреваю, что я делаю что-то очень тонкое неправильно, потому что я могу загрузить изображение где угодно, но в заголовке. Может ли кто-нибудь посоветовать?

+0

Привет, пожалуйста, вы можете показать полный код для вставки изображения в заголовок документа Word? Спасибо – epema

ответ

0

Пожалуйста, попробуйте следующий код:

Bitmap image = new Bitmap(imagePath); 
SdtElement controlBlock = doc.MainDocumentPart.HeaderParts.First().Header.Descendants<SdtElement>().Where 
           (r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName).SingleOrDefault(); 
//find the Blip element of the content control 
Blip blip = controlBlock.Descendants<Blip>().FirstOrDefault(); 

//add image and change embeded id 
ImagePart imagePart = doc.MainDocumentPart.AddImagePart(ImagePartType.Jpeg); 
using (MemoryStream stream = new MemoryStream()) 
{ 
     image.Save(stream, ImageFormat.Jpeg); 
     stream.Position = 0; 
     imagePart.FeedData(stream); 
} 
blip.Embed = doc.MainDocumentPart.GetIdOfPart(imagePart); 
7

Я подозреваю, что я делаю что-то очень тонкое неправильно, потому что я могу загрузить изображение в любом месте, но в заголовке.

Если вы можете вставить изображение в основной документ, вы также можете вставить изображение в верхний или нижний колонтитул с помощью этого кода (private static Drawing LoadImage).

только одна разница в том , где вы добавляете ImagePart:

  • , чтобы вставить изображение в тела документа, вы добавляете ImagePart к MainDocumentPart:

    _agLogoPart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg); 
    ... 
    _agLogoRel = mainDocumentPart.GetIdOfPart(_agLogoPart); 
    
  • , чтобы вставить изображение в заголовок , вам нужно добавить ImagePart к HeaderPart, который используется для создания заголовка

    _agLogoPart = headerPart.AddImagePart(ImagePartType.Jpeg); 
    ... 
    _agLogoRel = headerPart.GetIdOfPart(_agLogoPart); 
    
  • , чтобы вставить изображение в сноске, необходимо добавьте ImagePart к FooterPart, который используется для создания колонтитула:

    _agLogoPart = footerPart.AddImagePart(ImagePartType.Jpeg); 
    ... 
    _agLogoRel = footerPart.GetIdOfPart(_agLogoPart); 
    

Похожие:

+0

Привет, у вас есть полный исходный код для вставки изображения в заголовок docx? Если да, можете ли вы поделиться им. Действительно борется с этим. Спасибо! – epema

Смежные вопросы