iTextSharp-PDF批量导出

HTML转PDF批量导出速度太慢且使用Spire.pdf.dll限制页签10后需要开通会员才能使用-做出优化

环境:U9 - UI插件

需求:选择需要导出的客户查询对应对账数据批量导出PDF并弹出下载框保存到默认位置

cs 复制代码
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI;
using System.Web.UI.WebControls;
using UFIDA.U9.AP.Payment;
using UFIDA.U9.Cust.HuaRui.QueryCustomerUIModel;
using UFIDA.U9.FI.AP.Payment.PayBillUIModel;
using UFIDA.U9.UI.PDHelper;
using UFSoft.UBF.AopFrame.Lock;
using UFSoft.UBF.Business;
using UFSoft.UBF.UI;
using UFSoft.UBF.UI.ControlModel;
using UFSoft.UBF.UI.WebControlAdapter;
using UFSoft.UBF.Util.DataAccess;
using static UFIDA.U9.Cust.HuaRui.HuaRExtendUIPlug.TemplateClass;

namespace UFIDA.U9.Cust.HuaRui.HuaRExtendUIPlug
{
    public partial class QueryCustomerUIFormWebPart : UFSoft.UBF.UI.Custom.ExtendedPartBase
    {
        private UFIDA.U9.Cust.HuaRui.QueryCustomerUIModel.QueryCustomerUIFormWebPart _part;
        IUFButton BtnFresh;
        public override void AfterInit(UFSoft.UBF.UI.IView.IPart Part, EventArgs args)
        {
            _part = Part as UFIDA.U9.Cust.HuaRui.QueryCustomerUIModel.QueryCustomerUIFormWebPart;
            if (_part == null)
                return;
            #region 添加按钮
            IUFButton BtnTransfer = new UFWebButtonAdapter();
            BtnTransfer.Text = "批量导出";
            BtnTransfer.AutoPostBack = true;
            BtnTransfer.ID = "BtnTransfer";
            BtnTransfer.Width = 100;
            BtnTransfer.Height = 20;
            IUFCard card = (IUFCard)_part.GetUFControlByName(_part.TopLevelContainer, "Card0");
            card.Controls.Add(BtnTransfer);
            CommonFunction.Layout(card, BtnTransfer, 0, 0);
            BtnTransfer.Click += new EventHandler(BtnTransfer_Click);
            #endregion
            base.AfterInit(Part, args);
        }

