.NET Core 使用PDF打印
第一种方式 套打 (先做好PDF模版 在程序中只是填充数据)
1.先用word制作好模版 然后另存为pdf格式
2.下载adobe acrobat pro
3.选择工具 准备表单 会自动把没有内容的td单元格 还有___ 这种可以填的地方设置key值
4.需要导入iTextsharp这个包 如果没有就导入 iTextSharp.LGPLv2.Core
public FileResult DemoViewAsPdf() { //return null; //获取中文字体,第三个参数表示为是否潜入字体,但只要是编码字体就都会嵌入。 BaseFont baseFont = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //读取模板文件 PdfReader reader = new PdfReader(@"C:\Users\jiangchengbiao\Desktop\第一个打印文档.pdf"); //创建文件流用来保存填充模板后的文件 MemoryStream stream = new MemoryStream(); PdfStamper stamp = new PdfStamper(reader, stream); //设置表单字体,在高版本有用,高版本加入这句话就不会插入字体,低版本无用 //stamp.AcroFields.AddSubstitutionFont(baseFont); AcroFields form = stamp.AcroFields; //表单文本框是否锁定 stamp.FormFlattening = true; Dictionary<string, string> para = new Dictionary<string, string>(); para.Add("name", "蒋承标"); para.Add("age", "22"); para.Add("sex", "男"); para.Add("identity", "330328"); //填充表单,para为表单的一个(属性-值)字典 foreach (KeyValuePair<string, string> parameter in para) { //要输入中文就要设置域的字体; form.SetFieldProperty(parameter.Key, "textfont", baseFont, null); //为需要赋值的域设置值; form.SetField(parameter.Key, parameter.Value); } //按顺序关闭io流 stamp.Close(); reader.Close(); //生成文件 FileResult fileResult = new FileContentResult(stream.ToArray(), "application/pdf"); //设置了这个属性就是下载 //fileResult.FileDownloadName = "4.pdf"; return fileResult; }
这个action一定要是get请求的 这样才可以直接通过windows.open()请求
前端只需要 window.open("这个action的地址") 就可以直接显示或者下载这个pdf文档
***********************
在程序中生成PDF
添加iTextSharp.LGPLv2.Core包
string filePath = @"D:\pdf\"; //实例化在当前目录 创建 移动的实例方法 DirectoryInfo dirTime = new DirectoryInfo(filePath); //如果目录不存在 则创建 if (!dirTime.Exists) { dirTime.Create(); } //获取当前目录中文件的数量 string name = dirTime.GetFiles().Length + 1 + ".pdf"; filePath = filePath + name; //这个就是流对象 对于这种操作IO的 最后都需要清空流对象 var stream = new FileStream(filePath, FileMode.Create); Document document = new Document(PageSize.A4, 5f, 5f, 30f, 0f); PdfWriter writer = PdfWriter.GetInstance(document, stream);
try { document.Open(); PdfPTable table = new PdfPTable(5); table.TotalWidth = 550; table.LockedWidth = true; table.SetWidths(new int[] { 65, 55, 60, 45, 170 }); PdfPCell cell; BaseFont bfChinese = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); iTextSharp.text.Font fontChinese_11 = new iTextSharp.text.Font(bfChinese, 15, iTextSharp.text.Font.BOLD, new iTextSharp.text.BaseColor(0, 0, 0)); iTextSharp.text.Font fontChinese_10 = new iTextSharp.text.Font(bfChinese, 10, iTextSharp.text.Font.NORMAL, new iTextSharp.text.BaseColor(0, 0, 0)); iTextSharp.text.Font fontChinese_bold = new iTextSharp.text.Font(bfChinese, 8, iTextSharp.text.Font.BOLD, new iTextSharp.text.BaseColor(0, 0, 0)); iTextSharp.text.Font fontChinese_8 = new iTextSharp.text.Font(bfChinese, 8, iTextSharp.text.Font.NORMAL, new iTextSharp.text.BaseColor(0, 0, 0)); iTextSharp.text.Font fontChinese = new iTextSharp.text.Font(bfChinese, 12, iTextSharp.text.Font.NORMAL, new iTextSharp.text.BaseColor(0, 0, 0)); //黑体 BaseFont bf_ht = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); iTextSharp.text.Font ht_7 = new iTextSharp.text.Font(bf_ht, 7, iTextSharp.text.Font.NORMAL, new iTextSharp.text.BaseColor(0, 0, 0)); //公司名称 cell = new PdfPCell(new Phrase("XXXXXXXX设备有限公司", fontChinese_11)); cell.Colspan = 5; cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Border = Rectangle.NO_BORDER; table.AddCell(cell); //document.Add(table); //订单类型 cell = new PdfPCell(new Phrase("发货单", fontChinese_11)); cell.Colspan = 5; cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Border = Rectangle.NO_BORDER; table.AddCell(cell); //document.Add(table); //单据信息 var salesorder = GetSalesOrder(); string str = " 客户:" + salesorder.CustomerName + " 电话:" + salesorder.Phone +" 时间:"+salesorder.OrderDate; cell = new PdfPCell(new Phrase(str, fontChinese)); cell.Colspan = 6; cell.HorizontalAlignment = Element.ALIGN_LEFT; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Border = Rectangle.NO_BORDER; cell.Padding = 5; cell.PaddingLeft = 0; table.AddCell(cell); document.Add(table); //str = "出货:" + todate + " 开单:" + model.Osaleh.osaleh_mkdateString + " ECMS单号:" + model.Osaleh.osaleh_osalehID + ""; //cell = new PdfPCell(new Phrase(str, fontChinese)); //cell.Colspan = 2; //cell.HorizontalAlignment = Element.ALIGN_RIGHT; //cell.VerticalAlignment = Element.ALIGN_MIDDLE; //cell.Border = Rectangle.NO_BORDER; //cell.Padding = 5; //table.AddCell(cell); table = new PdfPTable(3); table.TotalWidth = 550; table.LockedWidth = true; table.SetWidths(new int[] { 250, 150, 150 }); cell = new PdfPCell(new Phrase("送货地址:" + salesorder.Address, fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase("订单号:" + salesorder.Name, fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase("付款方式:" + salesorder.PayMethonText, fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); document.Add(table); table = new PdfPTable(6); table.TotalWidth = 550; table.LockedWidth = true; table.SetWidths(new int[] { 65, 55,100, 60, 45, 70 }); cell = new PdfPCell(new Phrase("序号", fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase("物料号", fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase("物料名称", fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase("单位", fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase("数量", fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase("订单号", fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); document.Add(table); List<SalesOrderLine> sendLineList = GetOrderLineList(); foreach (var item in sendLineList) { table = new PdfPTable(6); table.TotalWidth = 550; table.LockedWidth = true; table.SetWidths(new int[] { 65, 55,100, 60, 45, 70 }); cell = new PdfPCell(new Phrase(item.LineNumber.ToString(), fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase(item.ProductNumber, fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase(item.ProductName, fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase(item.ProductUnit, fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase(item.Quantity.ToString(), fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); cell = new PdfPCell(new Phrase(item.SalesOrderName, fontChinese)); cell.HorizontalAlignment = Element.ALIGN_CENTER; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 5; table.AddCell(cell); document.Add(table); } string accumamtToUpper = salesorder.Money.ToString(); Phrase phrase = new Phrase(); phrase.Add(new Chunk(" 实收金额:", fontChinese)); phrase.Add(new Chunk(accumamtToUpper, fontChinese)); cell = new PdfPCell(phrase); cell.Colspan = 6; cell.HorizontalAlignment = Element.ALIGN_LEFT; cell.VerticalAlignment = Element.ALIGN_MIDDLE; cell.Padding = 8; table.AddCell(cell); document.Add(table); //iTextSharp.text.Rectangle pageSize = document.PageSize; //document.SetPageSize(pageSize); //document.NewPage(); document.Close(); stream.Dispose(); return new JsonResult("1123") { }; } catch (Exception) { throw; } finally { document.Close(); stream.Dispose(); }
private List<SalesOrderLine> GetOrderLineList() { List<SalesOrderLine> sendLineList = new List<SalesOrderLine>(); sendLineList.Add(new SalesOrderLine() { LineNumber=1,ProductNumber ="P147",ProductUnit = "PCS",Quantity =5,SalesOrderName = "S123",ProductName = "净水器1"}); sendLineList.Add(new SalesOrderLine() { LineNumber = 2, ProductNumber = "P148", ProductUnit = "PCS", Quantity = 20, SalesOrderName = "S123", ProductName = "饮水机" }); sendLineList.Add(new SalesOrderLine() { LineNumber = 3, ProductNumber = "P178", ProductUnit = "PCS", Quantity = 5, SalesOrderName = "S123", ProductName = "笔记本" }); sendLineList.Add(new SalesOrderLine() { LineNumber = 4, ProductNumber = "P897", ProductUnit = "PCS", Quantity = 8, SalesOrderName = "S123", ProductName = "化妆品" }); sendLineList.Add(new SalesOrderLine() { LineNumber = 5, ProductNumber = "P698", ProductUnit = "PCS", Quantity = 1, SalesOrderName = "S123", ProductName = "净水器1" }); return sendLineList; } private SalesOrder GetSalesOrder() { SalesOrder salesOrder = new SalesOrder(); salesOrder = (new SalesOrder() { OrderDate = DateTime.Now, Name = "S123456789", Money = 1999, CustomerName = "蒋承标",Phone = "15068271465",PayMethonText = "支付宝",Address="浙江省温州市白鹭屿" }); return salesOrder; }
***************用第二种方式在程序中动态生成PDF后 如果出现下面这种问题 IO流没有关闭 看看上面的stream流对象有没有调用Dispose()
具体案例可以在github上找