• .net生成PDF文件的几种方式


    以下为在.net mvc中,生成pdf的几种方式,资料都是在做项目时网上找的

    1、使用Microsoft.Office.Interop.Word.dll将word转换为PDF

    dll可以单独下载,一般在电脑中有,位置:C:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesvs199bd4f2edef3bc1assemblydl360e9086353bea978_07e9d401Microsoft.Office.Interop.Word.DLL

    public bool WordToPdf(object sourcePath, string targetPath)
            {
                bool result = false;
                WdExportFormat wdExportFormatPDF = WdExportFormat.wdExportFormatPDF;
                object missing = Type.Missing;
                Microsoft.Office.Interop.Word.ApplicationClass applicationClass = null;
                Microsoft.Office.Interop.Word.Document document = null;
                try
                {
                    applicationClass = new Microsoft.Office.Interop.Word.ApplicationClass();
                    document = applicationClass.Documents.Open(ref sourcePath, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
                    if (document != null)
                    {
                        document.ExportAsFixedFormat(targetPath, wdExportFormatPDF, false, WdExportOptimizeFor.wdExportOptimizeForPrint, WdExportRange.wdExportAllDocument, 0, 0, WdExportItem.wdExportDocumentContent, true, true, WdExportCreateBookmarks.wdExportCreateWordBookmarks, true, true, false, ref missing);
                    }
                    result = true;
                }
                catch
                {
                    result = false;
                }
                finally
                {
                    if (document != null)
                    {
                        document.Close(ref missing, ref missing, ref missing);
                        document = null;
                    }
                    if (applicationClass != null)
                    {
                        applicationClass.Quit(ref missing, ref missing, ref missing);
                        applicationClass = null;
                    }
                }
                return result;
            }
    

      使用

    public FileResult Demo()
            {
                string wordPath = Server.MapPath(@"TempFileWordTest.docx");
                string pdfPath = Server.MapPath(@"TempFilePDFTest.pdf");
    
                WordToPdf(wordPath, pdfPath);
    
                FileStream fs = new FileStream(pdfPath, FileMode.Open, FileAccess.Read);
                byte[] fileContents = new byte[(int)fs.Length];
                fs.Read(fileContents, 0, fileContents.Length);
                fs.Close();
    
                return File(fileContents, "application/pdf", "test.pdf");
            }
    

      2、itextsharp生成PDF

    nuget中查找itextsharp,并加入项目

    public FileResult ItextSharpDemo()
            {
                string filename = Server.MapPath(@"TempFilePDFItextSharpTest.pdf");
    
                iTextSharp.text.Rectangle pageSize = new iTextSharp.text.Rectangle(1000, 500);
                iTextSharp.text.Document document = new iTextSharp.text.Document(pageSize, 10, 10, 10, 10);
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(filename, FileMode.Create));
                document.Open();
    
                //设置文档相关信息
                document.AddTitle("这里是标题");
                document.AddSubject("主题");
                document.AddKeywords("关键字");
                document.AddCreator("创建者");
                document.AddAuthor("作者");
    
                //添加内容
                document.Add(new iTextSharp.text.Paragraph("Hello World! Hello People! " + "这是中文"));
                
                //添加图片
                iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(Server.MapPath(@"images1.png"));
                img.SetAbsolutePosition(100, 50);
                writer.DirectContent.AddImage(img);
    
                img = iTextSharp.text.Image.GetInstance(Server.MapPath(@"images2.png"));
                img.SetAbsolutePosition(200, 50);
                writer.DirectContent.AddImage(img);
    
                img = iTextSharp.text.Image.GetInstance(Server.MapPath(@"images3.png"));
                img.SetAbsolutePosition(300, 50);
                writer.DirectContent.AddImage(img);
    
                document.Close();
                writer.Close();
    
                FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
                byte[] fileContents = new byte[(int)fs.Length];
                fs.Read(fileContents, 0, fileContents.Length);
                fs.Close();
    
                return File(fileContents, "application/pdf", "test.pdf");
            }
    

      源点为左下角,不方便计算位置

    3、Rotativa将html生成pdf并下载

    nuget中查找Rotativa,并加入项目

    public ActionResult DemoViewAsPdf()
            {
                return new ViewAsPdf("DemoViewAsPdf");
                //return new ActionAsPdf("DemoViewAsPdf")
                //{ FileName = "demo.pdf" };
            }
    

      4、PDFSharp生成pdf

    nuget中查找PDFSharp,并加入项目

    /// <summary>
            /// 1、使用windows里面的字体时,报错
            /// 2、默认不支持中文
            /// </summary>
            public void CreatePDF()
            {
                // 创建新的PDF文档
                PdfDocument document = new PdfDocument();
    
                // 创建空页
                PdfPage page = document.AddPage();
    
                // 设置一个画布
                XGraphics gfx = XGraphics.FromPdfPage(page);
    
                // 设置字体 单位:px
                //System.Drawing.Text.PrivateFontCollection pfcFonts = new System.Drawing.Text.PrivateFontCollection();
                //string strFontPath = @"C:/Windows/Fonts/msyh.ttc";//字体设置为微软雅黑
                //pfcFonts.AddFontFile(strFontPath);
    
                //XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
                //XFont font = new XFont(pfcFonts.Families[0], 15, XFontStyle.Regular, options);
    
                System.Drawing.Text.PrivateFontCollection pfcFonts = new System.Drawing.Text.PrivateFontCollection();
                string strFontPath = @"C:/Windows/Fonts/msyh.ttc";//字体设置为微软雅黑 
                pfcFonts.AddFontFile(strFontPath);
    
                XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
                XFont font = new XFont(pfcFonts.Families[0], 20, XFontStyle.Bold, options);
    
                // 设置(添加)文本
                gfx.DrawString("Hello, World!", font, XBrushes.Black,
                  new XRect(0, 0, page.Width, page.Height),
                  XStringFormat.TopLeft);
    
                // 图片
                string imgPath = Server.MapPath(@"images1.png");
    
                XImage image = XImage.FromFile(imgPath);
                //double x = (gfx.PageSize.Width - image.PixelWidth * 72 / image.HorizontalResolution) / 2;
                //double y = (gfx.PageSize.Height - image.PixelHeight * 72 / image.VerticalResolution) / 2;
                gfx.DrawImage(image, 10, 30);
    
                // 设置(添加)文本
                //gfx.DrawString("123124121", font, XBrushes.Black,
                //  new XRect(0, 0, page.Width, page.Height)
                //  );
                gfx.DrawString("这是一行中文", font, XBrushes.Black, 0, 60 + image.PixelHeight);
    
                // 保存文档
                string filename = Server.MapPath(@"	empfileHelloWorld.pdf");
                document.Save(filename);
            }
    

      5、Spire.Pdf

    nuget中查找Spire.Pdf,并加入项目

    public void CreatePDF()
            {
                PdfDocument document = new PdfDocument();
                
                //用于转换各种尺寸
                PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
    
                //用于设置页边距
                PdfMargins margins = new PdfMargins();
    
                //设置页边距  单位:磅/点
                margins.Top = unitCvtr.ConvertUnits(20f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point);
                margins.Bottom = margins.Top;
                margins.Left = 0;
                margins.Right = margins.Left;
                
                //新添加一个A4大小的页面,A4大小为211mm*297mm
                PdfPageBase page = document.Pages.Add(PdfPageSize.A4, margins);
                
                //字体,字体大小,font中设置字体大小的单位为磅
                PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("宋体", unitCvtr.ConvertUnits(24f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point)), true);
                PdfTrueTypeFont contentFont = new PdfTrueTypeFont(new Font("宋体", unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point)), true);
    
                //字体颜色
                //PdfPen为空心字
                //PdfPen pen = new PdfPen(Color.Black);
                PdfBrush brush = new PdfSolidBrush(Color.Black);
    
                //写入内容,x为距离左边的距离,单位为磅,y为距离上面的距离,单位为磅
                string text = ("这里是标题");
                page.Canvas.DrawString(text, titleFont, brush, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), 0);
    
                text = ("这里是内容");
                page.Canvas.DrawString(text, contentFont, brush, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), unitCvtr.ConvertUnits(30f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point));
    
                text = ("这里是内容2");
                page.Canvas.DrawString(text, contentFont, brush, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), unitCvtr.ConvertUnits(50f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point));
    
                //按指定地址加载图片
                PdfImage image = PdfImage.FromFile(Server.MapPath(@"images1.png"));
    
                //按图片流加载图片
                //Image img;
                //PdfImage img = PdfImage.FromImage(img)
    
                //按Stream流加载图片
                //System.IO.Stream stream;
                //PdfImage img = PdfImage.FromStream(stream)
    
                float width = image.Width * 0.55f;
                float height = image.Height * 0.55f;
    
                float y = unitCvtr.ConvertUnits((20f+30f+20f), PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point); 
    
                //插入图片,x为距离左边的距离,单位磅,y为距离上面的距离,单位磅,width,height为写入PDF的图片的宽高,单位像素
                page.Canvas.DrawImage(image, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), y, width, height);
    
                //保存并打开文档
                document.SaveToFile(Server.MapPath(@"	empfilePDF创建.pdf"));
                //System.Diagnostics.Process.Start("PDF创建.pdf");
            }
    

      Spire.Pdf是我在测试时唯一没有遇到中文乱码的插件,而且源点在左上角,并提供单位转换工具类,所以个人更喜欢Spire.Pdf

  • 相关阅读:
    实验室机器OracleXE客户端连接远程Oracle服务器
    PLSQL Developer 远程连接Oracle XE数据库(其他Oracle数据库类似)
    VB进制转化大全
    给定一个硬盘标识,umout掉所有相关挂载
    linux读取硬盘指定扇区
    开发板上挂载NTFS分区
    write error:file too large!!!
    一些自用的c函数
    主引导记录(MBR)分析
    strtok_r函数学习
  • 原文地址:https://www.cnblogs.com/zhoushangwu/p/11666637.html
Copyright © 2020-2023  润新知