【Spire.PDF】Spire.PDF导出报告之实用工具类PdfUtility

记录学习过程

创建日期:2019-04-11

【Spire.PDF】Spire.PDF导出报告之一获取与破解
【Spire.PDF】Spire.PDF导出报告之二基本绘制Draw
【Spire.PDF】Spire.PDF导出报告之三表格Grid
【Spire.PDF】Spire.PDF导出报告之四报告模板
【Spire.PDF】Spire.PDF导出报告之实用工具类PdfUtility

Spire.PDF导出报告之实用工具类PdfUtility

该PDF生成工具类仅供参考

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Diagnostics;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Grid;
using System.Windows.Forms;

namespace Share
{

    /// <summary>
    /// PDF生成工具
    /// </summary>
    public class PdfUtility
    {
        #region 文档

        /// <summary>
        /// PDF文档
        /// </summary>
        public PdfDocument Doc { get; private set; }
        /// <summary>
        /// 页面
        /// </summary>
        public PdfPageBase Page { get; private set; }

        //595,842
        /// <summary>
        /// 页面宽度 默认595
        /// </summary>
        public float PageWidth
        {
            get { return Doc.PageSettings.Width; }
        }
        /// <summary>
        /// 页面高度 默认842
        /// </summary>
        public float PageHeight
        {
            get { return Doc.PageSettings.Height; }
        }

        /// <summary>
        /// 初始化
        /// </summary>
        public void Init()
        {
            Doc = new PdfDocument();
            Doc.PageSettings.Margins.All = 0;//设置边距为0,默认边距为40
            PagesAdd(); PageRemove(Page);//删除第一页,因为第一页有警告语
        }

        /// <summary>
        /// 保存并打开
        /// </summary>
        /// <param name="name"></param>
        public void SaveToPDF(string name)
        {
            string path = Application.StartupPath + "\\Reports\\" + name + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";//以日期为文件名,以防存在打开文件
            Doc.SaveToFile(path);
            Doc.Close();
            Process.Start(path);//打开文档
        }

        #endregion

        #region  Page

        /// <summary>
        /// 增加页面
        /// </summary>
        public void PagesAdd()
        {
            Page = Doc.Pages.Add();
        }

        /// <summary>
        /// 移除页面
        /// </summary>
        /// <param name="page">要移除的页面</param>
        public void PageRemove(PdfPageBase page)
        {
            Doc.Pages.Remove(page);
        }

        /// <summary>
        /// 设置页眉
        /// </summary>
        public void SetPageHeader()
        {
            foreach (var item in Doc.Pages)
            {
                float colWidth = (PageWidth - 2 * 30) / 2;
                GridInit(new float[2] { colWidth, colWidth });
                GridTextAlignments = new PdfTextAlignment[2] { PdfTextAlignment.Left,  PdfTextAlignment.Right };
                GridTextFonts = new PdfTrueTypeFont[2] { Font(10), Font(10)};
                GridTextColors = new PdfSolidBrush[2] { BrushColor(Color.Black), BrushColor(Color.Black) };
                GridRowsAdd("Logo","Text");
                GridDraw(new PointF(30, 20), true, (PdfPageBase)item);

                DrawLine(PenColor(Color.Black), new PointF(30, 40), new PointF(PageWidth - 30, 40), (PdfPageBase)item);
            }
        }

        /// <summary>
        /// 设置页脚
        /// </summary>
        public void SetPageFooter()
        {
            int count = 0;
            int allCount = Doc.Pages.Count;//总页数
            foreach (var item in Doc.Pages)
            {
                count++;//当前页码
                DrawLine(PenColor(Color.Black), new PointF(30, PageHeight - 40), new PointF(PageWidth - 30, PageHeight - 40), (PdfPageBase)item);//底线
                float colWidth = (PageWidth - 2 * 30) / 3;
                GridInit(new float[3] { colWidth, colWidth, colWidth });
                GridTextAlignments = new PdfTextAlignment[3] { PdfTextAlignment.Left, PdfTextAlignment.Center, PdfTextAlignment.Right };
                GridTextFonts = new PdfTrueTypeFont[3] { Font(8), Font(10), Font(8) };
                GridTextColors = new PdfSolidBrush[3] { BrushColor(Color.Black), BrushColor(Color.Gray), BrushColor(Color.Black) };
                GridRowsAdd(DateTime.Now.ToString("yyyy-MM-dd HH:mm"), "Logo", count + "/" + allCount);
                GridDraw(new PointF(30, PageHeight - 40 ), true, (PdfPageBase)item);
            }
        }

