2014-02-06 3 views
0

동적으로 DocX 파일을 만드는 기능이있는 프로그램을 개발 중입니다. 제목에서 알 수 있듯이 이미지를 DocX 파일에 삽입하는 데 문제가 있습니다. 문제 중 하나는 내가보기에 C# 2.0을 사용하고 있다는 것입니다. (이 질문에 대답 할 때 C# 3.0으로 전환하고 싶지 않다는 것을 강조하고 싶습니다. 그러므로 설득하지 마십시오.

http://msdn.microsoft.com/en-us/library/office/bb497430.aspx에서 MSDN 기사를 보았습니다. MSDN에서 C# 2.0에 사용하는 C# 3.0 코드를 변환하지 못하고 열리지 않는 문서를 얻습니다. "내용에 문제가있어 파일 Testing.docx를 열 수 없습니다."및 "오류가 없습니다. 사용할 수있는 세부 사항. " 여기 .docx 파일에 이미지 삽입

내 코드입니다 :

ImagePart ip_Part; 
WordprocessingDocument wpd_Doc = WordprocessingDocument.Create("C:\\Convert\\Testing.docx", WordprocessingDocumentType.Document); 
public Testing() 
{ 
    wpd_Doc.AddMainDocumentPart(); 
    wpd_Doc.MainDocumentPart.Document = new Document(); 
    wpd_Doc.MainDocumentPart.Document.Body = new Body(); 

    ip_Part = wpd_Doc.MainDocumentPart.AddImagePart(ImagePartType.Png); 
    System.IO.FileStream fs_Stream = new System.IO.FileStream("image.png", System.IO.FileMode.Open); 
    ip_Part.FeedData(fs_Stream); 

    AddImageToBody("image.png", wpd_Doc.MainDocumentPart.GetIdOfPart(ip_Part)); 

    AppendText("Here is a test bulleted list:"); 

    wpd_Doc.MainDocumentPart.Document.Save(); 

    //Close the document. 
    wpd_Doc.Close(); 
} 

