第一种方式 套打 (先做好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()