        #endregion

        #region Font,BrushColor,PenColor
        /// <summary>
        /// 设置字体大小样式
        /// </summary>
        /// <param name="emSize">大小</param>
        /// <param name="IsBold">是否加粗,默认不加粗</param>
        /// <returns>字体大小样式</returns>
        public PdfTrueTypeFont Font(float emSize, bool IsBold = false)
        {
            return new PdfTrueTypeFont(new Font("宋体", emSize, IsBold ? FontStyle.Bold : FontStyle.Regular), true);//true防止中文乱码
        }

        /// <summary>
        /// 设置笔刷颜色(用于填充图形形状(如矩形、椭圆、饼形、多边形和封闭路径)的内部)
        /// </summary>
        /// <param name="color">颜色</param>
        /// <returns>PdfSolidBrush</returns>
        public PdfSolidBrush BrushColor(Color color)
        {
            return new PdfSolidBrush(color);
        }

        /// <summary>
        /// 设置画笔颜色(用于绘制直线和曲线)
        /// </summary>
        /// <param name="color">颜色</param>
        /// <param name="width">画笔的宽度,默认为1</param>
        /// <returns>画笔颜色</returns>
        public PdfPen PenColor(Color color, float width = 1)
        {
            return new PdfPen(color, width);
        }

        #endregion

        #region 绘制(文本,图像,直线,弧线,贝塞尔曲线,矩形,椭圆,扇形,多边形,路径)

        #region 绘制文本和图像
        /// <summary>
        /// 绘制文本
        /// </summary>
        /// <param name="s">字符串文本</param>
        /// <param name="font">文本格式</param>
        /// <param name="brush">文本颜色</param>
        /// <param name="point">绘制的位置</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawString(string s, PdfTrueTypeFont font, PdfSolidBrush brush, PointF point, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawString(s, font, brush, point);
        }