private void AddImageToBody(string s_ImagePath, string s_RelationshipId) 
{ 
    //OpenXmlElement oxe_Element = new Numbering(); 
    Drawing d_Drawing = new Drawing(); 
    DrawWord.Inline i_Inline = new DrawWord.Inline(); 
    DrawWord.Extent e_Extent = new DrawWord.Extent(); 
    e_Extent.Cx = 600075; //63px/96dpi * 914400 
    e_Extent.Cy = 600075; //63px/96dpi * 914400 
    i_Inline.Extent = e_Extent; 

    DrawWord.DocProperties dp_Prop = new DrawWord.DocProperties(); 
    //dp_Prop.Id = uint.Parse(System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString()); 
    dp_Prop.Id = 1; 
    dp_Prop.Name = "Picture 1"; 
    dp_Prop.Description = "An automated image."; 
    i_Inline.DocProperties = dp_Prop; 

    DrawWord.NonVisualGraphicFrameDrawingProperties nvgfdp_Prop = new DrawWord.NonVisualGraphicFrameDrawingProperties(); 
    Draw.GraphicFrameLocks gfl_Locks = new Draw.GraphicFrameLocks(); 
    gfl_Locks.NoChangeAspect = true; 
    nvgfdp_Prop.GraphicFrameLocks = gfl_Locks; 
    i_Inline.NonVisualGraphicFrameDrawingProperties = nvgfdp_Prop; 

    Draw.Graphic g_Graphic = new Draw.Graphic(); 
    Draw.GraphicData gd_Data = new DocumentFormat.OpenXml.Drawing.GraphicData(); 
    gd_Data.Uri = DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString(); 
    DrawPic.Picture p_Pic = new DrawPic.Picture(); 
    DrawPic.NonVisualPictureProperties nvpp_Prop = new DrawPic.NonVisualPictureProperties(); 
    DrawPic.NonVisualDrawingProperties nvdp_Prop = new DrawPic.NonVisualDrawingProperties(); 
    nvdp_Prop.Id = uint.Parse(System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString()); 
    //nvdp_Prop.Name = s_ImagePath; 
    nvdp_Prop.Name = "New_Image.png"; 
    nvpp_Prop.NonVisualDrawingProperties = nvdp_Prop; 

    DrawPic.NonVisualPictureDrawingProperties nvpdp_Prop = new DrawPic.NonVisualPictureDrawingProperties(); 
    nvpp_Prop.NonVisualPictureDrawingProperties = nvpdp_Prop; 
    p_Pic.NonVisualPictureProperties = nvpp_Prop; 

    DrawPic.BlipFill bf_Fill = new DrawPic.BlipFill(); 
    Draw.Blip b_Blip = new Draw.Blip(); 
    Draw.ExtensionList el_List = new Draw.ExtensionList(); 
    Draw.BlipExtension be_Extension = new Draw.BlipExtension(); 
    be_Extension.Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"; 
    el_List.Append(be_Extension); 
    b_Blip.Append(el_List); 
    b_Blip.Embed = s_RelationshipId; 
    b_Blip.CompressionState = Draw.BlipCompressionValues.Print; 
    bf_Fill.Blip = b_Blip; 

    Draw.Stretch s_Stretch = new Draw.Stretch(); 
    Draw.FillRectangle fr_Rect = new Draw.FillRectangle(); 
    s_Stretch.FillRectangle = fr_Rect; 
    bf_Fill.Append(s_Stretch); 
    p_Pic.BlipFill = bf_Fill; 

    DrawPic.ShapeProperties sp_Prop = new DrawPic.ShapeProperties(); 
    Draw.Transform2D t2d_Transform = new Draw.Transform2D(); 
    Draw.Offset o_Offset = new Draw.Offset(); 

    o_Offset.X = 0; 
    o_Offset.Y = 0; 
    t2d_Transform.Offset = o_Offset; 

    Draw.Extents e_Extents = new Draw.Extents(); 
    e_Extents.Cx = 600075; //63px/96dpi * 914400 
    e_Extents.Cy = 600075; //63px/96dpi * 914400 
    t2d_Transform.Extents = e_Extents; 
    sp_Prop.Transform2D = t2d_Transform; 

    Draw.PresetGeometry pg_Geom = new Draw.PresetGeometry(); 
    Draw.AdjustValueList avl_List = new Draw.AdjustValueList(); 
    pg_Geom.AdjustValueList = avl_List; 
    pg_Geom.Preset = Draw.ShapeTypeValues.Rectangle; 
    sp_Prop.Append(pg_Geom); 
    p_Pic.ShapeProperties = sp_Prop; 
    gd_Data.Append(p_Pic); 
    g_Graphic.GraphicData = gd_Data; 
    i_Inline.Graphic = g_Graphic; 
    d_Drawing.Inline = i_Inline; 
    //oxe_Element.Append(d_Drawing); 
    //Run r_Run = new Run(d_Drawing); 
    wpd_Doc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(d_Drawing))); 
} 

(변수 이름은 나쁜, 그러나 이것은 단지 테스트 프로그램, 그래서 너무 많은 시간을 할애하지 않았다 또한, 나는이 선이를 모방 간격했다. Visual Studio 2005를 사용하고 있지만 C# 3.0 구문을 사용할 수 있다면 MSDN에서 사용한 Xml 형식입니다.

+0

문제가 C# 버전과 관련이 없습니다. 그것은 .NET 버전으로 인해 더 많은 가능성이 있습니다. –

+0

내 성명에서 의미하는 바는 C# 3.0의 Collection Initializing을 추가 할 때 구문이 너무 다르기 때문에이 코드에서 작성한 트리의 일부를 망칠 수도 있다는 것입니다. – Zapparatus

답변

0

답변을 찾았습니다. 놀랍게도,이 웹 페이지를 찾지 못했습니다. 일부 Google 검색 결과에 이상한 키워드 검색이 있었기 때문에 완전히 작동했습니다 : . Collection Initialization으로 작성되었지만 C# 2.0 표준에 맞게 변경할 수있었습니다.

관련 문제