        private void BtnTransfer_Click(object sender, EventArgs e)
        {
            try
            {
                _part.OnDataCollect(this);
                _part.IsDataBinding = true;
                _part.IsConsuming = true;
                _part.Model.ClearErrorMessage();
                if (_part.Model.QueryCustomerLine.SelectRecords.Count == 0)
                {
                    _part.Model.ErrorMessage.Message = "请选择数据!";
                    return;
                }
                #region 生成HTML文件转PDF复制到指定文件夹
                string filePathUrl = "";//文件地址
                var basePath = AppDomain.CurrentDomain.BaseDirectory;
                string destinationPath = basePath + @"\FileZipTemp\";
                string destinationPathZip = basePath + @"\FileZip\";
                string FileName = "货款对账单-" + DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
                if (!Directory.Exists(destinationPath))
                {
                    Directory.CreateDirectory(destinationPath);
                }
                if (!Directory.Exists(destinationPathZip))
                {
                    Directory.CreateDirectory(destinationPathZip);
                }
                string CustomersName = string.Empty;
                string str = string.Empty;
                if (_part.Model.QueryCustomerLine.SelectRecords.Count > 1)
                {
                    foreach (QueryCustomerLineRecord rd in _part.Model.QueryCustomerLine.SelectRecords)
                    {
                        str += ",N'" + rd.CustomerName + "'";
                    }
                    str = str.Substring(1);
                    CustomersName = "(CustomersName in (" + str + "))";
                }
                else
                {
                    foreach (QueryCustomerLineRecord rd in _part.Model.QueryCustomerLine.SelectRecords)
                    {
                        CustomersName = "(CustomersName = N'" + rd.CustomerName + "')";
                    }
                }
                DataSet ds = new DataSet();
                string procBomName = "Cust_HuaRui_ProvideAccountNew";
                DataParamList lstBom = new DataParamList();
                lstBom.Add(DataParamFactory.CreateInput("CustomersName", CustomersName));
                lstBom.Add(DataParamFactory.CreateInput("ContarctsState", null));
                lstBom.Add(DataParamFactory.CreateInput("UserID", PDContext.Current.UserCode));
                lstBom.Add(DataParamFactory.CreateInput("SOBAccountingPeriod", null));
                DataAccessor.RunSP(procBomName, lstBom, out ds);
                List<ProvideAccount> ProvideAccount = CommonHelper.DataTable2List<ProvideAccount>(ds.Tables[0]);
                if (ds.Tables[0].Rows.Count == 0)
                {
                    _part.Model.ErrorMessage.Message = "所选客户没有货款对账相关内容!";
                    return;
                }
                var Customers = ProvideAccount.GroupBy(x => x.CustomersName).Select(x => x.Key).ToList();
                //调用模版提供的默认实现.--默认实现可能会调用相应的Action.
                foreach (var customer in Customers)
                {
                    var list = ProvideAccount.Where(x => x.CustomersName == customer).ToList();

                    if (list.Count == 0)
                    {
                        continue;
                    }
                    //StringBuilder htmlContent = HtmlTOPdf(list, customer);
                    //string htmlFilePathUrl = destinationPathZip + "\\" + FileName;
                    //if (!Directory.Exists(htmlFilePathUrl))
                    //{
                    //    Directory.CreateDirectory(htmlFilePathUrl);
                    //}
                    string pdfFilePathUrl = destinationPath + "\\" + FileName;
                    if (!Directory.Exists(pdfFilePathUrl))
                    {
                        Directory.CreateDirectory(pdfFilePathUrl);
                    }
                    //指定输出文件路径
                    //string htmlName = customer + DateTime.Now.ToString("yyyyMMdd") + ".html";
                    string pdfName = customer + DateTime.Now.ToString("yyyyMMdd") + ".pdf";
                    //string htmlPath = Path.Combine(htmlFilePathUrl, htmlName);
                    string pdfPath = Path.Combine(pdfFilePathUrl, pdfName);

                     将HTML内容写入文件
                    //File.WriteAllText(htmlPath, htmlContent.ToString());

                    从.html文件中获取HTML字符串
                    //string htmlString = File.ReadAllText(htmlPath);

                    指定插件路径
                    //string pluginPath = "D:\\yonyou\\U9V60\\Portal\\plugins";

                    设置插件
                    //HtmlConverter.PluginPath = pluginPath;

                    将HTML字符串转换为PDF
                    //HtmlConverter.Convert(htmlString, pdfPath, true, 100000, new Size(803, 1188), new PdfMargins(0), Spire.Pdf.HtmlConverter.LoadHtmlType.SourceCode);
                    PdfHelper.CreatePDF(pdfPath, list, customer);
                }

                #endregion 服务端生成ZIP文件并下载

                #region 服务端生成ZIP文件并下载

                string tempZipFilePath = Path.GetTempFileName();
                string tempZipFilePath1 = "";
                string tempZipFilePathZip = "";
                string script = "";
                try
                {
                    if (!Directory.Exists(destinationPathZip))
                    {
                        Directory.CreateDirectory(destinationPathZip);
                    }
                    var safePath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), destinationPath));
                    if (!Directory.Exists(safePath))
                    {
                        Directory.CreateDirectory(safePath);
                    }
                    // 创建临时ZIP文件
                    //string guid = Guid.NewGuid().ToString();

                    tempZipFilePath1 = Path.Combine(Path.GetTempPath(), FileName + ".zip");

                    System.IO.Compression.ZipFile.CreateFromDirectory(safePath, tempZipFilePath1);

                    File.Copy(tempZipFilePath1, Path.Combine(destinationPathZip, FileName + ".zip"), true);

                    //拼接链接
                    script = @"../\FileZip/" + FileName + @"" + ".zip";
                    //延迟删除文件名称
                    tempZipFilePathZip = destinationPathZip + FileName + @"" + ".zip";
                    script = string.Format("window.open('{0}'); ", script);
                    AtlasHelper.RegisterAtlasStartupScript((Control)_part.TopLevelContainer, _part.GetType(), "downbload", script, true);
                }
                finally
                {
                    // 清理临时文件
                    File.Delete(tempZipFilePath);
                    File.Delete(tempZipFilePath1);
                }

                #endregion 服务端生成ZIP文件并下载

                #region 删除服务端生成的临时文件夹