        /// <summary>
        /// 绘制图像
        /// </summary>
        /// <param name="image">图像</param>
        /// <param name="rectangle">图像的位置和大小</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawImage(Image image, RectangleF rectangle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawImage(PdfImage.FromImage(image), rectangle);
        }
        #endregion

        #region 绘制线
        /// <summary>
        /// 绘制直线
        /// </summary>
        /// <param name="pen">画笔的颜色,宽度</param>
        /// <param name="point1">第一个点</param>
        /// <param name="point2">第二个点</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawLine(PdfPen pen, PointF point1, PointF point2, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawLine(pen, point1, point2);
        }

        /// <summary>
        /// 绘制弧线
        /// </summary>
        /// <param name="pen">弧线的颜色,宽度</param>
        /// <param name="rectangle">定义椭圆的边界</param>
        /// <param name="startAngle">从 x 轴到弧线的起始点沿顺时针方向度量的角(以度为单位)</param>
        /// <param name="sweepAngle">从 startAngle 参数到弧线的结束点沿顺时针方向度量的角(以度为单位)</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawArc(PdfPen pen, RectangleF rectangle, float startAngle, float sweepAngle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawArc(pen, rectangle, startAngle, sweepAngle);
        }

        /// <summary>
        /// 绘制贝塞尔曲线
        /// </summary>
        /// <param name="pen">贝塞尔曲线的颜色,宽度</param>
        /// <param name="startPoint">曲线的起始点</param>
        /// <param name="firstControlPoint">曲线的第一个控制点</param>
        /// <param name="secondControlPoint">曲线的第二个控制点</param>
        /// <param name="endPoint">曲线的结束点</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawBezier(PdfPen pen, PointF startPoint, PointF firstControlPoint, PointF secondControlPoint, PointF endPoint, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawBezier(pen, startPoint, firstControlPoint, secondControlPoint, endPoint);
        }
        #endregion

        #region 绘制图形

        #region 矩形(三种形式)
        /// <summary>
        /// 绘制矩形(只有填充)
        /// </summary>
        /// <param name="brush">填充的颜色</param>
        /// <param name="rectangle">矩形的位置和大小</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawRectangle(PdfBrush brush, RectangleF rectangle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawRectangle(brush, rectangle);
        }

        /// <summary>
        /// 绘制矩形(有边框,无填充)
        /// </summary>
        /// <param name="pen">矩形的颜色、宽度和样式</param>
        /// <param name="rectangle">矩形的位置和大小</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawRectangle(PdfPen pen, RectangleF rectangle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawRectangle(pen, rectangle);
        }

        /// <summary>
        /// 绘制矩形(有边框,有填充)
        /// </summary>
        /// <param name="pen">矩形的颜色、宽度和样式</param>
        /// <param name="brush">填充的颜色</param>
        /// <param name="rectangle">矩形的位置和大小</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawRectangle(PdfPen pen, PdfBrush brush, RectangleF rectangle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawRectangle(pen, brush, rectangle);
        }
        #endregion

        #region 绘制椭圆,扇形,多边形,路径(与绘制矩形类似都有三种样式)

        #region 椭圆(三种形式)
        /// <summary>
        /// 绘制椭圆(只有填充)
        /// </summary>
        /// <param name="brush">填充的颜色</param>
        /// <param name="rectangle">椭圆的边界</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawEllipse(PdfBrush brush, RectangleF rectangle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawEllipse(brush, rectangle);
        }

        /// <summary>
        /// 绘制椭圆(有边框,无填充)
        /// </summary>
        /// <param name="pen">曲线的颜色、宽度和样式</param>
        /// <param name="rectangle">椭圆的边界</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawEllipse(PdfPen pen, RectangleF rectangle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawEllipse(pen, rectangle);
        }

        /// <summary>
        /// 绘制椭圆(有边框,有填充)
        /// </summary>
        /// <param name="pen">曲线的颜色、宽度和样式</param>
        /// <param name="brush">填充的颜色</param>
        /// <param name="rectangle">椭圆的边界</param>
        /// <param name="page">页面,默认为创建的最后一个页面,也可以重新设置页面</param>
        public void DrawEllipse(PdfPen pen, PdfBrush brush, RectangleF rectangle, PdfPageBase page = null)
        {
            (page ?? Page).Canvas.DrawEllipse(pen, brush, rectangle);
        }

        #endregion

        /// <summary>
        /// 绘制扇形
        /// </summary>
        public void DrawPie(PdfPen pen, PdfBrush brush, RectangleF rectangle, float startAngle, float sweepAngle)
        { }

        /// <summary>
        /// 绘制多边形
        /// </summary>
        public void DrawPolygon(PdfPen pen, PdfBrush brush, PointF[] points)
        { }

        /// <summary>
        /// 绘制路径
        /// </summary>
        public void DrawPath(PdfPen pen, PdfBrush brush, PdfPath path, PdfPageBase page = null)
        { }
        #endregion

        #endregion 绘制图形

        #endregion

        #region 表格Grid

        /// <summary>
        /// 表格
        /// </summary>
        public PdfGrid Grid { get; private set; }
        /// <summary>
        /// 表格的行
        /// </summary>
        public PdfGridRow GridRow { get; set; }

        /// <summary>
        /// 表格初始化
        /// </summary>
        /// <param name="colWidths">列宽度集合</param>
        public void GridInit(float[] colWidths)
        {
            Grid = new PdfGrid();
            Grid.Columns.Add(colWidths.Length);//增加列
            Grid.Style.CellPadding = new PdfPaddings(1, 1, 1, 1);
            Grid.Style.Font = Font(10);//设置字体

            //设置各列宽度
            for (int i = 0; i < colWidths.Length; i++)
            {
                Grid.Columns[i].Width = colWidths[i];
            }
        }

        /// <summary>
        /// 单元格文本对齐方式 为null时,左对齐
        /// </summary>
        public PdfTextAlignment[] GridTextAlignments;
        /// <summary>
        /// 单元格文本字体 为null时,字体10
        /// </summary>
        public PdfTrueTypeFont[] GridTextFonts;
        /// <summary>
        /// 单元格文本颜色 为null时,颜色黑色
        /// </summary>
        public PdfSolidBrush[] GridTextColors;

        /// <summary>
        /// 表格添加行
        /// </summary>
        /// <param name="rowHeight">行高</param>
        public void GridRowsAdd(float rowHeight = 18f)
        {
            GridRow = Grid.Rows.Add();
            GridRow.Height = rowHeight;//设置行高
            for (int i = 0; i < GridRow.Cells.Count; i++)
            {
                GridRow.Cells[i].StringFormat = new PdfStringFormat(
                    GridTextAlignments == null ? PdfTextAlignment.Left : GridTextAlignments[i], PdfVerticalAlignment.Middle);
            }
        }

        /// <summary>
        /// 设置单元格值
        /// </summary>
        /// <param name="values">单元格的值集合</param>
        public void SetGridRowCellsValue(string[] values)
        {
            for (int i = 0; i < GridRow.Cells.Count; i++)
            {
                GridRow.Cells[i].Value = values[i];
                GridRow.Cells[i].Style.Font = GridTextFonts == null ? Grid.Style.Font : GridTextFonts[i];
                GridRow.Cells[i].Style.TextBrush = GridTextColors == null ? new PdfSolidBrush(Color.Black) : GridTextColors[i];
            }
        }

        /// <summary>
        /// 添加行并设置内容
        /// </summary>
        /// <param name="rowWidth">行高</param>
        public void GridRowsAdd(params string[] values)
        {
            GridRowsAdd();
            SetGridRowCellsValue(values);
        }

        /// <summary>
        /// 设置表格边框样式
        /// </summary>
        public void SetBorders()
        {
            PdfBorders borders = new PdfBorders
            {
                All = new PdfPen(Color.Transparent, 0.1f)
            };
            foreach (PdfGridRow row in Grid.Rows)
            {
                foreach (PdfGridCell cell in row.Cells)
                {
                    cell.Style.Borders = borders;
                }
            }
        }

        /// <summary>
        /// 将表格绘制到页面
        /// </summary>
        /// <param name="pointf">表格的位置</param>
        /// <param name="isNoBorder">是否无边框(默认无边框)</param>
        /// <param name="page">默认当前页面(创建的最后一个页面)</param>
        public void GridDraw(PointF pointf, bool isNoBorder = true, PdfPageBase page = null)//测试改为false
        {
            if (isNoBorder)
                SetBorders();
            Grid.Draw(page ?? Page, pointf);
        }

        #endregion 表格Grid
    }
}


