C#使用Spire.Doc将 Word、PDF转图片并下载生成Word
1、主方法
public object DownLoadWord(List<TB_SF_BPM_QualificationRegistrationViewModel> list) { ECMController ecm = new ECMController(); string wordpath = ConfigurationManager.AppSettings["BPMWorkFlowWordPath"]; string wordname = string.Format("人员资质"); string filepath = wordpath + wordname + Guid.NewGuid() + ".docx"; try { List<EcmFileSearchResponse_FileSubCollection> dirs = GetDirs(list, out msg); if (!FileHelper.IsExistDirectory(wordpath)) FileHelper.CreateDirectory(wordpath); if (dirs.Count > 0) { Spire.Doc.Document doc = new Spire.Doc.Document(); Spire.Doc.Section section = doc.AddSection(); Spire.Doc.Formatting.CharacterFormat format = new Spire.Doc.Formatting.CharacterFormat(doc); format.FontName = "宋体"; format.FontSize = 12; foreach (var item in dirs) { Stream st = ecm.FileSingleDownload(item.doc_id); MemoryStream memoryStream = new MemoryStream(); st.CopyTo(memoryStream); byte[] fileBytes = memoryStream.ToArray(); //PDF类型 if (item.extension.ToUpper() == ".PDF") { Spire.Pdf.PdfDocument pdf = new Spire.Pdf.PdfDocument(); pdf.LoadFromStream(memoryStream); st.Close(); CreateParagraph(section, item.basename, format); for (int i = 0; i < pdf.Pages.Count; i++) { using (MemoryStream fs = new MemoryStream()) { System.Drawing.Image bmp = pdf.SaveAsImage(0); bmp.Save(fs, System.Drawing.Imaging.ImageFormat.Png); fs.Position = 0; ImageInfoWord(doc, section, bmp); } } }//word类型 else if (item.extension.ToUpper().Contains(".DOC")) { Document doc1 = new Document(); //载入Word文档 doc1.LoadFromStream(memoryStream, FileFormat.Docx); //将整个Word文档转换为位图集合 Image[] images = doc1.SaveToImages(ImageType.Metafile); CreateParagraph(section, item.basename, format); for (int i = 0; i < images.Length; i++) { int width = (int)(images[i].Width * 150 / images[i].HorizontalResolution); int height = (int)(images[i].Height * 150 / images[i].VerticalResolution); Bitmap bmp = new Bitmap(width, height); bmp.SetResolution(150, 150); using (Graphics g = Graphics.FromImage(bmp)) { g.DrawImage(images[i], Point.Empty); } //设置图片的分辨率 ImageInfoWord(doc, section, bmp); } st.Close(); }//其它默认为图片类型 else { using (System.Drawing.Image bmp = System.Drawing.Image.FromStream(memoryStream)) { CreateParagraph(section, item.basename, format); ImageInfoWord(doc, section, bmp); } } } doc.SaveToFile(filepath, Spire.Doc.FileFormat.Docx); doc.Dispose(); } status = EnumStatus.success; } catch (Exception ex) { status = EnumStatus.faile; msg = ex.Message; } return new { status = getStatus(status), msg = msg, data = filepath, count = count }; }
2、将转换后的图片插入Word方法
public Spire.Doc.Section ImageInfoWord(Spire.Doc.Document doc, Spire.Doc.Section section, Image bmp) { section.PageSetup.Margins.Top = 75f; section.PageSetup.Margins.Left = 90f; section.PageSetup.Margins.Bottom = 75f; section.PageSetup.Margins.Right = 90f; #region 初始化ListStyle对象 //初始化ListStyle对象,指定List类型为数字列表 ListStyle listStyle = new ListStyle(doc, ListType.Numbered); //指定名字 listStyle.Name = "levelstyle"; //设定一级列表模式为阿拉伯数字 listStyle.Levels[0].PatternType = ListPatternType.Arabic; //设置二级列表数字前缀及模式 //listStyle.Levels[1].NumberPrefix = "\x0000."; listStyle.Levels[1].PatternType = ListPatternType.Arabic; //listStyle.Levels[1].CharacterFormat.Italic = false; //设置三级列表数字前缀及模式 listStyle.Levels[2].PatternType = ListPatternType.Arabic; listStyle.Levels[3].PatternType = ListPatternType.Arabic; listStyle.Levels[4].PatternType = ListPatternType.Arabic; listStyle.Levels[5].PatternType = ListPatternType.Arabic; listStyle.Levels[6].PatternType = ListPatternType.Arabic; listStyle.Levels[7].PatternType = ListPatternType.Arabic; listStyle.Levels[8].PatternType = ListPatternType.Arabic; //在ListStyles集合中添加新建的list style doc.ListStyles.Add(listStyle); #endregion //创建字体格式 Spire.Doc.Formatting.CharacterFormat format = new Spire.Doc.Formatting.CharacterFormat(doc); format.FontName = "宋体"; format.FontSize = 12; #region 添加图片 Paragraph imgpara = section.AddParagraph(); imgpara.Format.HorizontalAlignment = Spire.Doc.Documents.HorizontalAlignment.Center; //imgpara.Format.AfterSpacing = 10; //imgpara.Format.BeforeSpacing = 10; //加载图片到System.Drawing.Image对象, 使用AppendPicture方法将图片插入到段落 Image image = bmp; var imgW = image.Width; var imgH = image.Height; //var conW = 611; //var conH = 790; var conW = 415;//495 var conH = 500;//800 var curW = 0; var curH = 0; // 20200330 图片缩放 if (imgW > conW && imgH <= conH) { curW = conW; curH = (curW * imgH) / imgW; } else if (imgW <= conW && imgH > conH) { curH = conH; curW = (curH * imgW) / imgH; } else if (imgW <= conW && imgH <= conH) { curW = imgW; curH = imgH; } else { curW = conW; curH = curW * imgH / imgW; if (curH > conH) { curH = conH; curW = curH * curW / curH; } } #endregion DocPicture picture = imgpara.AppendPicture(image); //DocPicture picture = paragraph.AppendPicture(image); //设置文字环绕方式 //picture.TextWrappingStyle = TextWrappingStyle.Square; //指定图片位置 //picture.HorizontalPosition = 50.0f; //picture.VerticalPosition = 50.0f; picture.HorizontalAlignment = Spire.Doc.ShapeHorizontalAlignment.Center; //设置图片大小 picture.Width = (float)Convert.ToSingle(curW); picture.Height = (float)Convert.ToSingle(curH); image.Dispose(); return section; }
3、段落创建方法
public void CreateParagraph(Section section, string name, Spire.Doc.Formatting.CharacterFormat format) { //创建段落 Paragraph paragraph = section.AddParagraph(); TextRange tr = paragraph.AppendText(name); tr.ApplyCharacterFormat(format); //应用字体格式 paragraph.ApplyStyle(BuiltinStyle.Heading1); //应用标题1样式 设置之后左侧会出现导航 //paragraph.Format.Tabs. paragraph.Format.AfterSpacing = 0;////段后间距 paragraph.Format.BeforeSpacing = 0;//段前间距 //paragraph.ListFormat.ApplyStyle("levelstyle"); //应用列表样式 会出现标题序号 //paragraph.Format.LeftIndent = 0f; //设为左缩进 }

浙公网安备 33010602011771号