c# 数据保存为PDF(三) (PdfSharp篇)

03-10 阅读 0评论

PdfSharp 使用,创建PDF文档

    • 前言
    • 关于 PdfSharp
    • 下载 PdfSharp
    • 使用PdfSharp
      • 常用命名空间和类
      • 1 创建一个简单的PDF文档
      • 2 创建一个带页脚的PDF文档
        • 2.1 创建临时数据表
        • 2.2 创建页脚
        • 2.3 完整代码
        • 小结
        • 附录:

          c# 数据保存为PDF(三) (PdfSharp篇)

          往期文章:

          1、 c# 数据保存为PDF(一) (Spire.PDF篇)

          2、c# 数据保存为PDF(二) (Apose.Pdf篇)

          前言

          因为项目需求需要将数据导出存为PDF文档,方便客户使用。相比于TXT ,EXCEL等格式,导出PDF时可以减少字体乱码,文体格式不一样的痛点。在前面试用了Spire.PDF和Aspose.Pdf都可以导出我想要的格式的PDF,但这两个没有开源,正版都是要收费的,只好另寻他欢罢了。之后,寻寻觅觅,终于遇见PdfSharp,相处一段时间后,那便是日久生情了,陷进去了,从此就是它啦。

          c# 数据保存为PDF(三) (PdfSharp篇),c# 数据保存为PDF(三) (PdfSharp篇),词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,管理,下载,第2张
          (图片来源网络,侵删)

          关于 PdfSharp

          PdfSharp是一个开源免费的.NET开发包,可以生成PDF格式的文档。对于第三个特点真的特好使,深有体会,后面会有一篇博文介绍的。

          PdfSharp组件主要特点有:

          1.全部用C#重写设计和编写代码;

          2.很容易使用对象模型来构建文档;

          3. 可以生成PDF文件和显示在窗体或者打印,都使用同一个源文件;

          4.可以修改、合并或者分割PDF文件;

          c# 数据保存为PDF(三) (PdfSharp篇),c# 数据保存为PDF(三) (PdfSharp篇),词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,管理,下载,第3张
          (图片来源网络,侵删)

          5. 可以控制图片的透明度,嵌入字体。

          下载 PdfSharp

          通过VS自带的Nuget包管理器直接搜索PdfSharp并下载。路径在工具-----Nuget包管理器-----管理解决方案的NuGet程序包…

          c# 数据保存为PDF(三) (PdfSharp篇)

          使用PdfSharp

          常用命名空间和类

          命名空间

          using PdfSharp;
          using PdfSharp.Drawing;
          using PdfSharp.Pdf;
          

          常用类库

          类库描述
          PdfSharp.Pdf.PdfDocumentPDF文档
          PdfSharp.Pdf.PdfPagePDF 页面
          PdfSharp.Drawing.XGraphics画布
          PdfSharp.Drawing.XBrushes画刷
          PdfSharp.Drawing.XPen画笔
          PdfSharp.Drawing.XFont字体
          PdfSharp.Drawing.XStringFormat字符串格式
          PdfSharp.Drawing.XSize大小

          1 创建一个简单的PDF文档

          创建一个简单的HelloWorld.pdf文档。

          c# 数据保存为PDF(三) (PdfSharp篇),c# 数据保存为PDF(三) (PdfSharp篇),词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,管理,下载,第5张
          (图片来源网络,侵删)
                 /// 
                 /// PdfSharp 创建一个简单的PDF
                 /// 
                  public static void CreateSinglePdf()
                  {
                      // 创建一个PDF文档对象
                      PdfDocument document = new PdfDocument();
                      document.Info.Title = "Created with PDFsharp";
                      // 创建一个空的Page
                      PdfPage page = document.AddPage();
                      // 创建一个画布对象,用于绘制
                      XGraphics gfx = XGraphics.FromPdfPage(page);
                      // 创建字体
                      XFont font = new XFont("Verdana", 20, XFontStyle.BoldItalic);
                      // 绘制文本
                      gfx.DrawString("Hello, World!", font, XBrushes.Black,
                      new XRect(0, 0, page.Width, page.Height),
                      XStringFormats.Center);
                      // 保存文档
                      const string filename = "HelloWorld.pdf";
                      document.Save(filename);
                  }
          

          c# 数据保存为PDF(三) (PdfSharp篇)

          2 创建一个带页脚的PDF文档

          类似下图的模板:列数可以减少

          分析需求:

          1 有项目的头部介绍信息。

          2 有页脚,页脚信息包括公司信息和页码。

          3 表格内容有标题,换页到下页时标题也要有。

          4 KK00 KK11 KK22等加粗有下划线,凸显出分类隔开的特点。

          c# 数据保存为PDF(三) (PdfSharp篇)

          2.1 创建临时数据表

          创建100*5的数据存放在DataTable中,仅用作测试。实际项目中,可以换成需要保存的数据内容。

                  /// 
                  /// 数据表格
                  /// 
                  /// 
                  private static DataTable CreateData()
                  {
                      DataTable dt = new DataTable();
                      DataColumn col1 = new DataColumn("Num", typeof(string));
                      DataColumn col2 = new DataColumn("Name", typeof(string));
                      DataColumn col3 = new DataColumn("Val", typeof(string));
                      DataColumn col4 = new DataColumn("Des", typeof(string));
                      DataColumn col5 = new DataColumn("Set", typeof(string));
                      dt.Columns.Add(col1);
                      dt.Columns.Add(col2);
                      dt.Columns.Add(col3);
                      dt.Columns.Add(col4);
                      dt.Columns.Add(col5);
                      Random random = new Random();
                      List nameList = new List
                      {
                          "A", "BB", "CCC", "D",
                          "E", "F", "G","H","II",
                          "JJ", "LL", "M"
                      };
                      List tempList = new List
                      {
                          "dsd", "sdfdgvre", "Hello", "Gilrs",
                          "Today", "YYYY", "dfgre","GSD","fdgfer",
                          "Wesd", "DLG", "fsdahfi;o"
                      };
                      for (int i = 0; i  
          
          2.2 创建页脚

          一般包含公司信息和页码数。

          c# 数据保存为PDF(三) (PdfSharp篇)

                  /// 
                  /// 绘制页脚
                  /// 
                  /// 页面
                  /// 画布
                  /// 当前页序号
                  /// 总的页码数
                  private static void DrawPDFFooter(PdfPage page, XGraphics gfx, int cur, int  total)
                  {
                      //计算高度
                      float endY = (float)page.Height - padding_topBottom;
                      XFont Timefont = new XFont(fontName, 10, XFontStyle.Bold);
                      //测量字符串大小
                      XSize size = gfx.MeasureString("Drive Type/", Timefont);
                      //绘制页脚
                      gfx.DrawLine(new XPen(XColors.Black, 0.2f),
                          padding_leftRight,
                          endY,
                         page.Width - padding_leftRight,
                         endY);
                       
                      endY += 2 + (float)size.Height;
                      //绘制信息
                      String footerText = "Test for Windows(C) by 唠嗑一夏 Electric Corporation";
                      gfx.DrawString(footerText, Timefont, XBrushes.Black, padding_leftRight,
                          endY);
                      Timefont = new XFont(fontName, 10, XFontStyle.Regular);
                      //绘制页码数
                      footerText = cur.ToString() + "/" + total.ToString();
                      gfx.DrawString(footerText, Timefont, XBrushes.Black,
                          (page.Width * 0.9), endY);
                  }
          
          2.3 完整代码

          在这里调用测试数据、页脚函数,项目头和数据内容整合在一起了。

          主要使用到GDI的绘制,一直在使用XGraphics 的绘制文本DrawString,绘制直线DrawLine,绘制矩形框DrawRectangle功能。涉及到页面高度,文本高度,文本宽度的计算,计算好了,绘制出来的效果才会好看,需要多尝试一下。

          这里需要特别注意这个PdfSharp控件支持的字体,并不是所有字体都支持,如果字体不存在则内容会显示乱码。

          using System;
          using System.Collections.Generic;
          using System.Data;
          using System.IO;
          using PdfSharp;
          using PdfSharp.Drawing;
          using PdfSharp.Pdf;
          /// 
          /// 生成PDF文档
          /// 
          namespace PdfDemo
          {
              public class PdfSharpHelper
              {
                  static string fontName = "华文宋体"; //华文宋体 Arial
                  //左右边距
                  const   int padding_leftRight = 30;
                
                  //上下边距
                  const int padding_topBottom = 30;
                  //示例: http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx?AspxAutoDetectCookieSupport=1
                  //官网:http://www.pdfsharp.net/
                  /// 
                  /// 绘制头部
                  /// 
                  /// 
                  /// 
                  /// 
                  /// 
                  private static float DrawPDFCodeTitle(PdfPage page, XGraphics gfx,float startY)
                  {
                      float x = padding_leftRight;
                      float y = startY;
                      XFont Titlefont = new XFont(fontName, 9, XFontStyle.Bold);
                       
                      XSize size = gfx.MeasureString("Param", Titlefont);
                      float endY = (float)size.Height * 2 + 5;
                      //绘制标题
                      gfx.DrawRectangle(XBrushes.LightCyan, new XRect(padding_leftRight, y,
                          page.Width - 2 * padding_leftRight, endY));
                      y += (float)size.Height * 2 + 1;
                      gfx.DrawString(" Parameter", Titlefont, XBrushes.Black, x, y);
                      x += (float)(page.Width * 0.32);
                      gfx.DrawString("Value", Titlefont, XBrushes.Black, x, y);
                     // x += (float)(page.Width * 0.098);
                     // gfx.DrawString("Infomation", Titlefont, XBrushes.Black, x, y);
                      x += (float)(page.Width * 0.31);
                      gfx.DrawString("Setting", Titlefont, XBrushes.Black, x, y);
                      gfx.DrawString("Default", Titlefont, XBrushes.Black, x, y - size.Height - 1);
                  
                      return (endY + startY);
                  }
                  /// 
                  /// 绘制页脚
                  /// 
                  /// 页面
                  /// 画布
                  /// 当前页序号
                  /// 总的页码数
                  private static void DrawPDFFooter(PdfPage page, XGraphics gfx, int cur, int  total)
                  {
                      //计算高度
                      float endY = (float)page.Height - padding_topBottom;
                      XFont Timefont = new XFont(fontName, 10, XFontStyle.Bold);
                      //测量字符串大小
                      XSize size = gfx.MeasureString("Drive Type/", Timefont);
                      //绘制页脚
                      gfx.DrawLine(new XPen(XColors.Black, 0.2f),
                          padding_leftRight,
                          endY,
                         page.Width - padding_leftRight,
                         endY);
                       
                      endY += 2 + (float)size.Height;
                      //绘制信息
                      String footerText = "Test for Windows(C) by 唠嗑一夏 Electric Corporation";
                      gfx.DrawString(footerText, Timefont, XBrushes.Black, padding_leftRight,
                          endY);
                      Timefont = new XFont(fontName, 10, XFontStyle.Regular);
                      //绘制页码数
                      footerText = cur.ToString() + "/" + total.ToString();
                      gfx.DrawString(footerText, Timefont, XBrushes.Black,
                          (page.Width * 0.9), endY);
                  }
                  /// 
                  /// 数据表格
                  /// 
                  /// 
                  private static DataTable CreateData()
                  {
                      DataTable dt = new DataTable();
                      DataColumn col1 = new DataColumn("Num", typeof(string));
                      DataColumn col2 = new DataColumn("Name", typeof(string));
                      DataColumn col3 = new DataColumn("Val", typeof(string));
                      DataColumn col4 = new DataColumn("Des", typeof(string));
                      DataColumn col5 = new DataColumn("Set", typeof(string));
                      dt.Columns.Add(col1);
                      dt.Columns.Add(col2);
                      dt.Columns.Add(col3);
                      dt.Columns.Add(col4);
                      dt.Columns.Add(col5);
                      Random random = new Random();
                      List nameList = new List
                      {
                          "A", "BB", "CCC", "D",
                          "E", "F", "G","H","II",
                          "JJ", "LL", "M"
                      };
                      List tempList = new List
                      {
                          "dsd", "sdfdgvre", "Hello", "Gilrs",
                          "Today", "YYYY", "dfgre","GSD","fdgfer",
                          "Wesd", "DLG", "fsdahfi;o"
                      };
                      for (int i = 0; i  (page.Height - padding_topBottom))
                              {//换页
                                  page = doc.Pages.Add();
                                  page.Size = PageSize.A4;
                                  gfx = XGraphics.FromPdfPage(page);
                                  gfxList.Add(gfx);
                                  //绘制表头
                                  y = DrawPDFCodeTitle(page, gfx, 10) + 10;
                              }
                              DataRow dataRow = dataTable.Rows[i];
                              strBak = dataRow[0].ToString().Substring(0, 4);
                              if (strBak != str)
                              {//绘制组别
                                  str = strBak;
                                  string converStr = strBak ;
                                  j++;
                                  funcBoldSize = gfx.MeasureString(converStr, FunBoldFont);
                                  y += (float)funcBoldSize.Height + 6;
                                  gfx.DrawString(converStr, FunBoldFont, XBrushes.Black, padding_leftRight, y);
                                  y += 2;
                                  i--;
                                  continue;
                              }
                              // else
                              {//绘制
                                  string tempStr = dataRow[0].ToString() + " " + dataRow[1].ToString();
                                  funcSize = gfx.MeasureString(tempStr, funFont);
                                  y += (float)funcSize.Height + 3;
                                  if ((y + funcSize.Height + 3) > (page.Height - padding_topBottom))
                                  {//换页
                                      page = doc.Pages.Add();
                                      page.Size = PageSize.A4;
                                      gfx = XGraphics.FromPdfPage(page);
                                      gfxList.Add(gfx);
                                      //绘制表头
                                      y = DrawPDFCodeTitle(page, gfx, 10) + 10;
                                  }
                                  //序号+描述
                                  float widthX = padding_leftRight;
                                  gfx.DrawString(tempStr, funFont, XBrushes.Black, widthX, y);
                                  //当前值
                                  widthX += (float)(page.Width * 0.32);
                                  gfx.DrawString(dataRow[2].ToString(), funFont, XBrushes.Black, widthX, y);
                                  
                                  //设置值
                                  widthX += (float)(page.Width * 0.31);
                                  gfx.DrawString(dataRow[4].ToString(), funFont, XBrushes.Black, widthX, y);
                              }
                          }
                          gfx = null;
                          int Total = doc.PageCount;
                          for (int i = 0; i  
          

          效果图:也可以看文章最前面的动图

          c# 数据保存为PDF(三) (PdfSharp篇)

          小结

          PdfSharp创建PDF文档使用的是Drawing方式,用户可以通过绘制来实现自己各式各样的需求。

          而且PdfSharp是免费开源的,这就秒杀了一大波其它付费的控件了。与Aspose.Pdf相比,PdfSharp生成PDF文件的速度快多了。

          附录:

          PdfSharp官网链接:http://www.pdfsharp.com/PDFsharp/

          PdfSharp的使用Demo:http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx?AspxAutoDetectCookieSupport=1


免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]