                string folderPath = destinationPath; // 替换为你想要删除的文件夹路径

                try
                {
                    // 递归删除文件夹及其所有内容
                    Directory.Delete(folderPath, true);

                    var timer = new System.Timers.Timer();
                    timer.Interval = 15000;
                    timer.Elapsed += (sender1, e1) =>
                    {
                        if (!string.IsNullOrEmpty(destinationPathZip))
                            DeleteDirectoryContents(destinationPathZip);
                        timer.Stop();
                    }; timer.Start();

                    //Directory.Delete(destinationPathZip, true);
                }
                catch (Exception ex)
                {
                    // 处理任何可能的异常,例如权限问题、路径不存在等
                    //Console.WriteLine("删除文件夹时发生错误: " + ex.Message);
                    _part.Model.ErrorMessage.Message = "删除文件夹时发生错误!";
                    return;
                }

                #endregion 删除服务端生成的临时文件夹
            }
            catch (Exception ex)
            {
                _part.Model.ErrorMessage.Message = ex.Message;
                return;
            }

        }
        public static void DeleteDirectoryContents(string path)
        {
            foreach (string item in Directory.GetFileSystemEntries(path))
            {
                if (File.GetAttributes(item).HasFlag(FileAttributes.Directory))
                {
                    // 递归删除子目录
                    DeleteDirectoryContents(item);
                }
                else
                {
                    // 删除文件
                    File.Delete(item);
                }
            }
            // 删除空文件夹
            //Directory.Delete(path);
        }
    }
}

需要的帮助类:

1、生成PDF
cs 复制代码
using iTextSharp.text.pdf.draw;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.IO;
using System.Data;
using UFIDA.U9.Cust.HuaRui.HuaRExtendUI;
using System.Collections.Generic;
using System.Linq;

namespace UFIDA.U9.Cust.HuaRui.HuaRExtendUIPlug
{
    public class PdfHelper
    {
        private static void SetImg(PdfWriter writer, string path, float fitWidth, float fitHeight, float absoluteX, float absoluteY)
        {
            try
            {
                Image image = Image.GetInstance(path);
                image.Alignment = Element.ALIGN_MIDDLE;
                image.ScaleToFit(fitWidth, fitHeight);
                image.SetAbsolutePosition(absoluteX, absoluteY);
                writer.DirectContent.AddImage(image);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }
        }

        public static void CreatePDF(string fileName, List<ProvideAccount> list, string CustomerName)
        {
            try
            {
                Document document = new Document(new Rectangle(803, 1188), 30F, 30F, 100F, 100F);
                //fileName = Path.GetFullPath("../..") + @"\PdfFiles\" + fileName + ".pdf";
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create));

                // 定义页眉和页脚页码事件
                PDFBuilder builder = new PDFBuilder();
                builder.CustomerName = CustomerName;
                //设置页面监听事件
                writer.PageEvent = builder;
                document.Open();

                //换行
                Paragraph newLine = new Paragraph("\n");
                float tableWidthPercentage = 100f; //表格的整体宽度

                //表格背景色
                BaseColor green = new BaseColor(175, 215, 136);
                BaseColor blue = new BaseColor(148, 170, 214);

                //所需字体
                string fontPath = Path.GetFullPath("../..") + @"\fonts\";
                string timesPath = fontPath + "TIMES.TTF";
                string timesBdPath = fontPath + "TIMESBD.TTF";

