以下为在.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