友情提示:以下画PDF的代码是先创建PDF文件,然后往PDF里填充数据,如果不符合业务需求的,可以滑过
1、首先,添加iTextSharp包
2、添加PDF基类,供添加页脚、页眉、水印等
////// Pdf处理基类 /// public class PDFBase : PdfPageEventHelper { #region 属性 private String _fontFilePathForHeaderFooter = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "SIMHEI.TTF"); ////// 页眉/页脚所用的字体 /// public String FontFilePathForHeaderFooter { get { return _fontFilePathForHeaderFooter; } set { _fontFilePathForHeaderFooter = value; } } private String _fontFilePathForBody = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "SIMSUN.TTC,1"); ////// 正文内容所用的字体 /// public String FontFilePathForBody { get { return _fontFilePathForBody; } set { _fontFilePathForBody = value; } } private PdfPTable _header; ////// 页眉 /// public PdfPTable Header { get { return _header; } private set { _header = value; } } private PdfPTable _footer; ////// 页脚 /// public PdfPTable Footer { get { return _footer; } private set { _footer = value; } } private BaseFont _baseFontForHeaderFooter; ////// 页眉页脚所用的字体 /// public BaseFont BaseFontForHeaderFooter { get { return _baseFontForHeaderFooter; } set { _baseFontForHeaderFooter = value; } } private BaseFont _baseFontForBody; ////// 正文所用的字体 /// public BaseFont BaseFontForBody { get { return _baseFontForBody; } set { _baseFontForBody = value; } } private Document _document; ////// PDF的Document /// public Document Document { get { return _document; } private set { _document = value; } } #endregion public override void OnOpenDocument(PdfWriter writer, Document document) { try { BaseFontForHeaderFooter = BaseFont.CreateFont(FontFilePathForHeaderFooter, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); BaseFontForBody = BaseFont.CreateFont(FontFilePathForBody, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Document = document; } catch (DocumentException de) { } catch (System.IO.IOException ioe) { } } #region GenerateHeader ////// 生成页眉 /// /// ///public virtual PdfPTable GenerateHeader(iTextSharp.text.pdf.PdfWriter writer) { return null; } #endregion #region GenerateFooter /// /// 生成页脚 /// /// ///public virtual PdfPTable GenerateFooter(iTextSharp.text.pdf.PdfWriter writer) { BaseFont baseFont = BaseFontForHeaderFooter; iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, 10, iTextSharp.text.Font.NORMAL); PdfPTable footer = new PdfPTable(3); AddFooterCell(footer, "甲方项目经理:", font); AddFooterCell(footer, "乙方代表::", font); AddFooterCell(footer, "日期:", font); return footer; } private void AddFooterCell(PdfPTable foot, String text, iTextSharp.text.Font font) { PdfPCell cell = new PdfPCell(); cell.BorderWidthTop = 2; cell.BorderWidthRight = 0; cell.BorderWidthBottom = 0; cell.BorderWidthLeft = 0; cell.Phrase = new Phrase(text, font); cell.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER; foot.AddCell(cell); } #endregion public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document) { base.OnEndPage(writer, document); 输出页眉 //Header = GenerateHeader(writer); //Header.TotalWidth = document.PageSize.Width - 20f; /调用PdfTable的WriteSelectedRows方法。该方法以第一个参数作为开始行写入。 /第二个参数-1表示没有结束行,并且包含所写的所有行。 /第三个参数和第四个参数是开始写入的坐标x和y. //Header.WriteSelectedRows(0, -1, 10, document.PageSize.Height - 20, writer.DirectContent); //输出页脚 Footer = GenerateFooter(writer); Footer.TotalWidth = document.PageSize.Width - 20f; Footer.WriteSelectedRows(0, -1, 10, document.PageSize.GetBottom(60), writer.DirectContent); } }
3、根据后台查出的数据画出PDF
///友情提示:在代码画PDF之前,最好自己先手动做一个范本(Excel),然后根据对应的行和列,代码画出
[AllowAnonymous]
public string BuildPdf(int srqrID)
{
//获取数据
var srqr = SRQR.getInfoByID(srqrID);
var errMSG = "";
try
{
if (srqr != null && srqr.ID > 0)
{
//文件保存路径为当前程序的路径+日期+文件名称
var urlHelper = new UrlHelper(this.Request.RequestContext);
string hostPath = urlHelper.Content("~/");
var dt = DateTime.Now;
string fileHost = Server.MapPath("/") + "doc\SRQRAttachments\" + dt.ToString("yyyyMMdd") + "\";
if (!Directory.Exists(fileHost))
{
Directory.CreateDirectory(fileHost);
}
string fileName = string.Format("{0}-{1}.pdf", "收入确认单审批表", srqr.DJBH);//文件名称
string filePath = fileHost + fileName;//文件路径
string title = string.Format("收入确认单审批表");
BaseFont bf = BaseFont.CreateFont(@"C:WindowsFontsSIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
BaseFont fs = BaseFont.CreateFont(@"C:WindowsFontsSIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font fonta = new Font(bf, 20, Font.BOLD, BaseColor.BLACK);
Font fontb = new Font(bf, 12, Font.NORMAL, BaseColor.BLACK);
Font fontc = new Font(fs, 20, Font.BOLD, BaseColor.BLACK);
Rectangle pageSize = new Rectangle(1600, 1000);
Document document = new Document(pageSize, 20, 20, 50, 80);
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(filePath, FileMode.Create));
writer.PageEvent = new PDFBase();
document.Open();
Paragraph p1 = new Paragraph(title, fontc);
p1.Alignment = Element.ALIGN_CENTER;
document.Add(p1);
Paragraph p2 = new Paragraph(" ", fontc);
p2.Alignment = Element.ALIGN_CENTER;
document.Add(p2);
document.AddTitle(title);
//设置列的宽度,要画的PDF有多少列,就写多少个
PdfPTable table = new PdfPTable(new float[] { 20, 10, 10, 10, 10, 10, 10, 20, 10, 10, 10, 20, 10, 10, 10, 10 });
table.TotalWidth = 1200;
table.LockedWidth = true;
#region 第一行
PdfPCell row1_Cell1 = new PdfPCell(new Paragraph("单据内码", fontc));
row1_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row1_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row1_Cell1);
PdfPCell row1_Cell1_value = new PdfPCell(new Paragraph(srqr.DJNM, fontb));
row1_Cell1_value.HorizontalAlignment = Element.ALIGN_CENTER;
row1_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row1_Cell1_value.Colspan = 6;
table.AddCell(row1_Cell1_value);
PdfPCell row1_Cell2 = new PdfPCell(new Paragraph("单据编号", fontc));
row1_Cell2.HorizontalAlignment = Element.ALIGN_CENTER;
row1_Cell2.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row1_Cell2);
PdfPCell row1_Cell2_value = new PdfPCell(new Paragraph(srqr.DJBH, fontb));
row1_Cell2_value.HorizontalAlignment = Element.ALIGN_CENTER;
row1_Cell2_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row1_Cell2_value.Colspan = 3;
table.AddCell(row1_Cell2_value);
PdfPCell row1_Cell3 = new PdfPCell(new Paragraph("行政组织", fontc));
row1_Cell3.HorizontalAlignment = Element.ALIGN_CENTER;
row1_Cell3.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row1_Cell3);
PdfPCell row1_Cell3_value = new PdfPCell(new Paragraph(srqr.XZZZName, fontb));
row1_Cell3_value.HorizontalAlignment = Element.ALIGN_CENTER;
row1_Cell3_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row1_Cell3_value.Colspan = 4;
table.AddCell(row1_Cell3_value);
#endregion
#region 第二行
PdfPCell row2_Cell1 = new PdfPCell(new Paragraph("行政部门", fontc));
row2_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row2_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row2_Cell1);
PdfPCell row2_Cell1_value = new PdfPCell(new Paragraph(srqr.XZBMName, fontb));
row2_Cell1_value.HorizontalAlignment = Element.ALIGN_CENTER;
row2_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row2_Cell1_value.Colspan = 6;
table.AddCell(row2_Cell1_value);
PdfPCell row2_Cell2 = new PdfPCell(new Paragraph("所属单位", fontc));
row2_Cell2.HorizontalAlignment = Element.ALIGN_CENTER;
row2_Cell2.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row2_Cell2);
PdfPCell row2_Cell2_value = new PdfPCell(new Paragraph(srqr.OwnerDeptName, fontb));
row2_Cell2_value.HorizontalAlignment = Element.ALIGN_CENTER;
row2_Cell2_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row2_Cell2_value.Colspan = 3;
table.AddCell(row2_Cell2_value);
PdfPCell row2_Cell3 = new PdfPCell(new Paragraph("所属部门", fontc));
row2_Cell3.HorizontalAlignment = Element.ALIGN_CENTER;
row2_Cell3.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row2_Cell3);
PdfPCell row2_Cell3_value = new PdfPCell(new Paragraph(srqr.OwnerProName, fontb));
row2_Cell3_value.HorizontalAlignment = Element.ALIGN_CENTER;
row2_Cell3_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row2_Cell3_value.Colspan = 4;
table.AddCell(row2_Cell3_value);
#endregion
#region 第三行
PdfPCell row3_Cell1 = new PdfPCell(new Paragraph("收入类型", fontc));
row3_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row3_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row3_Cell1);
PdfPCell row3_Cell1_value = new PdfPCell(new Paragraph(srqr.SRLXName, fontb));
row3_Cell1_value.HorizontalAlignment = Element.ALIGN_CENTER;
row3_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row3_Cell1_value.Colspan = 6;
table.AddCell(row3_Cell1_value);
PdfPCell row3_Cell2 = new PdfPCell(new Paragraph("纳税人类型", fontc));
row3_Cell2.HorizontalAlignment = Element.ALIGN_CENTER;
row3_Cell2.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row3_Cell2);
PdfPCell row3_Cell2_value = new PdfPCell(new Paragraph(srqr.NSRLXName, fontb));
row3_Cell2_value.HorizontalAlignment = Element.ALIGN_CENTER;
row3_Cell2_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row3_Cell2_value.Colspan = 3;
table.AddCell(row3_Cell2_value);
PdfPCell row3_Cell3 = new PdfPCell(new Paragraph("是否主营", fontc));
row3_Cell3.HorizontalAlignment = Element.ALIGN_CENTER;
row3_Cell3.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row3_Cell3);
PdfPCell row3_Cell3_value = new PdfPCell(new Paragraph(srqr.SFZYName, fontb));
row3_Cell3_value.HorizontalAlignment = Element.ALIGN_CENTER;
row3_Cell3_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row3_Cell3_value.Colspan = 4;
table.AddCell(row3_Cell3_value);
#endregion
#region 第四行
PdfPCell row4_Cell1 = new PdfPCell(new Paragraph("制单人", fontc));
row4_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row4_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row4_Cell1);
PdfPCell row4_Cell1_value = new PdfPCell(new Paragraph(srqr.ZDRName, fontb));
row4_Cell1_value.HorizontalAlignment = Element.ALIGN_CENTER;
row4_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row4_Cell1_value.Colspan = 6;
table.AddCell(row4_Cell1_value);
PdfPCell row4_Cell2 = new PdfPCell(new Paragraph("单据日期", fontc));
row4_Cell2.HorizontalAlignment = Element.ALIGN_CENTER;
row4_Cell2.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row4_Cell2);
PdfPCell row4_Cell2_value = new PdfPCell(new Paragraph((srqr.DJRQ != null ? srqr.DJRQ.Value.ToString("yyyy-MM-dd") : ""), fontb));
row4_Cell2_value.HorizontalAlignment = Element.ALIGN_CENTER;
row4_Cell2_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row4_Cell2_value.Colspan = 3;
table.AddCell(row4_Cell2_value);
PdfPCell row4_Cell3 = new PdfPCell(new Paragraph("单据状态", fontc));
row4_Cell3.HorizontalAlignment = Element.ALIGN_CENTER;
row4_Cell3.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row4_Cell3);
PdfPCell row4_Cell3_value = new PdfPCell(new Paragraph(srqr.DJZTName, fontb));
row4_Cell3_value.HorizontalAlignment = Element.ALIGN_CENTER;
row4_Cell3_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row4_Cell3_value.Colspan = 4;
table.AddCell(row4_Cell3_value);
#endregion
#region 第五行
PdfPCell row5_Cell1 = new PdfPCell(new Paragraph("本位币币种", fontc));
row5_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row5_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row5_Cell1);
PdfPCell row5_Cell1_value = new PdfPCell(new Paragraph(srqr.BWBName, fontb));
row5_Cell1_value.HorizontalAlignment = Element.ALIGN_CENTER;
row5_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row5_Cell1_value.Colspan = 6;
table.AddCell(row5_Cell1_value);
PdfPCell row5_Cell2 = new PdfPCell(new Paragraph("计税方式", fontc));
row5_Cell2.HorizontalAlignment = Element.ALIGN_CENTER;
row5_Cell2.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row5_Cell2);
PdfPCell row5_Cell2_value = new PdfPCell(new Paragraph(srqr.JSFSName, fontb));
row5_Cell2_value.HorizontalAlignment = Element.ALIGN_CENTER;
row5_Cell2_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row5_Cell2_value.Colspan = 3;
table.AddCell(row5_Cell2_value);
PdfPCell row5_Cell3 = new PdfPCell(new Paragraph("收入确认金额", fontc));
row5_Cell3.HorizontalAlignment = Element.ALIGN_CENTER;
row5_Cell3.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row5_Cell3);
PdfPCell row5_Cell3_value = new PdfPCell(new Paragraph((srqr.SRQRJEBB ?? 0) == 0 ? "" : srqr.SRQRJEBB.Value.ToString("F2"), fontb));
row5_Cell3_value.HorizontalAlignment = Element.ALIGN_CENTER;
row5_Cell3_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row5_Cell3_value.Colspan = 4;
table.AddCell(row5_Cell3_value);
#endregion
#region 第六行
PdfPCell row6_Cell1 = new PdfPCell(new Paragraph("附件张数", fontc));
row6_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row6_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(row6_Cell1);
PdfPCell row6_Cell1_value = new PdfPCell(new Paragraph((srqr.DJFJZS ?? 0).ToString(), fontb));
row6_Cell1_value.HorizontalAlignment = Element.ALIGN_CENTER;
row6_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row6_Cell1_value.Colspan = 6;
table.AddCell(row6_Cell1_value);
#endregion
#region 第七行
PdfPCell row7_Cell1 = new PdfPCell(new Paragraph("单据摘要", fontc));
row7_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row7_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
row7_Cell1.Rowspan = 2;
table.AddCell(row7_Cell1);
PdfPCell row7_Cell1_value = new PdfPCell(new Paragraph(srqr.DJZY, fontb));
row7_Cell1_value.HorizontalAlignment = Element.ALIGN_LEFT;
row7_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row7_Cell1_value.Colspan = 15;
row7_Cell1_value.Rowspan = 2;
table.AddCell(row7_Cell1_value);
#endregion
#region 第八行
PdfPCell row8_Cell1 = new PdfPCell(new Paragraph("报账事由", fontc));
row8_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row8_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
row8_Cell1.Rowspan = 2;
table.AddCell(row8_Cell1);
PdfPCell row8_Cell1_value = new PdfPCell(new Paragraph(srqr.BZSY, fontb));
row8_Cell1_value.HorizontalAlignment = Element.ALIGN_LEFT;
row8_Cell1_value.VerticalAlignment = Element.ALIGN_MIDDLE;
row8_Cell1_value.Colspan = 15;
row8_Cell1_value.Rowspan = 2;
table.AddCell(row8_Cell1_value);
#endregion
var workerList = Wf_QueryDAL.Wf_GetEffectiveTrackList(srqr.WorkID ?? 0);
if (workerList != null && workerList.Count > 0)
{
#region 第九行
PdfPCell row9_Cell1 = new PdfPCell(new Paragraph("审批记录", fontc));
row9_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
row9_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
row9_Cell1.Colspan = 16;
table.AddCell(row9_Cell1);
#endregion
foreach (var item in workerList)
{
#region 审批处理人相关
PdfPCell spRow_Cell1 = new PdfPCell(new Paragraph(item.NDFromT, fontc));
spRow_Cell1.HorizontalAlignment = Element.ALIGN_CENTER;
spRow_Cell1.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(spRow_Cell1);
PdfPCell spRow_Cell2 = new PdfPCell(new Paragraph(item.EmpFromT, fontb));
spRow_Cell2.HorizontalAlignment = Element.ALIGN_CENTER;
spRow_Cell2.VerticalAlignment = Element.ALIGN_MIDDLE;
spRow_Cell2.Colspan = 6;
table.AddCell(spRow_Cell2);
PdfPCell spRow_Cell3 = new PdfPCell(new Paragraph(item.NodeData, fontb));
spRow_Cell3.HorizontalAlignment = Element.ALIGN_CENTER;
spRow_Cell3.VerticalAlignment = Element.ALIGN_MIDDLE;
spRow_Cell3.Colspan = 4;
table.AddCell(spRow_Cell3);
PdfPCell spRow_Cell4 = new PdfPCell(new Paragraph(item.RDT.Substring(0, 10), fontb));
spRow_Cell4.HorizontalAlignment = Element.ALIGN_CENTER;
spRow_Cell4.VerticalAlignment = Element.ALIGN_MIDDLE;
spRow_Cell4.Colspan = 5;
table.AddCell(spRow_Cell4);
#endregion
}
}
document.Add(table);
document.Close();
writer.Close();
//给PDF加水印
// SetWatermark(filePath, "这是水印");
//如果需要单独保存附件的一些信息,比如大小等,可利用FileInfo
//FileInfo fileInfo = new FileInfo(filePath);
}
}
catch (Exception ex)
{
//对异常进行处理
}
return errMSG;
}
4、加水印
////// 给PDF加水印 /// /// PDF路径 /// 需要加的水印 ///private void SetWatermark(string outputfilepath, string waterMarkName) { PdfReader pdfReader = null; PdfStamper pdfStamper = null; try { pdfReader = new PdfReader(outputfilepath); pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create)); // 设置密码 //pdfStamper.SetEncryption(false,userPassWord, ownerPassWord, permission); int total = pdfReader.NumberOfPages + 1; PdfContentByte content; BaseFont font = BaseFont.CreateFont(@"C:WINDOWSFontsSIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); PdfGState gs = new PdfGState(); gs.FillOpacity = 0.3f;//透明度 int waterMarkNameLenth = waterMarkName.Length; char c; int rise = 0; int span = 15; int fontSize = 20; int height = 500; int width = 1800; string spanString = " ";//水平位移 for (int i = 1; i < total; i++) { rise = waterMarkNameLenth * span; //content = pdfStamper.GetOverContent(i);//在内容上方加水印 content = pdfStamper.GetUnderContent(i);//在内容下方加水印 content.SetGState(gs); content.BeginText(); content.SetColorFill(BaseColor.DARK_GRAY); content.SetFontAndSize(font, fontSize); int heightNumbert = (int)Math.Ceiling((decimal)height / (decimal)rise);//垂直重复的次数,进一发 int panleWith = (fontSize + span) * waterMarkNameLenth; int widthNumber = (int)Math.Ceiling((decimal)width / (decimal)panleWith);//水平重复次数 // 设置水印文字字体倾斜 开始 for (int w = 0; w < widthNumber; w++) { for (int h = 1; h <= heightNumbert; h++) { int yleng = rise * h; content.SetTextMatrix(w * panleWith, yleng);//x,y设置水印开始的绝对左边,以左下角为x,y轴的起点 for (int k = 0; k < waterMarkNameLenth; k++) { content.SetTextRise(yleng);//指定的y轴值处添加 c = waterMarkName[k]; content.ShowText(c + spanString); yleng -= span; } } } content.EndText(); } } catch (Exception ex) { throw ex; } finally { if (pdfStamper != null) pdfStamper.Close(); if (pdfReader != null) pdfReader.Close(); } }
5、效果