                BaseFont bf = BaseFont.CreateFont(timesPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                BaseFont blodbf = BaseFont.CreateFont(timesBdPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

                Font coverFont = new Font(blodbf, 30, Font.NORMAL);
                Font titleFont = new Font(blodbf, 16, Font.NORMAL);
                Font coverTiletFontMarked = new Font(blodbf, 16f, Font.NORMAL, new BaseColor(148, 170, 214));
                Font textFontBold = new Font(blodbf, 10.5f, Font.NORMAL);
                Font textFont = new Font(bf, 10.5f, Font.NORMAL);
                Font textFontGray = new Font(blodbf, 10.5f, Font.NORMAL, new BaseColor(215, 215, 215));
                Font chapterFont = new Font(blodbf, 14f, Font.NORMAL);
                //设置字体,支持中文
                BaseFont bfChinese = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\msyh.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                iTextSharp.text.Font fontChinese = new iTextSharp.text.Font(bfChinese, 7, iTextSharp.text.Font.NORMAL, new BaseColor(0, 0, 0));

                //获取datatable数据
                DataTable Data = GetDataTableList(list);
                PdfPTable dataTb = new PdfPTable(Data.Columns.Count);

                dataTb.SetWidths(new float[] { 0.04f, 0.06f, 0.06f, 0.06f, 0.08f, 0.06f, 0.06f, 0.06f, 0.06f, 0.06f, 0.06f, 0.08f, 0.06f, 0.06f, 0.06f, 0.06f, 0.06f, 0.06f, 0.06f });// 每个单元格占多宽
                dataTb.WidthPercentage = tableWidthPercentage;
                dataTb.DefaultCell.BorderColor = BaseColor.LIGHT_GRAY;
                dataTb.DefaultCell.Padding = 1;
                dataTb.DefaultCell.BorderWidth = 1;
                dataTb.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER; // 设置单元格内容水平居中
                dataTb.DefaultCell.VerticalAlignment = Element.ALIGN_MIDDLE; // 设置单元格内容垂直居中
                                                                             //将datatable表头转换成PDFTable的表头
                foreach (DataColumn dc in Data.Columns)
                {
                    dataTb.AddCell(new Phrase(dc.ColumnName.ToString(), fontChinese));
                }
                //插入数据
                for (int i = 0; i < Data.Rows.Count; i++)
                {
                    for (int j = 0; j < Data.Columns.Count; j++)
                    {
                        dataTb.AddCell(new Phrase(Data.Rows[i][j].ToString(), fontChinese));
                    }
                }

                document.Add(dataTb);
                document.Add(newLine);

                document.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("PDF生成失败-错误信息:" + ex.Message);
            }
        }

        /// <summary>
        /// 创建默认dataTable数据
        /// </summary>
        /// <returns></returns>
        public static DataTable GetDataTableList(List<ProvideAccount> list)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("序号", typeof(string));//添加列  
            dt.Columns.Add("合同日期", typeof(string));//添加列 
            dt.Columns.Add("合同编码", typeof(string));//添加列 
            dt.Columns.Add("客户PO号", typeof(string));//添加列 
            dt.Columns.Add("项目名称", typeof(string));//添加列 
            dt.Columns.Add("最终合同金额", typeof(string));//添加列 
            dt.Columns.Add("出库金额", typeof(string));//添加列 
            dt.Columns.Add("已开票金额", typeof(string));//添加列 
            dt.Columns.Add("已付款金额", typeof(string));//添加列 
            dt.Columns.Add("应收金额", typeof(string));//添加列 
            dt.Columns.Add("逾期金额", typeof(string));//添加列 
            dt.Columns.Add("付款方式", typeof(string));//添加列 
            dt.Columns.Add("到期时间", typeof(string));//添加列 
            dt.Columns.Add("发货完成", typeof(string));//添加列 
            dt.Columns.Add("合同状态", typeof(string));//添加列 
            dt.Columns.Add("业务员", typeof(string));//添加列 
            dt.Columns.Add("业务单元", typeof(string));//添加列 
            dt.Columns.Add("历史合同编号", typeof(string));//添加列 
            dt.Columns.Add("初始合同金额", typeof(string));//添加列 
            //循环添加行的数据
            int num = 1;
            foreach (var item in list)
            {
                DataRow dtRow = dt.NewRow();
                dtRow["序号"] = num;
                dtRow["合同日期"] = item.CreatedOn;
                dtRow["合同编码"] = item.HisCRMDocNo;
                dtRow["客户PO号"] = item.CustomerPO;
                dtRow["项目名称"] = item.ProjectName;
                dtRow["最终合同金额"] = item.ContractAmount;
                dtRow["出库金额"] = item.ShipSumMoney;
                dtRow["已开票金额"] = item.InvoicedAmount;
                dtRow["已付款金额"] = item.BalanceAmount;
                dtRow["应收金额"] = item.BusinessReceivaBalance;
                dtRow["逾期金额"] = item.AnticipatoryRight;
                dtRow["付款方式"] = item.ConfirmTermName;
                dtRow["到期时间"] = item.EstimatedPayDate;
                dtRow["发货完成"] = item.IsCompletedShip;
                dtRow["合同状态"] = item.contarctsState;
                dtRow["业务员"] = item.OperatorsName;
                dtRow["业务单元"] = item.BusinessUnit;
                dtRow["历史合同编号"] = item.CRMDocNo;
                dtRow["初始合同金额"] = item.OriginalContractAmount;
                dt.Rows.Add(dtRow);
                num++;
            }
            //添加合计行
            DataRow dtRow2 = dt.NewRow();
            dtRow2["序号"] = "";
            dtRow2["合同日期"] = "";
            dtRow2["合同编码"] = "";
            dtRow2["客户PO号"] = "";
            dtRow2["项目名称"] = "合计";
            dtRow2["最终合同金额"] = list.Sum(x => x.ContractAmount);
            dtRow2["出库金额"] = list.Sum(x => x.ShipSumMoney);
            dtRow2["已开票金额"] = list.Sum(x => x.InvoicedAmount);
            dtRow2["已付款金额"] = list.Sum(x => x.BalanceAmount);
            dtRow2["应收金额"] = list.Sum(x => x.BusinessReceivaBalance);
            dtRow2["逾期金额"] = list.Sum(x => x.AnticipatoryRight);
            dtRow2["付款方式"] = "";
            dtRow2["到期时间"] = "";
            dtRow2["发货完成"] = "";
            dtRow2["合同状态"] = "";
            dtRow2["业务员"] = "";
            dtRow2["业务单元"] = "";
            dtRow2["历史合同编号"] = "";
            dtRow2["初始合同金额"] = list.Sum(x => x.OriginalContractAmount);
            dt.Rows.Add(dtRow2);
            return dt;
        }

