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; //设为左缩进
 }

 

posted @ 2025-04-29 13:46  桎梏110  阅读(70)  评论(0)    收藏  举报