zoukankan      html  css  js  c++  java
  • PDFSharp生成PDF.

    在上面用OpenXML生成word后,原来利用Word2010里的导出成PDF功能就不能用.

    然后找开源组件生成PDF,最开始用的是iTextSharp,做完导出报表了才发现,这个开源协议用的是AGPL,只能放弃,重新查找后,找到PDFSharp(MTI协议).结合了MigraDoc来生成PDF,过程大同小异,对比iTextSharp,在画相关元素时,会慢不少,20页A4内容,OpenXML和iTextSharp都能保持在2S内输出完成,而PDFSharp需要5-10S,不知是不是因为GDI+的原因.

    代码不讲解了,只贴出来,只说明一点,对中文的支持,需要设置下.

    System.Drawing.Text.PrivateFontCollection pfcFonts = new System.Drawing.Text.PrivateFontCollection();
    string strFontPath = @"C:/Windows/Fonts/msyh.ttf";//字体设置为微软雅黑
    pfcFonts.AddFontFile(strFontPath);
    Style style = document.Styles["Normal"];
    style.Font = new MigraDoc.DocumentObjectModel.Font(pfcFonts.Families[0].Name, 12);

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 using System.IO;
      5 using PdfSharp;
      6 using PdfSharp.Drawing;
      7 using PdfSharp.Pdf;
      8 using PdfSharp.Pdf.IO;
      9 using MigraDoc.DocumentObjectModel;
     10 using MigraDoc.DocumentObjectModel.Tables;
     11 using MigraDoc.DocumentObjectModel.Shapes;
     12 using System.Drawing;
     13 using MigraDoc.Rendering;
     14 namespace EDM.ReportTemplate
     15 {
     16     public class ExportPDF : ExportReport
     17     {
     18         private Section section;
     19         private SizeF PdfSize;
     20 
     21         public override void Execute()
     22         {
     23             var size = InitPage();
     24             Document doc = new Document();
     25             section = doc.AddSection();
     26             section.PageSetup = InitPage();
     27             DefineStyles(doc);
     28             PForm.ReportProgress(PShow.StartExecute, null);
     29             //CreateHead();
     30             foreach (ReportCommon common in Commons)
     31             {
     32                 if (common is ReportTable)
     33                 {
     34                     ReportTable table = common as ReportTable;
     35                     // ChangeTableColumn(table);
     36                     AddTable(table, doc);
     37                 }
     38                 if (common is ReportText)
     39                 {
     40                     ReportText table = common as ReportText;
     41                     AddText(table, doc);
     42                 }
     43                 if (common is ReportImage)
     44                 {
     45                     ReportImage table = common as ReportImage;
     46                     AddImage(table, doc);
     47                 }
     48                 if (common is ReportValueList)
     49                 {
     50                     ReportValueList table = common as ReportValueList;
     51                     AddValueList(table, doc);
     52                 }
     53                 if (common is ReportValue)
     54                 {
     55                     ReportValue table = common as ReportValue;
     56                     AddValue(table, doc);
     57                 }
     58                 SetExectueProgress(common);
     59             }
     60             PForm.ReportProgress(PShow.EndExecute, null);
     61             PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);
     62             pdfRenderer.Document = doc;
     63             pdfRenderer.RenderDocument();
     64             pdfRenderer.Save(FileName);
     65         }
     66 
     67         public static void DefineStyles(Document document)
     68         {
     69             System.Drawing.Text.PrivateFontCollection pfcFonts = new System.Drawing.Text.PrivateFontCollection();
     70             string strFontPath = @"C:/Windows/Fonts/msyh.ttf";//字体设置为微软雅黑 
     71             pfcFonts.AddFontFile(strFontPath);
     72             Style style = document.Styles["Normal"];
     73             style.Font = new MigraDoc.DocumentObjectModel.Font(pfcFonts.Families[0].Name, 12);
     74             style.Font.Color = Colors.Black;
     75 
     76             style = document.Styles["Heading1"];
     77             //style.Font.Name = "Tahoma";
     78             style.Font.Size = 20;
     79             style.Font.Bold = true;
     80             style.ParagraphFormat.Alignment = ParagraphAlignment.Center;
     81             // style.Font.Color = Colors.DarkBlue;
     82             style.ParagraphFormat.PageBreakBefore = true;
     83             style.ParagraphFormat.SpaceAfter = 6;
     84 
     85             style = document.Styles["Heading2"];
     86             style.Font.Size = 16;
     87             style.Font.Bold = true;
     88             style.ParagraphFormat.PageBreakBefore = false;
     89             style.ParagraphFormat.SpaceBefore = 6;
     90             style.ParagraphFormat.SpaceAfter = 6;
     91             style.ParagraphFormat.Alignment = ParagraphAlignment.Left;
     92 
     93             style = document.Styles["Heading3"];
     94             style.Font.Size = 14;
     95             style.Font.Bold = true;
     96             style.Font.Italic = true;
     97             style.ParagraphFormat.SpaceBefore = 6;
     98             style.ParagraphFormat.SpaceAfter = 3;
     99             style.ParagraphFormat.Alignment = ParagraphAlignment.Left;
    100 
    101             style = document.Styles["Heading4"];
    102             style.Font.Size = 12;
    103             style.Font.Bold = true;
    104             style.Font.Italic = true;
    105             style.ParagraphFormat.SpaceBefore = 3;
    106             style.ParagraphFormat.SpaceAfter = 3;
    107             style.ParagraphFormat.Alignment = ParagraphAlignment.Left;
    108 
    109             style = document.Styles[StyleNames.Header];
    110             style.ParagraphFormat.AddTabStop("16cm", TabAlignment.Right);
    111 
    112             style = document.Styles[StyleNames.Footer];
    113             style.ParagraphFormat.AddTabStop("8cm", TabAlignment.Center);
    114 
    115             // Create a new style called TextBox based on style Normal
    116             style = document.Styles.AddStyle("TextBox", "Normal");
    117             style.ParagraphFormat.Alignment = ParagraphAlignment.Justify;
    118             style.ParagraphFormat.Borders.Width = 2.5;
    119             style.ParagraphFormat.Borders.Distance = "3pt";
    120             //TODO: Colors
    121             style.ParagraphFormat.Shading.Color = Colors.SkyBlue;
    122 
    123             // Create a new style called TOC based on style Normal
    124             style = document.Styles.AddStyle("TOC", "Normal");
    125             style.ParagraphFormat.AddTabStop("16cm", TabAlignment.Right, TabLeader.Dots);
    126             style.ParagraphFormat.Font.Color = Colors.Blue;
    127 
    128             // Create a new style called Table based on style Normal
    129             style = document.Styles.AddStyle("Table", "Normal");
    130             style.Font.Name = pfcFonts.Families[0].Name;
    131             style.Font.Size = 12;
    132 
    133             // Create a new style called Reference based on style Normal
    134             style = document.Styles.AddStyle("Reference", "Normal");
    135             style.ParagraphFormat.SpaceBefore = "5mm";
    136             style.ParagraphFormat.SpaceAfter = "5mm";
    137             style.ParagraphFormat.TabStops.AddTabStop("16cm", TabAlignment.Right);
    138         }
    139 
    140         public PageSetup InitPage()
    141         {
    142             PageSetup pageSetup = new PageSetup();
    143             pageSetup.PageFormat = PageFormat.Letter;
    144             PdfSharp.PageSize size = PdfSharp.PageSize.Letter;
    145             if (PageSize == "A4")
    146             {
    147                 pageSetup.PageFormat = PageFormat.A4;
    148                 size = PdfSharp.PageSize.A4;
    149             }
    150             if (PageSize == "B4")
    151             {
    152                 pageSetup.PageFormat = PageFormat.B5;
    153                 size = PdfSharp.PageSize.A5;
    154             }
    155             var psize = PageSizeConverter.ToSize(size);
    156             if (IsOrientation)
    157             {
    158                 pageSetup.Orientation = Orientation.Landscape;
    159                 double width = psize.Width;
    160                 psize.Width = psize.Height;
    161                 psize.Width = width;
    162             }
    163             PdfSize = psize.ToSizeF();
    164             return pageSetup;
    165         }
    166 
    167         public void CreateHead()
    168         {
    169             var image = section.Headers.Primary.AddImage("../../PowerBooks.png");
    170             image.Height = "2.5cm";
    171             image.LockAspectRatio = true;
    172             image.RelativeVertical = RelativeVertical.Line;
    173             image.RelativeHorizontal = RelativeHorizontal.Margin;
    174             image.Top = ShapePosition.Top;
    175             image.Left = ShapePosition.Right;
    176             image.WrapFormat.Style = WrapStyle.Through;
    177         }
    178 
    179         public void AddTable(ReportTable table, Document document)
    180         {
    181             var ptable = section.AddTable();
    182             ptable.Style = "Table";
    183             ptable.Borders.Width = 0.25;
    184             ptable.Borders.Left.Width = 0.5;
    185             ptable.Borders.Right.Width = 0.5;
    186             ptable.Rows.LeftIndent = 0;
    187             int colIndex = 0;
    188             int cols = table.Column;
    189             for (int i = 0; i < cols; i++)
    190             {
    191                 double width = GetWidth(table.GetWidth(i));
    192                 if (width != 0.0)
    193                     ptable.AddColumn(width);
    194                 else
    195                     ptable.AddColumn();
    196             }
    197 
    198             foreach (List<string> strs in table.Table)
    199             {
    200                 Row row = ptable.AddRow();
    201                 for (int i = 0; i < cols; i++)
    202                 {
    203                     string text = string.Empty;
    204                     if (strs.Count > i)
    205                     {
    206                         if (!string.IsNullOrEmpty(strs[i]))
    207                             text = strs[i];
    208                     }
    209                     //如果有4栏,但是只有三列数据,那到第三列时,开始合并
    210                     if (strs.Count != cols && i >= strs.Count - 1)
    211                     {
    212                         var cell = row.Cells[strs.Count - 1];
    213                         if (i == strs.Count - 1)
    214                         {
    215                             cell.AddParagraph(text);
    216                             cell.MergeRight = 0;
    217                         }
    218                         if (i > strs.Count - 1)
    219                         {
    220                             cell.MergeRight = cell.MergeRight + 1;
    221                         }
    222                     }
    223                     else
    224                     {
    225                         row.Cells[i].AddParagraph(text);
    226                     }
    227                     if (colIndex == 0 && table.IsHaveColumn)
    228                     {
    229                         row.Format.Font.Bold = true;
    230                     }
    231                     if (table.IsHaveLevel && colIndex != 0)
    232                     {
    233                         if (!strs[0].StartsWith(" "))
    234                         {
    235                             row.Format.Font.Bold = true;
    236                         }
    237                     }
    238                 }
    239                 colIndex++;
    240             }
    241         }
    242 
    243         public void AddText(ReportText text, Document document)
    244         {
    245             if (text.Size == 20)
    246             {
    247                 var paragraph = section.AddParagraph(text.Text, "Heading1");
    248             }
    249             else if (text.IsHead)
    250             {
    251                 var paragraph = section.AddParagraph(text.Text, "Heading" + (text.HeadSize - 1));
    252             }
    253             else
    254             {
    255                 var paragraph = section.AddParagraph(text.Text);
    256                 paragraph.Format.Font.Size = text.Size;
    257                 paragraph.Format.Alignment = GetParagraphAlignment(text.Alignment);
    258                 paragraph.Format.Font.Bold = text.IsBold;
    259             }
    260         }
    261 
    262         public void AddImage(ReportImage image, Document document)
    263         {
    264             try
    265             {
    266                 var pImage = section.AddImage(image.Value);
    267                 pImage.Width = PdfSize.Width - 100;
    268                 pImage.Left = ShapePosition.Center;
    269                 section.AddParagraph("");
    270             }
    271             catch (Exception e)
    272             {
    273             }
    274         }
    275 
    276         public void AddValueList(ReportValueList valueList, Document document)
    277         {
    278             var ptable = section.AddTable();
    279             ptable.Borders.Visible = false;
    280             ptable.Rows.LeftIndent = 0;
    281             for (int c = 0; c < valueList.Column; c++)
    282             {
    283                 ptable.AddColumn(PdfSize.Width / valueList.Column);
    284             }
    285 
    286             for (int i = 0; i < valueList.Values.Count; i++)
    287             {
    288                 var value = valueList.Values[i];
    289                 //当前行数
    290                 int rowindex = i / valueList.Column;
    291                 //当前列数
    292                 int colindex = i % valueList.Column;
    293                 if (colindex == 0)
    294                 {
    295                     ptable.AddRow();
    296                 }
    297                 var cell = ptable[rowindex, colindex];
    298                 cell.Borders.Visible = false;
    299                 this.AnalysisText(value);
    300                 cell.AddParagraph(value.Text + value.Value);
    301             }
    302 
    303         }
    304 
    305         public void AddValue(ReportValue value, Document document)
    306         {
    307             this.AnalysisText(value);
    308             var paragraph = section.AddParagraph(value.Text + value.Value);
    309             //paragraph.Format.Alignment = GetParagraphAlignment(text.Alignment);
    310         }
    311 
    312         public ParagraphAlignment GetParagraphAlignment(int alignment)
    313         {
    314             ParagraphAlignment result = ParagraphAlignment.Left;
    315             if (alignment == 0)
    316                 result = ParagraphAlignment.Center;
    317             if (alignment == 1)
    318                 result = ParagraphAlignment.Right;
    319             return result;
    320         }
    321 
    322     }
    View Code

    总的来说,和OpenXML一样,在用OpenXML导出数据时,已经把数据整理为,输出数据,输出图形,输出表格,输出一组数据.这几种形式,我用PDFSharp时,只是针对这几个类型进行处理一下就行了.

    毕竟OpenXML只能导出word2007及以上识别的文件,word2003还是需要Ms office com组件,这个类我就不贴了,搜索出word文章几乎都用的这种.

  • 相关阅读:
    将less编译成css的gulp插件
    OSC本地库推送到远程库
    Apache新版配置虚拟主机的注意事项
    Git存储用户名和密码(明文需谨慎)
    CentOS(minimal)+Nginx+php+mysql实现宿主访问虚拟机
    Chrome disable adobe flash player
    Centos for php+mysql+apache
    CMD Create Database & Table
    浏览器在线查看pdf文件 pdf.js的使用教程
    php常见网络攻击及防御方法
  • 原文地址:https://www.cnblogs.com/zhouxin/p/3228108.html
Copyright © 2011-2022 走看看