【Spire.PDF】Spire.PDF导出报告之一获取与破解
【Spire.PDF】Spire.PDF导出报告之二基本绘制Draw
【Spire.PDF】Spire.PDF导出报告之三表格Grid
【Spire.PDF】Spire.PDF导出报告之四报告模板
【Spire.PDF】Spire.PDF导出报告之实用工具类PdfUtility

免费Spire.PDF for .NET 是一款由e-iceblue公司开发的专业性的PDF文档创建组件。它能够使用户在不用Adobe Acrobat和其他外部控件的情况下,运用.NET 应用程序阅读,编写和操纵PDF 文档。Spire.PDF for .NET不仅可以运用在服端比如:ASP.NET 或者其他环境,还可以应用在Windows Forms 应用程序中。Spire.PDF for .NET 适合应用于所有常见的坏境中,比如:创建好的PDF文档可以存到磁盘中, 还可以在Windows Forms应用程序,ASP.NET 应用程序客户端浏览器中保存为数据流。 Spire.PDF for .NET 功能丰富。 除了基本的功能比如:绘制多种图形,图片,创建窗体字段,插入页眉页脚,输入数据表,自动对大型表格进行分页外,Spire.PDF for .NET还支持PDF数字签名,将HTML转换成PDF格式,提取PDF文档中的文本信息和图片,存为文本格式和各种图片格式,甚至可以将PDF中的附件提取出来。 主要功能 支持嵌入式字体,Truetype 字体和CJK字体。 支持绘图。比如:矩形,环形,弧形,椭圆形,也可以自定笔刷将其填充。 可以将图片从数据流,磁盘文件中载入到PDF 文档中。 在PDF 文档中既可以绘制梯状图形和矢量图像,还支持掩模和水印图像。 可以在PDF 文档中载入数据表。可以设置表中的行和列的格式,还可以在表内加入图形元素。 自动对PDF 中的大型表格进行分页。 创建窗体字段。比如在PDF 文档中创建按钮,文本框,列表框,复选框等等。 在PDF 中插入页眉页脚。 通过设置所有者密码和用户密码来加密PDF文档。 通过作者的签名来保护PDF文档。 读取当前PDF文档的表格并且填充表格。 HTML网页在转换到PDF文档时会拆分为多个大型页面,这些页面可以原原本本的展现在PDF文档中,而且在PDF文档的分页处没有任何文字的截断。用户还可以将这些网页在不需要临时文件的情况下,直接转换为数据流来创建PDF文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreAmbWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值