        private static PdfPCell GetCell(Phrase phrase, BaseColor color, int colSpan, int rowSpan)
        {
            PdfPCell cells = new PdfPCell(phrase);
            cells.UseAscender = true;
            cells.MinimumHeight = 20f;
            cells.HorizontalAlignment = Element.ALIGN_CENTER;
            cells.VerticalAlignment = 5;
            cells.Colspan = colSpan;
            cells.Rowspan = rowSpan;
            cells.NoWrap = false;
            if (color != null)
            {
                cells.BackgroundColor = color;
            }
            return cells;
        }
    }
}
2、设置页眉和页脚
cs 复制代码
using System;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text;


namespace UFIDA.U9.Cust.HuaRui.HuaRExtendUIPlug
{
    public class PDFBuilder : PdfPageEventHelper
    {
        public string CustomerName;
        // 模板
        public PdfTemplate total;

        // 基础字体对象
        public BaseFont bf = null;

        // 利用基础字体生成的字体对象,一般用于生成中文文字
        public Font fontDetail = null;

        /// <summary>
        /// 文档打开时创建模板
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="document"></param>
        public override void OnOpenDocument(PdfWriter writer, Document document)
        {
            total = writer.DirectContent.CreateTemplate(50, 50);// 共 页 的矩形的长宽高
        }

        /// <summary>
        /// 关闭每页的时候,写入页眉,页脚。
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="document"></param>
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            this.AddPage(writer, document);
        }

        public static void SetImg(PdfWriter writer, string path, float fitWidth, float fitHeight, float absoluteX, float absoluteY)
        {
            try
            {
                Image image = Image.GetInstance(path);
                image.Alignment = Element.ALIGN_MIDDLE;
                image.ScaleToFit(fitWidth, fitHeight);
                image.SetAbsolutePosition(absoluteX, absoluteY);
                writer.DirectContent.AddImage(image);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }
        }

