2013-07-18 26 views
7

Il mio progetto di generazione di documenti OpenXML Word richiede testo, tabelle e immagini. Ma prima, ho bisogno di un'intestazione del documento con un logo (immagine) al suo interno.Come inserire l'immagine nell'intestazione del documento OpenXML Word?

ho usato l'esempio di Microsoft per la creazione di intestazioni e piè di pagina a Generating Documents with Headers and Footers in Word 2007 by Using the Open XML SDK 2.0 for Microsoft Office, e le intestazioni di testo funzionano bene, ma le immagini appaiono nell'intestazione con l'icona immagine spezzata, un bordo correttamente dimensionato, e il messaggio "Questa immagine non può essere visualizzata al momento." Inoltre, posso caricare l'immagine selezionata nel corpo del documento bene. Ecco come ho creato l'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); 

Le immagini vengono caricate con un metodo LoadImage, derivata dall'esempio di Microsoft, ma l'aggiunta di parametri per la larghezza e l'altezza, e restituendo un oggetto di disegno:

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

usando questo, le seguenti opere di codice, il caricamento di un'immagine ovunque nel corpo che voglio:

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

E il seguente codice non funziona per mettere un'immagine del logo nell'intestazione:

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

Ho il sospetto che stia facendo qualcosa di molto poco corretto, perché posso caricare l'immagine ovunque ma nell'intestazione. Qualcuno può consigliare?

+0

Ciao, può si prega di mostrare il codice completo per inserire un'immagine in intestazione del documento Word? Grazie – epema

risposta

0

Si prega di provare il seguente codice:

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

Ho il sospetto che sto facendo qualcosa di molto sottile in modo non corretto, perché posso caricare l'immagine ovunque, ma nella testata.

Se è possibile inserire un'immagine nel documento principale, è possibile anche inserire un'immagine nell'intestazione o nel piè di pagina con questo codice (private static Drawing LoadImage).

L'unica differenza è in cui si aggiunge il ImagePart:

  • Per inserire un'immagine nella corpo del documento, si aggiunge un ImagePart al MainDocumentPart:

    _agLogoPart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg); 
    ... 
    _agLogoRel = mainDocumentPart.GetIdOfPart(_agLogoPart); 
    
  • per inserire un'immagine in un'intestazione , è necessario aggiungere un ImagePart al HeaderPart che si utilizza per creare l'intestazione

    _agLogoPart = headerPart.AddImagePart(ImagePartType.Jpeg); 
    ... 
    _agLogoRel = headerPart.GetIdOfPart(_agLogoPart); 
    
  • per inserire un'immagine in una piè di pagina, è necessario aggiungere un ImagePart al FooterPart che si utilizza per creare il piè di pagina:

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

correlati:

+0

Ciao, hai il codice sorgente completo per inserire un'immagine nell'intestazione docx? Se sì, puoi per favore condividerlo. Davvero in difficoltà con esso. Grazie! – epema