        /// <summary>
        /// 加分页
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="document"></param>
        public void AddPage(PdfWriter writer, Document document)
        {
            if (document.PageNumber >=1)
            {
                string fontPath = Path.GetFullPath("../..") + @"\fonts\";

                try
                {
                    string timesPath = fontPath + "TIMES.TTF";
                    bf = BaseFont.CreateFont(timesPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    throw e;
                }

                BaseFont blodf = null;
                try
                {
                    string timesBdPath = fontPath + "TIMESBD.TTF";
                    blodf = BaseFont.CreateFont(timesBdPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    throw e;
                }
              
                //设置字体,支持中文
                BaseFont bfChinese = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\msyh.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                iTextSharp.text.Font fontChinese = new iTextSharp.text.Font(bfChinese, 16, iTextSharp.text.Font.BOLD, new BaseColor(0, 0, 0));
                iTextSharp.text.Font fontChinese1 = new iTextSharp.text.Font(bfChinese, 7, iTextSharp.text.Font.NORMAL, new BaseColor(0, 0, 0));

                //Phrase pageNumberPh = new Phrase("page " + (document.PageNumber - 1), fontChinese);
                float center = document.PageSize.Right / 2;//页面的水平中点
                float headerleft = document.PageSize.GetLeft(50);//页面的z左边距
                float right = document.PageSize.GetRight(90);//页面的z左边距
                float top = document.PageSize.Top - 36;
                float bottom = document.PageSize.Bottom + 10;
                float x = document.PageSize.Width / 3;
                float y = document.PageSize.Top - 30;
                Phrase header = new Paragraph("浙江华睿科技股份有限公司货款对账表", fontChinese);
                Paragraph header1 = new Paragraph("致:" + CustomerName, fontChinese1);
                Paragraph header2 = new Paragraph("现将浙江华睿科技股份有限公司与贵单位的经济业务往来情况知会贵单位,请核对并按照协议约定时间支付货款,到期货款请尽快支付", fontChinese1);
                Paragraph header3 = new Paragraph("贵公司往来货款情况明细如下:(单位:元 对账截止:", fontChinese1);
                Paragraph header4 = new Paragraph(DateTime.Now.ToString("yyyy-MM-dd"), fontChinese1);

                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header, x, y, 0); //页眉标题
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header1, headerleft, y - 20, 0); //页眉内容
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header2, headerleft, y - 35, 0); //页眉
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header3, headerleft, y - 50, 0); //页眉
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_RIGHT, header4, right + 20, y - 50, 0); //页眉

                //ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, pageNumberPh, center, bottom - 20, 0); //页码
                Phrase pageNumberPh = new Phrase("说明:多页账单请盖骑缝章,谢谢配合", fontChinese1);
                Paragraph header11 = new Paragraph("浙江华睿科技股份有限公司(盖章)", fontChinese1);
                Paragraph header12 = new Paragraph("(盖章)", fontChinese1);
                Paragraph header13 = new Paragraph(CustomerName, fontChinese1);
                Paragraph header21 = new Paragraph("日期:", fontChinese1);
                Paragraph header22 = new Paragraph("日期:", fontChinese1);
                Paragraph header31 = new Paragraph("对账人(签字):", fontChinese1);
                Paragraph header32 = new Paragraph("对账人(签字):", fontChinese1);
                Paragraph header41 = new Paragraph("不符原因:", fontChinese1);
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, pageNumberPh, center, bottom + 70, 0); //页脚

                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header11, headerleft, bottom + 45, 0); //页脚内容
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header12, x + 120, bottom + 45, 0); //页脚内容
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header13, right - 60, bottom + 45, 0); //页脚内容

                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header21, headerleft, bottom + 30, 0); //页脚内容
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header22, x + 120, bottom + 30, 0); //页脚内容

                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header31, headerleft, bottom + 15, 0); //页脚内容
                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header32, x + 120, bottom + 15, 0); //页脚内容

                ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_LEFT, header41, x + 120, bottom, 0); //页脚内容

            }
        }

        /// <summary>
        /// 关闭文档时,替换模板,完成整个页眉页脚组件
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="document"></param>
        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            // 关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
            total.BeginText();
            total.SetFontAndSize(bf, 9);// 生成的模版的字体、颜色
            string foot2 = " " + (writer.PageNumber) + " 页"; //页脚内容拼接  如  第1页/共2页
            total.ShowText(foot2);// 模版显示的内容
            total.EndText();
            total.ClosePath();
        }
    }
}
相关推荐
Rverdoser5 小时前
java八股文之消息中间件
c#·linq
SongYuLong的博客6 小时前
C# WPF 串口通信
开发语言·c#·wpf
小码编匠6 小时前
C# 编程技巧实现屏幕录制功能
后端·c#·.net
小码编匠6 小时前
C# + WinForm 基于ModBus协议的智能仓储温控管理系统
后端·c#·.net
康凯哇咔咔8 小时前
代理模式(Proxy Pattern)
设计模式·c#·代理模式
熊思宇16 小时前
MoonSharp 文档二
c#·moonsharp
MY-备忘17 小时前
用友U9二次开发-问题记录
c#·用友
PfCoder17 小时前
C#的判断语句总结
开发语言·c#·visual studio·winform
炫爱小七19 小时前
C# 实现 AI SSE (Server-Sent Events)接口方式输出(对接AI模型API)
开发语言·c#·ai编程