rdlc动态代码

1、配置

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true">
      <assemblies>
        <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
      </assemblies>
      <buildProviders>
        <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </buildProviders>
    </compilation>
    <httpHandlers>
      <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        validate="false" />
    </httpHandlers>
    <httpCookies httpOnlyCookies="false" requireSSL="false"/>
    <customErrors mode="Off"></customErrors>
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
  </system.webServer>
</configuration>
View Code

2、辅助类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Data;
using System.Collections;
using System.Reflection;
using System.Text;
using System.Drawing;

namespace WebGPS.Contract
{
    #region 字体
    /// <summary>
    /// 字体系列
    /// </summary>
    enum FontFamily
    {
        宋体,
        Arial,
        微软雅黑,
        Times_New_Roman,
        黑体
    }

    /// <summary>
    /// 文本修饰
    /// </summary>
    enum TextDecoration
    {
        None,
        /// <summary>
        /// 下划线
        /// </summary>
        Underline,
        /// <summary>
        /// 上划线
        /// </summary>
        Overline,
        /// <summary>
        /// 删除线
        /// </summary>
        LineThrough
    }

    /// <summary>
    /// 字体
    /// </summary>
    class Font
    {
        /// <summary>
        /// 默认黑色11F号宋体
        /// </summary>
        public Font()
        {
            //<FontStyle>Normal</FontStyle>
            //<FontFamily>Times New Roman</FontFamily>
            //<FontSize>12pt</FontSize>
            //<FontWeight>Normal</FontWeight>
            //<TextDecoration>None</TextDecoration>
            //<Color>#000000</Color>
            Italic = false;
            EnumFontFamily = FontFamily.宋体;
            FontSize = DefalutSize;
            Bold = false;
            EnumTextDecoration = TextDecoration.None;
            _hexColor = "#000000";
        }

        /// <summary>
        /// 默认大小
        /// </summary>
        public static float DefalutSize {
            get
            {
                return 11F;
            }
        }
        #region 属性
        /// <summary>
        /// 字体样式
        /// </summary>
        public bool Italic { set; get; }

        /// <summary>
        /// 字体系列
        /// </summary>
        public FontFamily EnumFontFamily { set; private get; }

        /// <summary>
        /// 字体大小
        /// </summary>
        public float FontSize { get; set; }

        /// <summary>
        /// 字体粗细
        /// </summary>
        public bool Bold { get; set; }

        /// <summary>
        /// 文本修饰
        /// </summary>
        public TextDecoration EnumTextDecoration { private get; set; }

        /// <summary>
        /// 字体颜色
        /// </summary>
        public Color Color
        {
            set
            {
                _hexColor = ToHexColor(value);
            }
        }
        #endregion

        #region 方法
        /// <summary>
        /// 字体样式
        /// </summary>
        public string GetFontStyle()
        {
            if (Italic)
            {
                return "Italic";
            }
            else
            {
                return "Normal";
            }
        }

        /// <summary>
        /// 字体系列
        /// </summary>
        public string GetFontFamily()
        {
            var result = string.Empty;
            switch (this.EnumFontFamily)
            {
                case FontFamily.Times_New_Roman:
                    result = "Times New Roman";
                    break;
                case FontFamily.微软雅黑:
                    result = "微软雅黑";
                    break;
                case FontFamily.黑体:
                    result = "黑体";
                    break;
                case FontFamily.宋体:
                    result = "宋体";
                    break;
                case FontFamily.Arial:
                    result = "Arial";
                    break;
                default:
                    break;
            }
            return result;
        }

        /// <summary>
        /// 字体粗细
        /// </summary>
        public string GetFontWeight()
        {
            if (Bold)
            {
                return "Bold";
            }
            else
            {
                return "Normal";
            }
        }

        /// <summary>
        /// 文本修饰
        /// </summary>
        public string GetTextDecoration()
        {
            var result = string.Empty;
            switch (this.EnumTextDecoration)
            {
                case TextDecoration.Underline:
                    result = "Underline";
                    break;
                case TextDecoration.Overline:
                    result = "Overline";
                    break;
                case TextDecoration.LineThrough:
                    result = "LineThrough";
                    break;
                case TextDecoration.None:
                default:
                    result = "None";
                    break;
            }
            return result;
        }

        private string _hexColor;
        /// <summary>
        /// 字体粗细
        /// </summary>
        public string GetColor()
        {
            return _hexColor;
        }

        /// <summary>
        /// 转换颜色
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        private string ToHexColor(Color color)
        {
            if (color.IsEmpty)
                return "#000000";
            string R = Convert.ToString(color.R, 16);
            if (R == "0")
                R = "00";
            string G = Convert.ToString(color.G, 16);
            if (G == "0")
                G = "00";
            string B = Convert.ToString(color.B, 16);
            if (B == "0")
                B = "00";
            string HexColor = "#" + R + G + B;
            return HexColor.ToUpper();
        }
        #endregion
    }
    #endregion

    #region 文本段落
    /// <summary>
    /// 文字水平对齐
    /// </summary>
    enum TextAlign
    {
        /// <summary>
        /// 居左
        /// </summary>
        Left,
        /// <summary>
        /// 居中
        /// </summary>
        Center,
        /// <summary>
        /// 居右
        /// </summary>
        Right
    }

    /// <summary>
    /// 文字
    /// </summary>
    class ReportText
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public ReportText()
        {
            Style = new Font();
        }

        /// <summary>
        /// 内容
        /// </summary>
        public string Value { get; set; }

        /// <summary>
        /// 字体
        /// </summary>
        public Font Style { get; set; }
    }

    /// <summary>
    /// 段落位置和高宽
    /// </summary>
    class ParagraphStyle
    {
        /// <summary>
        /// 构造
        /// </summary>
        public ParagraphStyle()
        {
            Left = 0.7F;
            Height = 0.6F;
            Width = 16;
        }

        /// <summary>
        /// 靠上
        /// </summary>
        public float Top { get; set; }

        /// <summary>
        /// 靠左 默认0.7
        /// </summary>
        public float Left { get; set; }

        /// <summary>
        /// 高 默认0.6cm
        /// </summary>
        public float Height { get; set; }

        /// <summary>
        /// 宽度 默认16cm
        /// </summary>
        public float Width { get; set; }
    }

    /// <summary>
    /// 段落
    /// </summary>
    class Paragraph
    {
        #region 段落格式
        private string _TextRunPatten =
@"                                 <TextRun>
                                   <Value>@Value</Value>
                                   <Style>
                                   <FontStyle>@FontStyle</FontStyle>
                                   <FontFamily>@FontFamily</FontFamily>
                                   <FontSize>@FontSizept</FontSize>
                                   <FontWeight>@FontWeight</FontWeight>
                                   <TextDecoration>@TextDecoration</TextDecoration>
                                   <Color>@Color</Color>
                                   </Style>
                                 </TextRun>";
        private string _ParagraphsPattern =
"                        <Textbox Name=\"txt@TextboxName\"> " + @"
                          <CanGrow>true</CanGrow>
                            <KeepTogether>true</KeepTogether>
                            <Paragraphs>
                              <Paragraph>
                                <TextRuns>
@TextRuns
                                </TextRuns>
                                <Style>@Style</Style>
                              </Paragraph>
                            </Paragraphs>
                            <rd:DefaultName>txt@TextboxName</rd:DefaultName>
                            <Top>@Topcm</Top>
                            <Left>@Leftcm</Left>
                            <Height>@Heightcm</Height>
                            <Width>@Widthcm</Width>
                            <ZIndex>1</ZIndex>
                            <Style>
                               @Border
                               @BottomBorder
                              <VerticalAlign>Middle</VerticalAlign>
                              <PaddingLeft>2pt</PaddingLeft>
                              <PaddingRight>2pt</PaddingRight>
                              <PaddingTop>2pt</PaddingTop>
                              <PaddingBottom>2pt</PaddingBottom>
                            </Style>
                          </Textbox>";
        #endregion

        /// <summary>
        /// 文本集合
        /// </summary>
        private List<ReportText> _texts = new List<ReportText>();

        private ParagraphStyle _style;

        /// <summary>
        /// 计数器
        /// </summary>
        private static int _Count;

        private string _textAlign;
        /// <summary>
        /// 段落水平对齐
        /// </summary>
        public TextAlign EnumTextAlign
        {
            set
            {
                switch (value)
                {
                    case TextAlign.Left:
                        _textAlign = "<TextAlign>Left</TextAlign>";
                        break;
                    case TextAlign.Center:
                        _textAlign = "<TextAlign>Center</TextAlign>";
                        break;
                    case TextAlign.Right:
                        _textAlign = "<TextAlign>Right</TextAlign>";
                        break;
                }
            }
        }

        private string _bottomBorder;
        /// <summary>
        /// 是否有下边框
        /// </summary>
        public bool BottomBorder
        {
            set
            {
                if (value)
                {
                    _bottomBorder =
                            @"<BottomBorder>
                                <Style>Solid</Style>
                                <Width>0.5pt</Width>
                            </BottomBorder>";
                }
                else
                {
                    _bottomBorder = "";
                }
            }
        }

        private string _border = @"<Border>
                                <Style>None</Style>
                              </Border>";
        /// <summary>
        /// 是否有边框
        /// </summary>
        public bool Border
        {
            set
            {
                if (value)
                {
                    _border =
                              @"<Border>
                                  <Style>Solid</Style>
                                  <Width>0.5pt</Width>
                               </Border>";
                }
                else
                {
                    _border = @"<Border>
                                <Style>None</Style>
                              </Border>";
                }
            }
        }

        #region 构造函数
        /// <summary>
        /// 只有内容
        /// </summary>
        /// <param name="value"></param>
        /// <param name="style"></param>
        public Paragraph(string value, ParagraphStyle style)
        {
            _style = style;
            if (!string.IsNullOrEmpty(value))
            {
                _texts.Add(new ReportText { Value = value });
            }
        }

        /// <summary>
        /// 单格式文本
        /// </summary>
        /// <param name="text"></param>
        /// <param name="style"></param>
        public Paragraph(ReportText text, ParagraphStyle style)
        {
            _style = style;
            if (text != null)
            {
                _texts.Add(text);
            }
        }

        /// <summary>
        /// 多格式文本
        /// </summary>
        /// <param name="texts"></param>
        /// <param name="style"></param>
        public Paragraph(List<ReportText> texts, ParagraphStyle style)
        {
            _style = style;
            _texts = texts;
        }
        #endregion

        /// <summary>
        /// 获取段落内容
        /// </summary>
        public override string ToString()
        {
            var font = new System.Drawing.Font("", 1f);
            var txtPattern = new StringBuilder();
            if (_texts != null && _texts.Count > 0)
            {
                foreach (var text in _texts)
                {
                    txtPattern.AppendLine(_TextRunPatten.Replace("@Value", text.Value)
                                    .Replace("@FontStyle", text.Style.GetFontStyle())
                                    .Replace("@FontFamily", text.Style.GetFontFamily())
                                    .Replace("@FontSize", text.Style.FontSize.ToString())
                                    .Replace("@FontWeight", text.Style.GetFontWeight())
                                    .Replace("@TextDecoration", text.Style.GetTextDecoration())
                                    .Replace("@Color", text.Style.GetColor()));
                }
                return _ParagraphsPattern.Replace("@TextboxName", (_Count++).ToString())
                                    .Replace("@TextRuns", txtPattern.ToString())
                                    .Replace("@Style", _textAlign)
                                    .Replace("@Top", _style.Top.ToString())
                                    .Replace("@Left", _style.Left.ToString())
                                    .Replace("@Height", _style.Height.ToString())
                                    .Replace("@Width", _style.Width.ToString())
                                    .Replace("@Border", _border)
                                    .Replace("@BottomBorder", _bottomBorder);
            }
            return string.Empty;
        }
    }
    #endregion

    #region 图片段落
    /// <summary>
    /// 报表图片
    /// </summary>
    class ReportImage
    {
        #region 图片格式
        private string _imagePattern =
"                        <Image Name=\"@Image\">" + @"
                          <Source>External</Source>
                          <Value>=Parameters!para_@Image.Value</Value>
                          <MIMEType>image/jpeg</MIMEType>
                          <Sizing>Fit</Sizing>
                          <Top>@Topcm</Top>
                          <Left>@Leftcm</Left>
                          <Height>@Heightcm</Height>
                          <Width>@Widthcm</Width>
                          <ZIndex>5</ZIndex>
                          <Style>
                              <Border>
                              <Style>None</Style>
                              </Border>
                          </Style>
                        </Image>";
        private string _imagePattern1 =
"                        <Image Name=\"@Image\">" + @"
                          <Source>Database</Source>" +
"                          <Value>=System.Convert.ToBase64String(First(Fields!@FieldsName.Value, \"@TableName\"))</Value>" + @"
                          <MIMEType>image/jpeg</MIMEType>
                          <Sizing>Fit</Sizing>
                          <Top>@Topcm</Top>
                          <Left>@Leftcm</Left>
                          <Height>@Heightpt</Height>
                          <Width>@Widthpt</Width>
                          <ZIndex>5</ZIndex>
                          <Style>
                              <Border>
                              <Style>None</Style>
                              </Border>
                          </Style>
                        </Image>";
        #endregion
        /// <summary>
        /// name
        /// </summary>
        private string _name;

        /// <summary>
        /// fieldsName
        /// </summary>
        private string _fieldsName;

        /// <summary>
        /// tableName
        /// </summary>
        private string _tableName;

        /// <summary>
        /// 样式
        /// </summary>
        private ParagraphStyle _style;

        /// <summary>
        /// 0:External 1:Database
        /// </summary>
        private int Source;

        /// <summary>
        /// 本地图片
        /// </summary>
        /// <param name="name"></param>
        /// <param name="style"></param>
        public ReportImage(string name, ParagraphStyle style)
        {
            _name = name;
            _style = style;
            Source = 0;
        }

        /// <summary>
        /// 数据库图片
        /// </summary>
        /// <param name="name"></param>
        /// <param name="style"></param>
        public ReportImage(string name, ParagraphStyle style, string fieldsName, string tableName)
        {
            _name = name;
            _style = style;
            _fieldsName = fieldsName;
            _tableName = tableName;
            Source = 1;
        }

        /// <summary>
        /// 获取图片内容
        /// </summary>
        public override string ToString()
        {
            if (!string.IsNullOrEmpty(_name))
            {
                if (Source == 0)
                {
                    return _imagePattern.Replace("@Image", _name)
                                        .Replace("@Top", _style.Top.ToString())
                                        .Replace("@Left", _style.Left.ToString())
                                        .Replace("@Height", _style.Height.ToString())
                                        .Replace("@Width", _style.Width.ToString());
                }
                else
                {
                    return _imagePattern1.Replace("@Image", _name)
                                        .Replace("@FieldsName", _fieldsName)
                                        .Replace("@TableName", _tableName)
                                        .Replace("@Top", _style.Top.ToString())
                                        .Replace("@Left", _style.Left.ToString())
                                        .Replace("@Height", _style.Height.ToString())
                                        .Replace("@Width", _style.Width.ToString());
                }
            }
            return string.Empty;
        }
    }
    #endregion

    #region 矩形
    /// <summary>
    /// 分页标志
    /// </summary>
    enum EnumBreakLocation
    {
        /// <summary>
        /// None未测试
        /// </summary>
        None,
        Start,
        End,
        StartAndEnd
    }
    /// <summary>
    /// 矩形
    /// </summary>
    class Rectangle
    {
        #region 矩阵格式
        private string _rectanglePattern =
"                        <Rectangle Name=\"@Rectangle\">" + @"
@ReportItem
                            @BreakLocation
                            <KeepTogether>true</KeepTogether>
                            <Top>@Topcm</Top>
                            <Left>@Leftcm</Left>
                            <Height>@Heightcm</Height>
                            <Width>@Widthcm</Width>
                            <Style>
                                <Border>
                                <Style>None</Style>
                                </Border>
                                @BackgroundImage
                                @BottomBorder
                            </Style>
                          </Rectangle>";
        #endregion

        #region 属性
        /// <summary>
        /// 计数器
        /// </summary>
        public static int Count;

        /// <summary>
        ////// </summary>
        public float Width { private get; set; }

        /// <summary>
        ////// </summary>
        public float Height { private get; set; }

        /// <summary>
        ////// </summary>
        public float Top { private get; set; }

        /// <summary>
        ////// </summary>
        public float Left { private get; set; }

        private string _breakLocation;
        /// <summary>
        /// 分页标志
        /// </summary>
        public EnumBreakLocation BreakLocation
        {
            set
            {
                switch (value)
                {
                    case EnumBreakLocation.Start:
                        _breakLocation = "<PageBreak><BreakLocation>Start</BreakLocation></PageBreak>";
                        break;
                    case EnumBreakLocation.End:
                        _breakLocation = "<PageBreak><BreakLocation>End</BreakLocation></PageBreak>";
                        break;
                    case EnumBreakLocation.StartAndEnd:
                        _breakLocation = "<PageBreak><BreakLocation>StartAndEnd</BreakLocation></PageBreak>";
                        break;
                    case EnumBreakLocation.None:
                        _breakLocation = "";
                        break;
                }
            }
        }

        private string _bottomBorder;
        /// <summary>
        /// 是否有下边框
        /// </summary>
        public bool BottomBorder
        {
            set
            {
                if (value)
                {
                    _bottomBorder =
                                @"<BottomBorder>
                                    <Style>Solid</Style>
                                    <Width>0.5pt</Width>
                                </BottomBorder>";
                }
                else
                {
                    _bottomBorder = "";
                }
            }
        }

        private string _backgroundImage;
        /// <summary>
        /// 背景图片字段
        /// 格式:Table.Field
        /// </summary>
        public string BackgroundImageField
        {
            set
            {
                
                if (string.IsNullOrEmpty(value) || value.IndexOf('.') < 0)
                {
                    _backgroundImage = value;
                    return;
                }
                var names = value.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                _backgroundImage =
                            @"<BackgroundImage>
                                <Source>Database</Source>" + @"                                   
                                <Value>=System.Convert.ToBase64String(First(Fields!" + names[1] + ".Value, \""+ names[0] + "\"))</Value>" + @"
                                <MIMEType>image/jpeg</MIMEType>
                                <BackgroundRepeat>Clip</BackgroundRepeat>
                            </BackgroundImage>";
            }
        }
        

        private List<string> _rectangles = new List<string>();
        #endregion

        /// <summary>
        /// 默认 左上0 宽17cm 高26.2cm 末尾分页
        /// </summary>
        public Rectangle()
        {
            Left = 0;
            Top = 0;
            Width = 17;
            Height = 26.2F;
            BreakLocation = EnumBreakLocation.End;
        }

        #region 成员
        /// <summary>
        /// 加图片
        /// </summary>
        /// <param name="img"></param>
        public void AddImage(ReportImage img)
        {
            if (img != null)
            {
                _rectangles.Add(img.ToString());
            }
        }

        /// <summary>
        /// 加段落
        /// </summary>
        /// <param name="paragraph"></param>
        public void AddReportParagraph(Paragraph paragraph)
        {
            if (paragraph != null)
            {
                _rectangles.Add(paragraph.ToString());
            }
        }

        
        /// <summary>
        /// 加矩阵
        /// </summary>
        /// <param name="rectangle"></param>
        public void AddRectangle(Rectangle rectangle)
        {
            if (rectangle != null)
            {
                _rectangles.Add(rectangle.ToString());
            }
        }

        /// <summary>
        /// 具体内容
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            var strPageHeader = string.Empty;
            var sb = new StringBuilder();
            if (_rectangles != null && _rectangles.Count > 0)
            {
                sb.AppendLine("<ReportItems>");
                foreach (var item in _rectangles)
                {
                    sb.AppendLine(item);
                }
                sb.AppendLine("</ReportItems>");
            }
            strPageHeader = _rectanglePattern.Replace("@Rectangle", "Rectangle" + (Count++).ToString())
                                                .Replace("@Top", Top.ToString())
                                                .Replace("@Left", Left.ToString())
                                                .Replace("@Height", Height.ToString())
                                                .Replace("@Width", Width.ToString())
                                                .Replace("@BreakLocation", _breakLocation)
                                                .Replace("@BottomBorder", _bottomBorder)
                                                .Replace("@BackgroundImage", _backgroundImage)
                                                .Replace("@ReportItem", sb.ToString());
            return strPageHeader;
        }
        #endregion
    }
    #endregion

    #region 表格
    /// <summary>
    /// 报表列样式
    /// </summary>
    class ReportColumn
    {
        /// <summary>
        /// 居中 2cm
        /// </summary>
        public ReportColumn()
        {
            TextAlign = TextAlign.Center;
            ColumnWidth = 2f;
        }

        /// <summary>
        /// 列名
        /// </summary>
        public string ColumnName { get; set; }

        /// <summary>
        /// 列宽
        /// </summary>
        public float ColumnWidth { get; set; }

        /// <summary>
        /// 对齐
        /// </summary>
        public TextAlign TextAlign { get; set; }
    }

    /// <summary>
    /// 表格
    /// </summary>
    class Tablix
    {
        #region 表格格式
        /// <summary>
        /// 表格格式
        /// </summary>
        private string _tablixPattern =
"                          <Tablix Name=\"Tablix@TablixName\">" + @"
                         <TablixBody>
                              <TablixColumns>
@TablixColumn
                              </TablixColumns> 
                              <TablixRows> 
@TablixHeadRow
@TablixDetailRow
                              </TablixRows> 
                          </TablixBody> 
                          <TablixColumnHierarchy> 
                              <TablixMembers>
@TablixMember
                              </TablixMembers> 
                          </TablixColumnHierarchy> 
                          <TablixRowHierarchy> 
                              <TablixMembers> 
                                  <TablixMember> 
                                      <KeepWithGroup>After</KeepWithGroup> 
                                  </TablixMember> 
                                  <TablixMember> 
" + "                                      <Group Name=\"详细信息@TablixName\" /> " + @"
                                  </TablixMember> 
                              </TablixMembers> 
                          </TablixRowHierarchy> 
                          <DataSetName>@DataSetName</DataSetName> 
                          <Top>@Topcm</Top> 
                          <Left>@Leftcm</Left> 
                          <Height>@Heightcm</Height> 
                          <Width>@Widthcm</Width> 
                          <Style> 
                              <Border> 
                                  <Style>Solid</Style> 
                                  <Width>0.5pt</Width>
                              </Border> 
                          </Style> 
                       </Tablix>";

        /// <summary>
        /// 行格式
        /// </summary>
        private string _tablixRowPattern = 
@"                                  <TablixRow> 
                                      <Height>1.6cm</Height> 
                                      <TablixCells>
@TablixCell
                                      </TablixCells> 
                                    </TablixRow>";
        /// <summary>
        /// 单元格格式
        /// </summary>
        private string _tablixCellPattern =
@"                                        <TablixCell>
                                          <CellContents>
@TextBox
                                          </CellContents>
                                        </TablixCell>";
        /// <summary>
        ////// </summary>
        private string _tablixColumnPattern =
@"                                <TablixColumn>
                                   <Width>@Widthcm</Width>
                                </TablixColumn>";
        #endregion

        #region 属性
        /// <summary>
        /// 计数器
        /// </summary>
        private static int Count;
        /// <summary>
        /// 数据源名称
        /// </summary>
        public string _dtName;
        /// <summary>
        /// 表格样式
        /// </summary>
        private ParagraphStyle _style;
        /// <summary>
        /// 列样式
        /// </summary>
        private List<ReportColumn> _reportColumns = new List<ReportColumn>();
        #endregion

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dtName">数据源名称</param>
        public Tablix(string dtName, ParagraphStyle style)
        {
            _dtName = dtName;
            _style = style;
        }

        #region 成员
        /// <summary>
        /// 添加列样式
        /// </summary>
        /// <param name="reportColumn"></param>
        public void AddColoumStyle(ReportColumn reportColumn)
        {
            if (reportColumn != null)
            {
                _reportColumns.Add(reportColumn);
            }
        }

        /// <summary>
        /// 详细信息
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            if (_reportColumns.Count > 0)
            {
                var sbCol = new StringBuilder();
                var sbHeadRow = new StringBuilder();
                var sbDetailRow = new StringBuilder();
                var sbMember = new StringBuilder();
                foreach (var col in _reportColumns)
                {
                    sbCol.AppendLine(_tablixColumnPattern.Replace("@Width", col.ColumnWidth.ToString()));
                    var paragraph = new Paragraph(col.ColumnName, new ParagraphStyle()) { Border = true,  EnumTextAlign = TextAlign.Center };
                    sbHeadRow.AppendLine(_tablixCellPattern.Replace("@TextBox", paragraph.ToString()));
                    paragraph = new Paragraph("=Fields!" + col.ColumnName + ".Value", new ParagraphStyle()) { Border = true,  EnumTextAlign = TextAlign.Center };
                    sbDetailRow.AppendLine(_tablixCellPattern.Replace("@TextBox", paragraph.ToString()));
                    sbMember.AppendLine("                                  <TablixMember />");
                }
                return _tablixPattern.Replace("@TablixName", (Count++).ToString())
                                .Replace("@TablixColumn", sbCol.ToString())
                                .Replace("@TablixHeadRow", _tablixRowPattern.Replace("@TablixCell", sbHeadRow.ToString()))
                                .Replace("@TablixDetailRow", _tablixRowPattern.Replace("@TablixCell", sbDetailRow.ToString()))
                                .Replace("@TablixMember", sbMember.ToString())
                                .Replace("@Top", _style.Top.ToString())
                                .Replace("@Left", _style.Left.ToString())
                                .Replace("@Height", _style.Height.ToString())
                                .Replace("@Width", _style.Width.ToString())
                                .Replace("@DataSetName", _dtName);

            }
            return string.Empty;
        }
        #endregion
    }

    /// <summary>
    /// 数据源
    /// </summary>
    class DataSource
    {
        #region 数据源格式
        /// <summary>
        /// 数据源格式 
        /// 一个报表一个数据源,名称可以固定
        /// </summary>
        private string _dataSourcePattern = @"<DataSources>
                 " + "<DataSource Name=\"DataSource1\">" + @"
                    <ConnectionProperties>
                    <DataProvider>System.Data.DataSet</DataProvider>
                    <ConnectString>/* Local Connection */</ConnectString>
                    </ConnectionProperties>
                    <rd:DataSourceID>5f89ecce-6bd0-4fb4-9b46-e1c01c9b64ea</rd:DataSourceID>
                 </DataSource>
                </DataSources>
                <DataSets>
@DataSet
                </DataSets>";
        /// <summary>
        /// 数据源格式 
        /// 一个表格对应一个dataset、datatable,datatable名称固定
        /// </summary>
        private string _dataSetPattern =
"                  <DataSet Name=\"@DataSetName\">" + @"
                      <Fields>
@Field
                      </Fields>
                      <Query>
                          <DataSourceName>DataSource1</DataSourceName>
                          <CommandText />
                      </Query>
                      <rd:DataSetInfo>
                          <rd:DataSetName>@DataSetName</rd:DataSetName>
                          <rd:TableName>DataTable1</rd:TableName>
                          <rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
                      </rd:DataSetInfo>
                  </DataSet>";

        /// <summary>
        /// 字段格式
        /// </summary>
        private string _fieldPattern =
"                         <Field Name=\"@Field\">" + @"
                            <DataField>@Field</DataField>
                            <rd:TypeName>System.String</rd:TypeName>
                          </Field>";
        #endregion
        private List<DataTable> list = new List<DataTable>();
        /// <summary>
        /// 获取数据源
        /// </summary>
        public List<DataTable> Tables
        {
            get
            {
                return list;
            }
        }

        /// <summary>
        /// 添加数据源
        /// </summary>
        /// <param name="name"></param>
        /// <param name="dt"></param>
        public void AddDataTable(DataTable dt)
        {
            if (dt == null) throw new Exception("DataSource.AddDataTable方法,数据源不能为空");
            if (string.IsNullOrEmpty(dt.TableName)) throw new Exception("DataSource.AddDataTable方法,数据源没有定义名称");
            list.Add(dt);
        }

        /// <summary>
        /// 详情
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            if (list.Count == 0) return string.Empty;
            var sb = new StringBuilder();
            foreach (var table in list)
            {
                var fields = new StringBuilder();
                foreach (DataColumn col in table.Columns)
                {
                    fields.AppendLine(_fieldPattern.Replace("@Field", col.ColumnName));
                }
                sb.AppendLine(_dataSetPattern.Replace("@DataSetName", table.TableName)
                                .Replace("@Field", fields.ToString()));
            }
            return _dataSourcePattern.Replace("@DataSet", sb.ToString());
        }
    }
    #endregion

    #region 页眉
    /// <summary>
    /// 页眉
    /// </summary>
    class PageHeader
    {
        //<BottomBorder>
        //<Style>Solid</Style>
        //</BottomBorder>
        /// <summary>
        /// 页眉
        /// </summary>
        private string _pageHeaderPattern =
                    @"<PageHeader>
                      <Height>@Heightcm</Height>
                      <PrintOnFirstPage>true</PrintOnFirstPage>
                      <PrintOnLastPage>true</PrintOnLastPage>
                      <ReportItems>
@Text
                      </ReportItems>
                      <Style>
                        <Border>
                          <Style>None</Style>
                        </Border>
                      </Style>
                    </PageHeader>";

        private float _height = 1;
        /// <summary>
        /// 高度 单位cm
        /// </summary>
        public float Height
        {
            set
            {
                _height = value;
            }
        }

        private List<string> _pageHeaders = new List<string>();

        /// <summary>
        /// 具体内容
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            var strPageHeader = string.Empty;
            if (_pageHeaders != null && _pageHeaders.Count > 0)
            {
                var sb = new StringBuilder();
                foreach (var item in _pageHeaders)
                {
                    sb.AppendLine(item);
                }
                strPageHeader = _pageHeaderPattern.Replace("@Height", _height.ToString())
                                                    .Replace("@Text", sb.ToString());
                return strPageHeader;
            }
            return string.Empty;
        }

        /// <summary>
        /// 加图片
        /// </summary>
        /// <param name="img"></param>
        public void AddImage(ReportImage img)
        {
            if (img != null)
            {
                _pageHeaders.Add(img.ToString());
            }
        }

        /// <summary>
        /// 加段落
        /// </summary>
        /// <param name="paragraph"></param>
        public void AddReportParagraph(Paragraph paragraph)
        {
            if (paragraph != null)
            {
                _pageHeaders.Add(paragraph.ToString());
            }
        }

        /// <summary>
        /// 加矩阵
        /// </summary>
        /// <param name="paragraph"></param>
        public void AddRectangle(Rectangle rectangle)
        {
            if (rectangle != null)
            {
                _pageHeaders.Add(rectangle.ToString());
            }
        }
    }
    #endregion

    #region 页脚
    /// <summary>
    /// 页脚
    /// </summary>
    class PageFooter
    {
        /// <summary>
        /// 页脚
        /// </summary>
        private string _pageFooterPattern =
                    @"<PageFooter>
                      <Height>@Heightcm</Height>
                      <PrintOnFirstPage>true</PrintOnFirstPage>
                      <PrintOnLastPage>true</PrintOnLastPage>
                      <ReportItems>
@Text
                      </ReportItems>
                      <Style>
                        <Border>
                          <Style>None</Style>
                        </Border>
                      </Style>
                    </PageFooter>";

        private float _height = 1;
        /// <summary>
        /// 高度 单位cm
        /// </summary>
        public float Height
        {
            set
            {
                _height = value;
            }
        }

        private List<string> _pageFooters = new List<string>();

        /// <summary>
        /// 具体内容
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            var strPageFooter = string.Empty;
            if (_pageFooters != null && _pageFooters.Count > 0)
            {
                var sb = new StringBuilder();
                foreach (var item in _pageFooters)
                {
                    sb.AppendLine(item);
                }
                strPageFooter = _pageFooterPattern.Replace("@Height", _height.ToString())
                                                    .Replace("@Text", sb.ToString());
                return strPageFooter;
            }
            return string.Empty;
        }

        /// <summary>
        /// 加图片
        /// </summary>
        /// <param name="img"></param>
        public void AddImage(ReportImage img)
        {
            if (img != null)
            {
                _pageFooters.Add(img.ToString());
            }
        }

        /// <summary>
        /// 加段落
        /// </summary>
        /// <param name="paragraph"></param>
        public void AddReportParagraph(Paragraph paragraph)
        {
            if (paragraph != null)
            {
                _pageFooters.Add(paragraph.ToString());
            }
        }
    }
    #endregion
}
View Code

3、动态代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Reporting.WebForms;
using System.IO;
using System.Data;
using System.Text;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.Drawing.Printing;
using System.Drawing.Imaging;
using System.Drawing;
using EsignUtils.service;
using EsignUtils.service.factory;

namespace WebGPS.Contract
{
    /// <summary>
    /// 动态报表
    /// </summary>
    class DynamicReport
    {
        #region 报表内容格式
        /// <summary>
        /// 参数内容
        /// </summary>
        private string _parameterPattern =
                    "<ReportParameter Name=\"@ReportParameter\">" + @"
                        <DataType>String</DataType>
                        <Nullable>true</Nullable>
                        <AllowBlank>true</AllowBlank>
                        <Prompt>ReportParameter1</Prompt>
                    </ReportParameter>";
        private string _parametersPattern =
@"                <ReportParameters>
                    @ReportParameters
                </ReportParameters>";

        /// <summary>
        /// 空白文档的xml文件
        /// </summary>
        private string _docTemplate =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?><Report xmlns:rd=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\" xmlns=\"http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition\">" +
                @"
                @DataSource
                <Body>
                    <ReportItems>
@ReportItem
                    </ReportItems>
                    <Style>
                      <Border />
                      <BackgroundImage>
                        <Source>External</Source>
                        <Value>=Parameters!para_Background.Value</Value>
                      </BackgroundImage>
                    </Style>
                    <Height>80mm</Height>
                </Body>
                @ReportParameters
                <Width>170mm</Width>
                <Page>
                    @PageHeader
                    @PageFooter
                    <PageHeight>@Heightmm</PageHeight>
                    <PageWidth>210mm</PageWidth>
                    <LeftMargin>20mm</LeftMargin>
                    <RightMargin>20mm</RightMargin>
                    <TopMargin>0cm</TopMargin>
                    <BottomMargin>0cm</BottomMargin>
                    <ColumnSpacing>0.13cm</ColumnSpacing>
                    <Style />
                </Page>
                <rd:ReportID>809f16cf-ea78-4469-bf43-965c4afe69d0</rd:ReportID>
                <rd:ReportUnitType>Cm</rd:ReportUnitType>
            </Report>";
        #endregion

        #region 成员
        private ReportViewer _report;   // 报表
        private PageHeader _pageHeader = new PageHeader(); // 页眉
        private PageFooter _pageFooter = new PageFooter(); // 页脚
        private DataSource _dataSource = new DataSource(); // 数据源
        private List<string> _reportItems = new List<string>(); // body
        private List<ReportParameter> _reportParameters = new List<ReportParameter>(); // 报表参数(一般用于图片地址)
        /// <summary>
        /// e签宝打印标志
        /// </summary>
        internal string PrintTag { get; private set; }
        /// <summary>
        /// 印章数据
        /// </summary>
        public static string SealData { get; set; }
        private static SignUtil sign = new SignUtil();
        #endregion

        #region 实现
        /// <summary>
        /// 加载印章
        /// </summary>
        static DynamicReport()
        {
            sign = new SignUtil();
            sign.Init();
            sign.AddPerson();
            SealData = sign.AddTemplateSeal();
        }

        /// <summary>
        /// 绑定报表
        /// </summary>
        /// <param name="reportViewer"></param>
        public DynamicReport(ReportViewer reportViewer)
        {
            PrintTag = GetCode(6);
            this._report = reportViewer;
        }

        /// <summary>
        /// 添加数据集
        /// </summary>
        /// <param name="dataTable"></param>
        internal void AddTablix(DataTable dataTable, List<ReportColumn> columns, ParagraphStyle style)
        {
            var tablix = new Tablix(dataTable.TableName, style);
            foreach (var col in columns)
            {
                tablix.AddColoumStyle(col);
            }
            _reportItems.Add(tablix.ToString());
            _dataSource.AddDataTable(dataTable);
        }

        /// <summary>
        /// 添加数据集
        /// </summary>
        /// <param name="dataTable"></param>
        internal void AddDataSource(DataTable dataTable)
        {
            _dataSource.AddDataTable(dataTable);
        }

        /// <summary>
        /// 添加参数
        /// </summary>
        /// <param name="parameter"></param>
        internal void AddParameter(ReportParameter parameter)
        {
            _reportParameters.Add(parameter);
        }

        /// <summary>
        /// 加图片
        /// </summary>
        /// <param name="img"></param>
        internal void AddImage(ReportImage img)
        {
            if (img != null)
            {
                _reportItems.Add(img.ToString());
            }
        }

        /// <summary>
        /// 加段落
        /// </summary>
        /// <param name="paragraph"></param>
        internal void AddReportParagraph(Paragraph paragraph)
        {
            if (paragraph != null)
            {
                _reportItems.Add(paragraph.ToString());
            }
        }

        /// <summary>
        /// 加矩阵(分页用)
        /// </summary>
        /// <param name="rectangle"></param>
        internal void AddRectangle(Rectangle rectangle)
        {
            if (rectangle != null)
            {
                _reportItems.Add(rectangle.ToString());
            }
        }

        /// <summary>
        /// 设置页眉
        /// </summary>
        internal void SetPageHeader(PageHeader pageHeader)
        {
            if (pageHeader != null) this._pageHeader = pageHeader;
        }

        /// <summary>
        /// 设置页脚
        /// </summary>
        internal void SetPageFooter(PageFooter pageFooter)
        {
            if (pageFooter != null) this._pageFooter = pageFooter;
        }

        /// <summary>
        /// 显示报表
        /// </summary>
        public void ShowReport()
        {
            SetReport(297 * 10);
            _report.LocalReport.Refresh();
        }

        /// <summary>
        /// 导出报表
        /// </summary>
        public List<string> PrintPDF()
        {
            SetReport(297);
            Export();
            var list = new List<string>();
            for (int i = 0; i < m_streams.Count; i++)
            {
                var stream = new MemoryStream();
                Metafile image = new Metafile(m_streams[i]);
                image.Save(stream, ImageFormat.Png);
                //image.Save("F:x" + i + ".png", ImageFormat.Png);
                //var bytes = new byte[m_streams[i].Length];
                //m_streams[i].Read(bytes, 0, bytes.Length);
                //m_streams[i].Seek(0, SeekOrigin.Begin);

                list.Add(Convert.ToBase64String(stream.ToArray()));
            }
            return list;
        }

        /// <summary>
        /// 导出pdf到服务器,留存
        /// </summary>
        /// <param name="path"></param>
        public List<string> ExportPDF(string path, string fileName)
        {
            SetReport(297);
            Warning[] warnings;
            string[] streamIds;
            var mimeType = string.Empty;
            var encoding = string.Empty;
            var extension = string.Empty;
            var bytes = _report.LocalReport.Render("pdf", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
            StaticMethod.WriteByteToFile(bytes, fileName + ".pdf");

            Export();
            var list = new List<string>();
            try
            {
                if (Directory.Exists(path) == false)
                {
                    Directory.CreateDirectory(path);
                } 
                for (int i = 0; i < m_streams.Count; i++)
                {
                    Metafile image = new Metafile(m_streams[i]);
                    image.Save(path + fileName + "_" + i + ".png", ImageFormat.Png);
                    list.Add(fileName + "_" + i + ".png");
                }
            }
            catch
            {
            }
            return list;
        }

        /// <summary>
        /// 字节数组生成图片
        /// </summary>
        /// <param name="Bytes">字节数组</param>
        /// <returns>图片</returns>
        private Image byteArrayToImage(byte[] Bytes)
        {
            using (MemoryStream ms = new MemoryStream(Bytes))
            {
                Image outputImg = Image.FromStream(ms);
                return outputImg;
            }
        }
        #endregion

        #region 内部方法
        /// <summary>
        /// 设置报表
        /// </summary>
        private void SetReport(float height)
        {
            var sb = new StringBuilder();
            _docTemplate = _docTemplate.Replace("@Height", height.ToString());
            // 数据源
            _docTemplate = _docTemplate.Replace("@DataSource", _dataSource.ToString());
            // 加载报表参数
            if (_reportParameters.Count > 0)
            {
                foreach (var parameter in _reportParameters)
                {
                    sb.AppendLine(_parameterPattern.Replace("@ReportParameter", parameter.Name));
                }
                _docTemplate = _docTemplate.Replace("@ReportParameters", _parametersPattern.Replace("@ReportParameters", sb.ToString()));
            }
            else
            {
                _docTemplate = _docTemplate.Replace("@ReportParameters", "");
            }
            // 页眉页脚
            _docTemplate = _docTemplate.Replace("@PageHeader", _pageHeader.ToString()).Replace("@PageFooter", _pageFooter.ToString());
            // 主题内容
            sb = new StringBuilder();
            foreach (var reportItem in _reportItems)
            {
                sb.AppendLine(reportItem);
            }
            _docTemplate = _docTemplate.Replace("@ReportItem", sb.ToString());

            var doc = new XmlDocument();
            doc.LoadXml(_docTemplate);
            Stream stream = GetRdlcStream(doc);

            //加载报表定义
            _report.LocalReport.LoadReportDefinition(stream);
            _report.LocalReport.DataSources.Clear();
            foreach (var dt in _dataSource.Tables)
            {
                _report.LocalReport.DataSources.Add(new ReportDataSource(dt.TableName, dt));
            }
            // 加载报表参数
            if (_reportParameters.Count > 0)
            {
                foreach (var parameter in _reportParameters)
                {
                    _report.LocalReport.SetParameters(parameter);
                }
            }
        }

        /// <summary>
        /// 序列化到内存流
        /// </summary>
        /// <returns></returns>
        protected Stream GetRdlcStream(XmlDocument xmlDoc)
        {
            Stream ms = new MemoryStream();
            XmlSerializer serializer = new XmlSerializer(typeof(XmlDocument));
            serializer.Serialize(ms, xmlDoc);
            ms.Position = 0;
            return ms;
        }

        /// <summary>
        /// 获取随机数
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        private static string GetCode(int num)
        {
            string AllCode = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
            string[] CodeArray = AllCode.Split(',');
            string ReturnCode = "";
            Random rand = new Random();
            for (int i = 0; i < num; i++)
            {
                int r = rand.Next(52);
                ReturnCode += CodeArray[r];
            }
            return ReturnCode;
        }

        private int m_currentPageIndex;
        private IList<MemoryStream> m_streams;
        private void Export()
        {
            string deviceInfo =
              "<DeviceInfo>" +
              "  <OutputFormat>EMF</OutputFormat>" +
              "  <PageWidth>210mm</PageWidth>" +
              "  <PageHeight>297mm</PageHeight>" +
              "  <MarginTop>0mm</MarginTop>" +
              "  <MarginLeft>20mm</MarginLeft>" +
              "  <MarginRight>20mm</MarginRight>" +
              "  <MarginBottom>0mm</MarginBottom>" +
              "</DeviceInfo>";//这里是设置打印的格式 边距什么的

            Warning[] warnings;
            m_streams = new List<MemoryStream>();
            try
            {
                _report.LocalReport.Render("Image", deviceInfo, CreateStream, out warnings);//一般情况这里会出错的  使用catch得到错误原因  一般都是简单错误
            }
            catch (Exception ex)
            {
                Exception innerEx = ex.InnerException;//取内异常。因为内异常的信息才有用,才能排除问题。
                while (innerEx != null)
                {
                    string errmessage = innerEx.Message;
                    innerEx = innerEx.InnerException;
                }
            }
            foreach (Stream stream in m_streams)
            {
                stream.Position = 0;
            }
        }

        /// <summary>
        /// 打印流
        /// </summary>
        /// <param name="name"></param>
        /// <param name="fileNameExtension"></param>
        /// <param name="encoding"></param>
        /// <param name="mimeType"></param>
        /// <param name="willSeek"></param>
        /// <returns></returns>
        private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
        {
            //name 需要进一步处理
            var stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }
        #endregion
    }
}
View Code

4、e签宝

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using EsignUtils.utils.bean.config;
using EsignUtils.utils.bean.constant;
using EsignUtils.utils.bean.result;
using Newtonsoft.Json;
using EsignUtils.service;
using EsignUtils.service.factory;
using EsignUtils.utils.bean;
using EsignUtils.bean.result;
using EsignUtils.bean.constant;
using System.IO;

namespace WebGPS.Contract
{
    /// <summary>
    /// e签宝
    /// </summary>
    class SignUtil
    {
        HttpContext con = null;
        EsignTechService service = EsignTechServiceFactory.Instance();//sdk初始化
        public int XPos { get; set; }
        public int YPos { get; set; }
        #region 系统初始化
        /// <summary>
        /// 系统初始化
        /// </summary>
        public void Init()
        {
            string msg = string.Empty;
            string projectId = "1111563517"; // con.Request["projectId"];
            string projectSecret = "95439b0863c241c63a861b87d1e647b7"; // con.Request["projectSecret"];
            string apisUrl = "http://121.40.164.61:8080/tgmonitor/rest/app!getAPIInfo2"; // con.Request["apisUrl"];
            string proxyIp = ""; // con.Request["proxyIp"];
            string port = ""; // con.Request["proxyPort"];
            int proxyPort = 0;
            if (!string.IsNullOrEmpty(port))
            {
                proxyPort = Convert.ToInt32(port);
            }
            string httpType = "https"; // con.Request["httpType"];
            int retry = 5; // Convert.ToInt32(con.Request["retry"]);
            string algorithm = "HMAC-SHA256"; // con.Request["algorithm"];
            string esignPublicKey = ""; // con.Request["esignPublicKey"];
            string privateKey = ""; // con.Request["privateKey"];
            ProjectConfig projectConfig = new ProjectConfig();
            projectConfig.ApisUrl = apisUrl;
            projectConfig.ProjectId = projectId;
            projectConfig.ProjectSecret = projectSecret;
            HttpConnectConfig httpConfig = new HttpConnectConfig();
            httpConfig.HttpType = httpType.ToUpper() == HttpTypes.HTTPS.ToString() ? HttpTypes.HTTPS : HttpTypes.HTTP;
            httpConfig.ProxyIp = proxyIp;
            httpConfig.ProxyPort = proxyPort;
            httpConfig.Retry = retry;

            SignatureConfig signatureConfig = new SignatureConfig();
            if (algorithm.ToUpper() == AlgorithmType.RSA.ToString())
            {
                signatureConfig.AlgorithmType = AlgorithmType.RSA;
                signatureConfig.EsignPublicKey = esignPublicKey;
                signatureConfig.PrivateKey = privateKey;
            }

            Result initResult = service.Init(projectConfig, httpConfig, signatureConfig);
            //msg = JsonConvert.SerializeObject(initResult);
            //con.Response.Write(msg);
        }
        #endregion

        #region 添加个人用户
        /// <summary>
        /// 添加个人用户
        /// </summary>
        public void AddPerson()
        {
            PersonBean person = new PersonBean();
            person.Email = ""; // con.Request["email"];
            person.Mobile = "13333333353"; // con.Request["mobile"];
            person.Name = "个人测试"; // con.Request["name"];
            person.IdNo = "360730198902261419"; // con.Request["id"];

            person.PersonArea = 1;
            string personArea = "4"; // con.Request["area"];
            if (!string.IsNullOrEmpty(personArea))
            {
                int numPersonArea = 0;
                bool transfer = int.TryParse(personArea, out numPersonArea);
                if (transfer)
                {
                    person.PersonArea = numPersonArea;
                }
            }
            person.Organ = ""; // con.Request["organ"];
            person.Title = ""; // con.Request["title"];
            person.Address = ""; // con.Request["address"];
            AddAccountResult addAccountResult = service.AddAccount(person);
            //string msg = JsonConvert.SerializeObject(addAccountResult);
            //con.Response.Write(msg);
        }
        #endregion

        #region 添加企业账户
        /// <summary>
        /// 添加企业账户
        /// </summary>
        private void AddOrganize()
        {
            OrganizeBean organize = new OrganizeBean();
            organize.Email = con.Request["email"];
            organize.Mobile = con.Request["mobile"];
            organize.Name = con.Request["name"];
            organize.OrganType = Convert.ToInt32(con.Request["organType"]);
            organize.UserType = Convert.ToInt32(con.Request["userType"]);
            //organize.RegCode = con.Request["regCode"];
            organize.OrganCode = con.Request["organCode"];
            organize.LegalName = con.Request["legalName"];
            organize.LegalIdNo = con.Request["legalIdNo"];
            organize.LegalArea = Convert.ToInt32(con.Request["LegalArea"]);
            organize.AgentName = con.Request["agentName"];
            organize.AgentIdNo = con.Request["agentIdNo"];
            organize.Address = con.Request["address"];
            organize.Scope = con.Request["scope"];
            organize.RegType = string.IsNullOrEmpty(con.Request["regType"]) ? OrganRegType.NORMAL : (OrganRegType)Enum.Parse(typeof(OrganRegType), Convert.ToInt32(con.Request["regType"]).ToString());
            string devId = con.Session["devId"] == null ? "" : con.Session["devId"].ToString();
            AddAccountResult addAccountResult = service.AddAccount(organize);
            string msg = JsonConvert.SerializeObject(addAccountResult);
            con.Response.Write(msg);
        }
        #endregion

        #region 创建模版印章
        /// <summary>
        /// 创建模版印章
        /// </summary>
        public string AddTemplateSeal()
        {
            string devId = ""; // con.Session["devId"] == null ? "" : con.Session["devId"].ToString();
            string accountId = "29C75725DB05496D80BE9B4D96F9AA76"; // con.Request["accountId"];
            string templateType = "SQUARE"; // con.Request["templateType"];
            string color = "RED"; // con.Request["color"];
            string hText = ""; // con.Request["hText"];
            string qText = ""; // con.Request["qText"];
            string userType = "0"; // con.Request["accountType"];

            AddSealResult addSealResult = null;
            //个人账户
            if (userType.Equals("0"))
            {
                addSealResult = service.AddTemplateSeal(accountId,
                   (PersonTemplateType)Enum.Parse(typeof(PersonTemplateType), templateType.ToUpper()),
                   (SealColor)Enum.Parse(typeof(SealColor), color));
            }
            else
            {
                addSealResult = service.AddTemplateSeal(accountId,
                    (OrganizeTemplateType)Enum.Parse(typeof(OrganizeTemplateType), templateType.ToUpper()),
                    (SealColor)Enum.Parse(typeof(SealColor), color),
                    hText, qText);
            }
            return addSealResult.SealData;
            //string msg = JsonConvert.SerializeObject(addSealResult);
            //con.Response.Write(msg);
        }
        #endregion

        #region 创建手绘印章
        /// <summary>
        /// 创建手绘印章
        /// </summary>
        private void AddFileSeal()
        {
            string devId = con.Session["devId"] == null ? "" : con.Session["devId"].ToString();
            string accountId = con.Request["accountId"];
            string imgB64 = con.Request["sealData"];
            imgB64 = imgB64.Substring(imgB64.IndexOf(',') + 1);
            string color = con.Request["color"];
            AddSealResult addSealResult = service.AddFileSeal(devId, accountId, imgB64, (SealColor)Enum.Parse(typeof(SealColor), color));
            string msg = JsonConvert.SerializeObject(addSealResult);
            con.Response.Write(msg);
        }
        #endregion


        #region 平台用户摘要自身签署
        /// <summary>
        /// 平台用户摘要自身签署
        /// </summary>
        public void LocalSignPDF()
        {
            string devId = ""; // con.Session["devId"] == null ? "" : con.Session["devId"].ToString();
            string accountId = "29C75725DB05496D80BE9B4D96F9AA76"; // con.Request["accountId"];
            // 返回的印章信息
            string sealData = "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD/CAMAAAAJ1vD4AAADAFBMVEX/////AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLakbNAAAAAXRSTlMAQObYZgAABw5JREFUeNrtndl22zAMRD0I//+XpyenbmPHWkAQoEgKeuhLHZEXGICLuACPWz/ySP7kv+9Tvv/hPdmR/k/+5E/+5E/+5E/+5E/+5E/+WQYvt/Y/MA8/Qt6IDvw+NScwqATkDP+jDFwpV/e3Sr14YZSLpwXg9dYTfm4VsV8kjtURpIH4/Ke0wHlScrLA61vISH5WBAGCcr2qgsannKfuJxy1qgPjqnth/08vXUTjw6+BlgqBeRhgtL5VUUQYNpXN/YpwZOLw/i8744e3f8N+HmO7AeYb/8HVM2H8QA/3s1UA8ggLgI69XfTxP4fSAD1SQHD8u1tgr5FFKD933I/eFoB34yR6rdFIhzj1t0dAaQ19nHqA8eo/HXZFxj8uxmeLzsQhbg9/2qHz2GIAcclc6DLi21V/gwHkqCy4BUF08JtrIYea0vuVl+LTbACpGlvt2qPnEJEboGYDSKWwcdV6cRynHBorKE1ZlRfg/++LvpPSlgRE0awMsEVgO/iBZgNITekYC3/XN/DhH2be67Dbu/V/eslKZQVGw39lpaHGUlsPDoa/J1ilBOQxegCc4nOnwioLDD//+6NuKpzE2s6KWBxxCb6yc1hpAans1XNsfG0LWel/Xi5+w3TAjwVg5ucQ+JVfFDc6CbsmKOr3YQrnP/8Am29jPT+Pg6uH801jZG3NymPQpwl/QwJs5MdM9B8SYKz/GYPPxkopMkgZV/rtRuX5m0pVnTgT/X8JcKL8B+eA4sl3sbI0/fnLSlXFujxde5tltJp17muPpf/+A40Z5v+u538k/2PNY1LEQ/5M/a/Mj4XTotw7/C37/27Gv/YBecUBmhOHiTSE/5aRPqaqMaX/aas5V9H/c+qgDpXrxP+ZBbbW307ZPopW0PwIcqzQQpT2GMfhGnhO7X9t9XckQHI5//9G5nPbP6dMhx7jv83vw5wjHUq7+6dOgy7n3/xbK471+HXu57QSEI/Qn9gA0ub+6UfLYuLEfvcQN/D/4eoM3Cb+d1aeYnX+iK/UE/Hv4M8pgBLlfcwhkeKHT0yYC9XzH7Wxv+b45xCfE1qgav4DOu9z1wKcL/75sf2vai3+6BngCz7a3036CHI/fF4hlQUeB/XGMSmDJ4Hi5/y/euduCIRYgp34tYXt9guGpK84/wZNhbnTe9m0dCAISgHsGf/DPU5GlXvj5/q35E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5N964rfBOZYgg9cvugQZ3kOxJYStf8LzDI249Z/ouf6vwQKhJmC4/tGs0chgQPT936g2wMbZIONaQLP/214Ce1yixEj+prPv6RRHcfja9g/mmjG2TWT0/a/Nd4wzXgI9+j8tSWBgA4i++kNuZUIv/zeUNfIWIKmp/oJHIXYZ/3MVfixnCKmrNVYTQN/5L9yVn6OaVAJrjwkE0Ev/5JgGkF46xpgKkM74oxmg6v5DD3wHA3hasBi8j8aKwrU1ADvo/+1gA47kwE7+fz/r6+Q2sNATD67h/2UNrHIZgrH9HwOfl/GP9ODm/I/kvxU/LuEf+HBjdOCHpRispf/RJECHBrDu+x/G9Dmi+aGWwCTHfp71f2EcbsF7dBctMHHtWeKiCIC3/18Obny/64WaLNFP/83nS5bDN9fd6dH5Qpzg8884U7tulpxcZvkh0p+x/89rKhvgCuP6z9czLbdyI3qHvzUAykV2z/GvU/g33ryS8x+TPvTJtRJbO0TLv9P61ylTw8r8dBKALORiDMiPvloYhp+xxqSXsbP9X6Dxb1iiLtFVRIT8/dKNLOD+lmxj5+/+NQRuP/LgP/0gFncl5uHV6+jD33+m+3gKmn31j7hGvlXY6BT/6muw3tY+fj8hPStjBEisMy7pRyOaX6N+uFoL56Kzzb5KBP5T5BHpgar/QiQ/zvoFcBeA7vOjJQSc7/98r+jH10mEBv9rcdrvAeKI/5Paf+/KRnTwf/43YvgVryXpMDAz4Ftsbrv/86Amgbd+su4XCNH/R6rFEf2WAGh0P2tNpDFA8QnM/YEJXhISWsrQmY3vO20Ywk8l/DsIH/H41YUWEz70sfnjEIsB6vF/tblnEhCT0GuSXsPxAbB4n1XzNMWofo+xd5D2N3pdjMv/5w0e++Jv/X5/0K0aqODz7VVbvGCxR0vmg8ow6vuPufsOGhyCKgRTf0r/N2J8H6vKqWZA4xZCHnbLXx7t/d/YyuZsVqS5m11ZIvd+IQ0eZIgiX8aYTQ0LVSla6l6ne2mbAYB257/9PV3GP27V0a1icBhHanbtlyAnavolldMrxo66R//Xp07U4vvNIZxukfrqO5Wv2T7EnpXpzH/ZDpnW9s9NkIMtnC7dSxzLALn+KfmTP/mTP/mTP/mTP/nv9ADp/+RP/rs+fwDcYM+42lHYrQAAAABJRU5ErkJggg=="; // con.Request["sealData"];
            string srcFile = "E:/test.pdf"; // con.Request["srcFile"];
            string dstFile = "E:/test-dst.pdf"; // con.Request["dstFile"];
            string type = ""; // con.Request["signType"];
            string fileName = "test"; // con.Request["fileName"];
            string key = ""; // con.Request["key"];
            PosBean pos = new PosBean();
            pos.PosPage = "2"; // con.Request["posPage"];
            pos.PosX = XPos; // float.Parse(con.Request["posX"]);
            pos.PosY = YPos; // float.Parse(con.Request["posY"]);
            pos.PosType = 1; // Int32.Parse(con.Request["posType"]);
            pos.Width = 100; // float.Parse(con.Request["sealWidth"]);
            pos.Key = key;
            SignPDFFileBean fileBean = new SignPDFFileBean();
            fileBean.DstPdfFile = dstFile;
            fileBean.SrcPdfFile = srcFile;
            fileBean.FileName = fileName;
            SignType signType = SignType.Signle;
            if ("Single".ToUpper() == type.ToUpper())
            {
                signType = SignType.Signle;
            }
            else if ("Multi".ToUpper() == type.ToUpper())
            {
                signType = SignType.Multi;
            }
            else if ("Edges".ToUpper() == type.ToUpper())
            {
                signType = SignType.Edges;
            }
            else if ("Key".ToUpper() == type.ToUpper())
            {
                signType = SignType.Key;
            }
            // SignServiceId
            FileDigestSignResult result = service.LocalSignPDF(accountId, sealData, fileBean, pos, signType);
            string msg = JsonConvert.SerializeObject(result);
        }
        #endregion

        #region 平台自身签署
        /// <summary>
        /// 平台自身签署
        /// </summary>
        public void LocalSelfSignPDF()
        {
            string devId = ""; // con.Session["devId"] == null ? "" : con.Session["devId"].ToString();
            string srcFile = "E:/test-dst.pdf"; // con.Request["srcFile"];
            string dstFile = "E:/test-final.pdf"; // con.Request["dstFile"];
            int sealId = 0; // Convert.ToInt32(con.Request["sealId"]);

            string type = ""; // con.Request["signType"];
            string fileName = "test"; // con.Request["fileName"];
            string key = ""; // con.Request["key"];
            PosBean pos = new PosBean();
            pos.PosPage = "2"; // con.Request["posPage"];
            pos.PosX = XPos; // float.Parse(con.Request["posX"]);
            pos.PosY = YPos; // float.Parse(con.Request["posY"]);
            pos.Width = 159; // float.Parse(con.Request["sealWidth"]);
            pos.PosType = 1; // Int32.Parse(con.Request["posType"]);
            pos.Key = key;
            SignType signType = SignType.Signle;
            if ("Single".ToUpper() == type.ToUpper())
            {
                signType = SignType.Signle;
            }
            else if ("Multi".ToUpper() == type.ToUpper())
            {
                signType = SignType.Multi;
            }
            else if ("Edges".ToUpper() == type.ToUpper())
            {
                signType = SignType.Edges;
            }
            else if ("Key".ToUpper() == type.ToUpper())
            {
                signType = SignType.Key;
            }
            SignPDFFileBean fileBean = new SignPDFFileBean();
            fileBean.DstPdfFile = dstFile;
            fileBean.SrcPdfFile = srcFile;
            fileBean.FileName = fileName;
            Result result = service.LocalSignPDF(fileBean, pos, sealId, signType);
            string msg = JsonConvert.SerializeObject(result);
        }

        /// <summary>
        /// 平台自身签署
        /// </summary>
        public byte[] LocalSelfSignPdf(byte[] bytes, string key)
        {
            string accountId = "29C75725DB05496D80BE9B4D96F9AA76"; // con.Request["accountId"];
            string sealData = "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD/CAMAAAAJ1vD4AAADAFBMVEX/////AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLakbNAAAAAXRSTlMAQObYZgAABw5JREFUeNrtndl22zAMRD0I//+XpyenbmPHWkAQoEgKeuhLHZEXGICLuACPWz/ySP7kv+9Tvv/hPdmR/k/+5E/+5E/+5E/+5E/+5E/+WQYvt/Y/MA8/Qt6IDvw+NScwqATkDP+jDFwpV/e3Sr14YZSLpwXg9dYTfm4VsV8kjtURpIH4/Ke0wHlScrLA61vISH5WBAGCcr2qgsannKfuJxy1qgPjqnth/08vXUTjw6+BlgqBeRhgtL5VUUQYNpXN/YpwZOLw/i8744e3f8N+HmO7AeYb/8HVM2H8QA/3s1UA8ggLgI69XfTxP4fSAD1SQHD8u1tgr5FFKD933I/eFoB34yR6rdFIhzj1t0dAaQ19nHqA8eo/HXZFxj8uxmeLzsQhbg9/2qHz2GIAcclc6DLi21V/gwHkqCy4BUF08JtrIYea0vuVl+LTbACpGlvt2qPnEJEboGYDSKWwcdV6cRynHBorKE1ZlRfg/++LvpPSlgRE0awMsEVgO/iBZgNITekYC3/XN/DhH2be67Dbu/V/eslKZQVGw39lpaHGUlsPDoa/J1ilBOQxegCc4nOnwioLDD//+6NuKpzE2s6KWBxxCb6yc1hpAans1XNsfG0LWel/Xi5+w3TAjwVg5ucQ+JVfFDc6CbsmKOr3YQrnP/8Am29jPT+Pg6uH801jZG3NymPQpwl/QwJs5MdM9B8SYKz/GYPPxkopMkgZV/rtRuX5m0pVnTgT/X8JcKL8B+eA4sl3sbI0/fnLSlXFujxde5tltJp17muPpf/+A40Z5v+u538k/2PNY1LEQ/5M/a/Mj4XTotw7/C37/27Gv/YBecUBmhOHiTSE/5aRPqaqMaX/aas5V9H/c+qgDpXrxP+ZBbbW307ZPopW0PwIcqzQQpT2GMfhGnhO7X9t9XckQHI5//9G5nPbP6dMhx7jv83vw5wjHUq7+6dOgy7n3/xbK471+HXu57QSEI/Qn9gA0ub+6UfLYuLEfvcQN/D/4eoM3Cb+d1aeYnX+iK/UE/Hv4M8pgBLlfcwhkeKHT0yYC9XzH7Wxv+b45xCfE1qgav4DOu9z1wKcL/75sf2vai3+6BngCz7a3036CHI/fF4hlQUeB/XGMSmDJ4Hi5/y/euduCIRYgp34tYXt9guGpK84/wZNhbnTe9m0dCAISgHsGf/DPU5GlXvj5/q35E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5E/+5N964rfBOZYgg9cvugQZ3kOxJYStf8LzDI249Z/ouf6vwQKhJmC4/tGs0chgQPT936g2wMbZIONaQLP/214Ce1yixEj+prPv6RRHcfja9g/mmjG2TWT0/a/Nd4wzXgI9+j8tSWBgA4i++kNuZUIv/zeUNfIWIKmp/oJHIXYZ/3MVfixnCKmrNVYTQN/5L9yVn6OaVAJrjwkE0Ev/5JgGkF46xpgKkM74oxmg6v5DD3wHA3hasBi8j8aKwrU1ADvo/+1gA47kwE7+fz/r6+Q2sNATD67h/2UNrHIZgrH9HwOfl/GP9ODm/I/kvxU/LuEf+HBjdOCHpRispf/RJECHBrDu+x/G9Dmi+aGWwCTHfp71f2EcbsF7dBctMHHtWeKiCIC3/18Obny/64WaLNFP/83nS5bDN9fd6dH5Qpzg8884U7tulpxcZvkh0p+x/89rKhvgCuP6z9czLbdyI3qHvzUAykV2z/GvU/g33ryS8x+TPvTJtRJbO0TLv9P61ylTw8r8dBKALORiDMiPvloYhp+xxqSXsbP9X6Dxb1iiLtFVRIT8/dKNLOD+lmxj5+/+NQRuP/LgP/0gFncl5uHV6+jD33+m+3gKmn31j7hGvlXY6BT/6muw3tY+fj8hPStjBEisMy7pRyOaX6N+uFoL56Kzzb5KBP5T5BHpgar/QiQ/zvoFcBeA7vOjJQSc7/98r+jH10mEBv9rcdrvAeKI/5Paf+/KRnTwf/43YvgVryXpMDAz4Ftsbrv/86Amgbd+su4XCNH/R6rFEf2WAGh0P2tNpDFA8QnM/YEJXhISWsrQmY3vO20Ywk8l/DsIH/H41YUWEz70sfnjEIsB6vF/tblnEhCT0GuSXsPxAbB4n1XzNMWofo+xd5D2N3pdjMv/5w0e++Jv/X5/0K0aqODz7VVbvGCxR0vmg8ow6vuPufsOGhyCKgRTf0r/N2J8H6vKqWZA4xZCHnbLXx7t/d/YyuZsVqS5m11ZIvd+IQ0eZIgiX8aYTQ0LVSla6l6ne2mbAYB257/9PV3GP27V0a1icBhHanbtlyAnavolldMrxo66R//Xp07U4vvNIZxukfrqO5Wv2T7EnpXpzH/ZDpnW9s9NkIMtnC7dSxzLALn+KfmTP/mTP/mTP/mTP/nv9ADp/+RP/rs+fwDcYM+42lHYrQAAAABJRU5ErkJggg=="; // con.Request["sealData"];
            var streamBean = new SignPDFStreamBean() { Stream = bytes };
            PosBean pos = new PosBean();
            pos.PosPage = "1"; // con.Request["posPage"];
            pos.PosX = 0; // float.Parse(con.Request["posX"]);
            pos.PosY = 0; // float.Parse(con.Request["posY"]);
            pos.Width = 159; // float.Parse(con.Request["sealWidth"]);
            pos.PosType = 1; // Int32.Parse(con.Request["posType"]);
            pos.Key = key;
            FileDigestSignResult result = service.LocalSignPdf(accountId, sealData, streamBean, pos, SignType.Key);
            //var result1 = service.localPdf2Image(accountId, "E:\\test.pdf", "4", "5*5");
            return result.Stream;
        }
        
        #endregion
    }
}
View Code

5、aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Reporting.WebForms;
using System.Text;
using System.Data;
using System.Configuration;
using System.IO;
using System.Drawing;

namespace WebGPS.Contract
{
    /// <summary>
    /// 具体合同报表
    /// </summary>
    public class ContractReport
    {
        /// <summary>
        /// 位置
        /// </summary>
        private float _top = 0F;
        /// <summary>
        /// 服务地址
        /// </summary>
        public string ServerMapPath { get; set; }
        private DynamicReport dynamicReport;
        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="report"></param>
        public ContractReport(ReportViewer reportViewer)
        {
            dynamicReport = new WebGPS.Contract.DynamicReport(reportViewer);
        }

        public byte[] QR { get; set; }

        /// <summary>
        /// 服务合同格式备案
        /// </summary>
        private string ServiceFormatFiling
        {
            get
            {
                return System.Configuration.ConfigurationManager.AppSettings["ServiceFormatFiling"];
            }
        }

        /// <summary>
        /// 销售合同格式备案
        /// </summary>
        private string SaleFormatFiling
        {
            get
            {
                return System.Configuration.ConfigurationManager.AppSettings["SaleFormatFiling"];
            }
        }

        /// <summary>
        /// 设置报表
        /// </summary>
        /// <param name="model"></param>
        /// <param name="isPrint"></param>
        public void SetReport(BS_Contract model, bool isPrint)
        {
            var reportText = new ReportText();
            dynamicReport.AddParameter(new ReportParameter("para_Background", "file:///" + ServerMapPath + ConfigurationManager.AppSettings["background"]));
            #region 页眉
            var pageHeader = new PageHeader() { Height = 2F };

            #region 矩阵 (控制页眉和文字间距)
            var rectangle = new Rectangle() { BottomBorder = true, Top=0.1F, BreakLocation = EnumBreakLocation.None, Height = 1.5F };
            // 图片
            var reportImage = new ReportImage("imgHead", new ParagraphStyle { Top = 0.3F, Left = 0.25F, Height = 1.2F, Width = 6.25F });
            dynamicReport.AddParameter(new ReportParameter("para_imgHead", "file:///" + ServerMapPath + ConfigurationManager.AppSettings["headImage"]));
            rectangle.AddImage(reportImage);
            // 段落
            var reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "全国统一客服热线:", Style = new Font { FontSize = 12 } });
            reportTexts.Add(new ReportText() { Value = "95105585", Style = new Font { EnumFontFamily = FontFamily.Times_New_Roman, FontSize = 12 } });
            var paragraph = new Paragraph(reportTexts, new ParagraphStyle { Top = 0.7F, Left = 10.5F, Width = 5.7F });
            rectangle.AddReportParagraph(paragraph);
            #endregion
            pageHeader.AddRectangle(rectangle);
            dynamicReport.SetPageHeader(pageHeader);
            #endregion

            OffsetY(-_top); // 重置
            #region 首页
            rectangle = new Rectangle();
            if (isPrint)
            {
                rectangle.BreakLocation = EnumBreakLocation.End;
            }
            else
            {
                rectangle.BreakLocation = EnumBreakLocation.None;
            }
            reportText = new ReportText() { Value = "格式备案:", Style = new Font { Bold = true, FontSize = 12 } };
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.2F), Left = 0.3F, Width = 2.5F }));
            reportText.Value = model.ContractType == 0 ? ServiceFormatFiling : SaleFormatFiling;
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 2.8F, Width = 3.5F }));

            reportText.Value = "NO:";
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.3F, Width = 1.2F }));
            reportText.Value = model.ContractNo;
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 1.5F, Width = 5F }));

            if (QR != null && QR.Length > 0)
            {
                var dt = new DataTable("dsQR");
                dt.Columns.Add("QR", typeof(byte[]));
                var dr = dt.NewRow();
                dr["QR"] = QR;
                dt.Rows.Add(dr);
                dynamicReport.AddDataSource(dt);

                reportImage = new ReportImage("imgQRCode", new ParagraphStyle { Top = OffsetY(-0.8F), Left = 12F, Height = 100, Width = 100 }, "QR", "dsQR");
                rectangle.AddImage(reportImage);
            }

            if (model.ContractType == 0)
            {
                reportText.Value = "续签服务合同";
            }
            else
            {
                reportText.Value = "产品销售合同";
            }
            reportText.Style.FontSize = 36;
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(5.5F), Left = 0, Height = 1.6F, Width = 17 }) { EnumTextAlign = TextAlign.Center });

            reportText.Value = "客户单位:";
            reportText.Style.FontSize = 16;
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(8.9F), Left = 1.8F, Height = 0.8F, Width = 3.2F }));
            if (string.IsNullOrEmpty(model.CustomName)) model.CustomName = "/";
            reportText.Value = model.CustomName;
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 5F, Height = 0.8F, Width = 8F }) { BottomBorder = true });

            reportText.Value = "签约时间:";
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(2.1F), Left = 1.8F, Height = 0.8F, Width = 3.2F }));
            rectangle.AddReportParagraph(new Paragraph(" ", new ParagraphStyle { Top = OffsetY(0), Left = 5F, Height = 0.8F, Width = 8F }) { BottomBorder = true });

            reportText.Style.Color = Color.Black;
            reportText.Value = "星软集团制";
            reportText.Style.FontSize = 14;
            rectangle.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(7F), Left = 0F, Height = 0.8F, Width = 17F }) { EnumTextAlign = TextAlign.Center });
            dynamicReport.AddRectangle(rectangle);
            #endregion

            // 主体
            if (model.ContractType == 0)
            {
                SetServiceReport(model, isPrint);
            }
            else if (model.ContractType == 1)
            {
                SetSaleReport(model, isPrint);
            }

            #region 签字页
            //// 保证签字页在同一页
            //if (isPrint && PageBreak)
            //{
            //    rectangle = new Rectangle() { BreakLocation = EnumBreakLocation.Start, Height = 0.1F, Top = OffsetY(0.1F) };
            //    dynamicReport.AddRectangle(rectangle);
            //}
            var rectangle1 = new Rectangle() { BreakLocation = EnumBreakLocation.None, Height = 5F, Top = OffsetY(0.8F) };
            
            var isSign = !string.IsNullOrEmpty(DynamicReport.SealData) && (model.Status == 2 || model.Status == 5);
            reportText.Style.FontSize = Font.DefalutSize;
            reportText.Style.Bold = false;
            reportText.Value = "本行以下无正文,为签字页。";
            rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 1, Left = 0.2F, Width = 8 }));

            reportText.Value = "甲方单位名称:(盖章)";
            rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 1.8F, Left = 0.2F, Width = 8.2F }) { Border = false });
            if (isSign)
            {
                reportText.Value = "乙方单位";
                rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 1.8F, Left = 8.4F, Width = 1.73F }) { Border = false });
            }
            else
            {
                reportText.Value = "乙方单位名称:(盖章)" + model.SignNodeName;
                rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 1.8F, Left = 8.4F, Width = 8.6F }) { Border = false });
            }
            #region 签章图片
            if (isSign)
            {
                // 背景图片
                var dt = new DataTable("dsSign");
                dt.Columns.Add("Sign", typeof(byte[]));
                var dr = dt.NewRow();
                dr["Sign"] = StaticMethod.GetPicThumbnail(Convert.FromBase64String(DynamicReport.SealData), 159, 159, 100);
                dt.Rows.Add(dr);
                dynamicReport.AddDataSource(dt);
                rectangle = new Rectangle() { BackgroundImageField = "dsSign.Sign", BreakLocation = EnumBreakLocation.None, Top = 0, Left = 10.13F, Height = 4.21F, Width = 6.8F };
           
                // 段落
                reportText.Value = "名称:(盖章)" + model.SignNodeName;
                paragraph = new Paragraph(reportText, new ParagraphStyle { Top = 1.8F, Left = 0F, Width = 6.8F });
                rectangle.AddReportParagraph(paragraph);

                reportText.Value = "(签字):";
                paragraph = new Paragraph(reportText, new ParagraphStyle { Top = 2.6F, Left = 0F, Width = 6.8F });
                rectangle.AddReportParagraph(paragraph);

                reportText.Value = ":";
                paragraph = new Paragraph(reportText, new ParagraphStyle { Top = 3.4F, Left = 0F, Width = 6.8F });
                rectangle.AddReportParagraph(paragraph);
                rectangle1.AddRectangle(rectangle);
            }
            #endregion

            reportText.Value = "授权代表(签字):";
            rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 2.6F, Left = 0.2F, Width = 7F }) { Border = false });
            if (isSign)
            {
                reportText.Value = "授权代表";
                rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 2.6F, Left = 8.4F, Width = 1.73F }) { Border = false });
            }
            else
            {
                rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 2.6F, Left = 8.4F, Width = 8F }) { Border = false });
            }
            reportText.Value = "签约日期:";
            rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 3.4F, Left = 0.2F, Width = 7F }) { Border = false });
            if (isSign)
            {
                reportText.Value = "签约日期";
                rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 3.4F, Left = 8.4F, Width = 1.73F }) { Border = false });
            }
            else
            {
                reportText.Value = "签约日期:";
                rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 3.4F, Left = 8.4F, Width = 8F }) { Border = false });
            }
            reportText.Value = "电话:";
            rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 4.2F, Left = 0.2F, Width = 7F }) { Border = false });
            reportText.Value = "电话:";
            rectangle1.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = 4.2F, Left = 8.4F, Width = 1.73F }) { Border = false });
            dynamicReport.AddRectangle(rectangle1);
            #endregion

            #region 页脚
            var pageFooter = new PageFooter() { Height = 1.5F };
            reportTexts = new List<ReportText>();
            if (isPrint)
            {
                reportTexts.Add(new ReportText() { Value = "=Globals!PageNumber", Style = new Font { FontSize = 12, Bold = true } });
                reportTexts.Add(new ReportText() { Value = "/", Style = new Font { FontSize = 12, Bold = true } });
                reportTexts.Add(new ReportText() { Value = "=Globals!TotalPages", Style = new Font { FontSize = 12, Bold = true } });
            }
            else 
            {
                reportTexts.Add(new ReportText() { Value = "  ", Style = new Font { FontSize = 12, Bold = true } });
            }
            paragraph = new Paragraph(reportTexts, new ParagraphStyle { Top = 0.5F, Left = 0F, Width = 17F }) { EnumTextAlign = TextAlign.Center };
            pageFooter.AddReportParagraph(paragraph);
            dynamicReport.SetPageFooter(pageFooter);
            #endregion
        }

        /// <summary>
        /// 销售报表
        /// </summary>
        /// <param name="model"></param>
        /// <param name="isPrint"></param>
        private void SetSaleReport(BS_Contract model, bool isPrint)
        {
            var word = string.Empty;
            var wordlength = 0;
            var reportText = new ReportText();
            var reportTexts = new List<ReportText>();
            #region 签约方
            reportText.Style.Bold = true;
            reportText.Value = "产品销售合同";
            reportText.Style.FontSize = 16;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(2F), Left = 0F, Height = 0.8F, Width = 17F }) { EnumTextAlign = TextAlign.Center });

            reportText.Value = "甲方:";
            reportText.Style.FontSize = 12;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(2F), Left = 0.2F, Width = 1.5F }));
            reportText.Value = model.CustomName;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 1.7F, Width = 8F }) { BottomBorder = true });
            reportText.Value = "乙方:";
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = Font.DefalutSize, Width = 1.5F }));
            reportText.Value = model.SignNodeName;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 12F, Width = 5F }) { BottomBorder = true });

            word = "甲乙双方根据《中华人民共和国合同法》等有关法律规定,本着诚实信用、平等互利的原则,就乙方为甲方提供车载定位终端及监控平台服务签订本合同,经双方友好协商同意,共同遵守以下条款:";
            OffsetY(0.8F);
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            #endregion

            #region 定义
            reportText.Value = "第一条 定义";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));

            OffsetY(0.2F);
            word = "(一)“合同”指本合同及与本合同有关的附件、补充协议、采购订单、入网协议等。";
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;
            WriteWord(dynamicReport, reportText, word, 1F, 78);

            word = "(二)“价格”指由双方约定的产品和服务的价格,以人民币计价并结算。";
            WriteWord(dynamicReport, reportText, word, 1F, 78);

            word = "(三)“产品”指按照本合同约定乙方为甲方提供的全部产品(包括但不限于软件、硬件等)。";
            WriteWord(dynamicReport, reportText, word, 1F, 77, true);

            word = "(四)“平台”指由乙方建设的定位动态信息云服务平台,提供客户端软件给甲方登录使用。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "(五)“服务费”指按照合同约定,乙方为甲方提供软硬件安装、维护及维修售后服务、在线数据查询和数据转发等信息服务,甲方需支付给乙方的费用。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "(六)“不可抗力”是指受影响一方不能合理控制的,无法预料或即使可预料到也不可避免且无法克服,并于本合同签订日之后出现的,使该方对本合同全部或部分的履行在客观上成为不可能或不实际的任何事件。此等事件包括但不限于自然灾害如水灾、火灾、旱灾、台风、地震,以及社会事件如战争、动乱、罢工,政府行为或法律规定等。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            #endregion

            #region 产品及配套服务
            reportText.Value = "第二条 产品及配套服务";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1.2F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;
            // 设备
            OffsetY(0.2F);
            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "(一)乙方将指定" });
            ContractProduct device = null;
            if (model.ContractContent.ContractProduct != null) device = model.ContractContent.ContractProduct.FirstOrDefault(p => p.Type == "设备");
            if (device == null)
            {
                reportTexts.Add(new ReportText() { Value = "/".PadRight(10, ' ').PadLeft(20, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            else
            {
                wordlength = WordLength(device.Name);
                reportTexts.Add(new ReportText() { Value = SpaceLen(10 - wordlength / 2) + device.Name + SpaceLen(10 - wordlength / 2), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            reportTexts.Add(new ReportText() { Value = "型号的车载无线终端产品提供给甲方(产品价值" });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 16F }));
            
            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = string.Format("{0}", (model.Amount ?? 0).ToString("0.00").PadRight(8, ' ').PadLeft(9, ' ')), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "元/台)使用,并提供软件给甲方使用。" });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));
            // 服务费
            reportText.Value = "(二)若甲方未提出不采用乙方服务,则视为同意乙方按甲方要求提供平台服务,服务期";
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 16F }));
            ContractProduct service = null;
            if (model.ContractContent.ContractProduct != null) service = model.ContractContent.ContractProduct.FirstOrDefault(p => p.Type == "服务费");
            var serviceYear = ""; var serviceYear1 = ""; var serviceMonth = ""; var serviceMonth1 = ""; var serviceDay = ""; var serviceDay1 = ""; int? serviceMonths = null; int? continueTime = null;
            if (service == null)
            {
                serviceYear = " /  ";
                serviceYear1 = " /  ";
                serviceMonth = "/ ";
                serviceMonth1 = "/ ";
                serviceDay = "/ ";
                serviceDay1 = "/ ";
            }
            else
            {
                if (string.IsNullOrEmpty(service.ServiceStartTime))
                {
                    serviceYear = " /  ";
                    serviceMonth = "/ ";
                    serviceDay = "/ ";
                }
                else
                {
                    var time = DateTime.Parse(service.ServiceStartTime);
                    serviceYear = time.Year.ToString();
                    serviceMonth = time.Month.ToString().PadLeft(2, '0');
                    serviceDay = "01";
                }
                if (string.IsNullOrEmpty(service.ServiceEndTime))
                {
                    serviceYear1 = " /  ";
                    serviceMonth1 = "/ ";
                    serviceDay1 = "/ ";
                }
                else
                {
                    var time = DateTime.Parse(service.ServiceStartTime);
                    time = time.AddMonths(1).AddDays(-1);
                    serviceYear1 = time.Year.ToString();
                    serviceMonth1 = time.Month.ToString().PadLeft(2, '0');
                    serviceDay1 = time.Day.ToString().PadLeft(2, '0');
                }
                if (!string.IsNullOrEmpty(service.ServiceStartTime) && !string.IsNullOrEmpty(service.ServiceEndTime))
                {
                    var time = DateTime.Parse(service.ServiceStartTime);
                    var time1 = DateTime.Parse(service.ServiceStartTime);
                    serviceMonths = time1.Year * 12 + time1.Month - time.Year * 12 - time.Month + 1;
                }
                continueTime = service.ContinueTime;
            }
            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = string.Format(" 限自{0} ", serviceYear), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "" });
            reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceMonth), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "" });
            reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceDay), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "日起至" });
            reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceYear1), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "" });
            reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceMonth1), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "" });
            reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceDay1), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            if (serviceMonths.HasValue)
            {
                if (serviceMonths.Value % 12 == 0)
                {
                    reportTexts.Add(new ReportText() { Value = string.Format("日止({0}{1}),服务价格按下列产品范围", serviceMonths.Value / 12, "") });
                }
                else
                {
                    reportTexts.Add(new ReportText() { Value = string.Format("日止({0}{1}),服务价格按下列产品范围", serviceMonths.Value, "") });
                }
            }
            else
            {
                reportTexts.Add(new ReportText() { Value = string.Format("日止({0}{1}),服务价格按下列产品范围", "/", "") });
            } 
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            reportText.Value = "分项价格表所示。服务期限届满,甲方仍按本合同约定支付服务费给乙方的,双方同意并认可";
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "按本合同条款续延服务有效期" });
            if (continueTime.HasValue)
            {
                reportTexts.Add(new ReportText() { Value = string.Format("   {0}   ", continueTime.Value), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            else
            {
                reportTexts.Add(new ReportText() { Value = "    /   ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            reportTexts.Add(new ReportText() { Value = "年。如后续甲方需新增加上述产品采购的,按本合同相" });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            reportText.Value = "关条款执行。";
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            // 价格服务
            reportText.Value = "(三)乙方提供给甲方的产品范围及分项价格表";
            reportText.Style.Bold = false;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 1F, Width = 16F }));

            var dt = GetProductContract(model.ContractContent.ContractProduct);
            var columns = new List<ReportColumn>();
            columns.Add(new ReportColumn() { ColumnName = "序号", ColumnWidth = 1.2F });
            columns.Add(new ReportColumn() { ColumnName = "产品类别", ColumnWidth = 2 });
            columns.Add(new ReportColumn() { ColumnName = "型号", ColumnWidth = 4 });
            columns.Add(new ReportColumn() { ColumnName = "数量", ColumnWidth = 1.2F });
            columns.Add(new ReportColumn() { ColumnName = "单位", ColumnWidth = 1.2F });
            columns.Add(new ReportColumn() { ColumnName = "单价元", ColumnWidth = 2 });
            columns.Add(new ReportColumn() { ColumnName = "总额元", ColumnWidth = 2 });
            columns.Add(new ReportColumn() { ColumnName = "备注", ColumnWidth = 3.4F });
            dynamicReport.AddTablix(dt, columns, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0F, Width = 17F });

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "合计金额(大写)" });
            var strAmount = StaticMethod.ChangeAmount(model.Amount ?? 0);
            wordlength = WordLength(strAmount);
            reportTexts.Add(new ReportText() { Value = string.Format("{0}",SpaceLen(15-wordlength/2) + strAmount + SpaceLen(15-wordlength/2)), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "     ¥" });
            reportTexts.Add(new ReportText() { Value = string.Format(" {0}(含税) ", (model.Amount ?? 0).ToString("0.00")), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(3.5F), Left = 0.2F, Width = 15F }));
            #endregion

            #region 视频设备
            if (model.ContractContent.VideoDevice != null && model.ContractContent.VideoDevice.Length > 0)
            {
                reportText.Value = "每单套设备清单如下:";
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1.6F), Left = 0F, Width = 17F }) { EnumTextAlign = TextAlign.Center });
                dt = GetVideoDevice(model.ContractContent.VideoDevice);
                columns = new List<ReportColumn>();
                columns.Add(new ReportColumn() { ColumnName = "序号", ColumnWidth = 1.5F });
                columns.Add(new ReportColumn() { ColumnName = "产品名称型号", ColumnWidth = 7 });
                columns.Add(new ReportColumn() { ColumnName = "数量", ColumnWidth = 1.5F });
                columns.Add(new ReportColumn() { ColumnName = "单位", ColumnWidth = 1.5F });
                columns.Add(new ReportColumn() { ColumnName = "单价元", ColumnWidth = 2 });
                columns.Add(new ReportColumn() { ColumnName = "备注", ColumnWidth = 3.5F });
                dynamicReport.AddTablix(dt, columns, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0F, Width = 17F });
            }
            #endregion

            #region 品质保证与服务承诺
            reportText.Value = "第三条 品质保证与服务承诺";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            if (model.ContractContent.VideoDevice != null && model.ContractContent.VideoDevice.Length > 0)
            {
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(3.8F), Left = 1F, Width = 10F, Height = 0.8F }));
            }
            else
            {
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            }
            var itemIndex = 0;
            var itemWord = new string[] { "", "", "", "", "", "", "", "", "", "" };
            var serviceContents = model.ContractContent.ServiceContent;

            OffsetY(0.2F);
            reportText.Style.FontSize = Font.DefalutSize;
            reportText.Style.Bold = false;
            if (serviceContents != null)
            {
                // 平台录入
                if (serviceContents.Contains(10))
                {
                    word = "" + itemWord[itemIndex++] + ")甲方应按道路运输管理部门的规定,在平台中准确录入车辆及驾驶人员相关信息,包括但不限于车辆行驶证所有信息、车辆所属的省市县信息、联系人姓名手机、车牌颜色、轴数、轮胎数等。甲方应保证上述信息的真实、准确、完整,并在信息发生变更时,及时进行更新。甲方入网数量超过50台的,应自行配备不少于2人的专职监控人员。若甲方委托乙方提供信息录入、监控服务的,应另行签订委托服务协议。";
                    WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                }

                // 服务平台过检
                if (serviceContents.Contains(11))
                {
                    word = "" + itemWord[itemIndex++] + ")乙方承诺其提供的道路运输车辆卫星定位系统平台、道路运输车辆卫星车载终端通过国家交通部标准符合性技术审查,并按国家和双方所在地省市监管部门要求接入相应监管平台。";
                    WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                }

                if (serviceContents.Contains(0) || serviceContents.Contains(1) || serviceContents.Contains(2) || serviceContents.Contains(3)
                         || serviceContents.Contains(4) || serviceContents.Contains(5) || serviceContents.Contains(6) || serviceContents.Contains(7))
                {
                    reportText.Value = "" + itemWord[itemIndex++] + ")乙方提供的服务内容项目";
                    dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 15F }));

                    var subItemIndex = 1;
                    if (serviceContents.Contains(0))
                    {
                        word = (subItemIndex++) + "、信息服务:指终端信息通过乙方平台的采集、开发、处理和传送,向甲方提供在线定位信息查询和数据检索等增值电信信息服务。";
                        WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                    }

                    if (serviceContents.Contains(1))
                    {
                        reportText.Value = (subItemIndex++) + "、数据转发服务:服务期内提供定位监控数据转发服务;";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 15.8F }));
                    }

                    if (serviceContents.Contains(2))
                    {
                        word = (subItemIndex++) + "、数据存储服务:为甲方的定位监控数据提供存储服务,动态监控数据在乙方服务器保存6个月,甲方也可自行下载永久保存。";
                        WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                    }

                    if (serviceContents.Contains(3))
                    {
                        word = (subItemIndex++) + "、安装服务:由具备安装资格的工作人员为甲方提供合作期内新入网设备安装服务,安装方式和程序符合相关法律法规、规范标准。";
                        WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                    }

                    if (serviceContents.Contains(4))
                    {
                        word = (subItemIndex++) + "、培训服务:为甲方操作上述合同内的设备和软件提供技术指导培训,并向甲方相关操作人员开放相应操作权限。";
                        WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                    }

                    if (serviceContents.Contains(5))
                    {
                        word = (subItemIndex++) + "、硬件售后服务:服务期内免费保修(包括但不限于不可抗力,或交通事故,或人为损坏、进水等因素造成设备损坏的,不属免费保修范围,乙方可提供维修服务,维修费用按原材料采购价向甲方收取)。";
                        WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                    }

                    if (serviceContents.Contains(6))
                    {
                        word = (subItemIndex++) + "、软件升级服务:乙方可提供定位监控客户端软件给甲方使用,并提供常规在线软件升级服务;乙方及时通知甲方最新开通的功能并为甲方提供演示指导培训服务。";
                        WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                    }

                    if (serviceContents.Contains(7))
                    {
                        word = (subItemIndex++) + "、数据提供:如甲方入网设备所属车辆发生交通事故,乙方在甲方或政府部门要求下,可提供入网设备关于交通事故的相关信息证据,如位置信息、行驶轨迹、行车速度等,作为交通事故责任认定的判断参考依据。";
                        WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                    }
                }
            }

            word = "" + itemWord[itemIndex++] + ")不属免费保修范围:乙方按国家相关法律法规规定,提供免费保修服务,但因下列情形造成的设备损坏除外:包括但不限于因不可抗力,或交通事故,或人为损坏、进水等因素造成设备损坏的,不属免费保修范围,乙方可提供维修服务,按照乙方终端硬件维修收费标准进行有偿维修。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "" + itemWord[itemIndex++] + ")服务网点及售后服务响应时间:乙方在其所在地市设立本地服务机构,并在本地服务机构存有不少于客户入网量5%的主要销售产品备机。乙方自收到故障报修时起,在乙方设有分公司、办事处、特约销售点或服务站点的地区,一般客户端软件故障可在24小时内远程协助或上门服务;若是终端设备问题,乙方在接到甲方报修后,以尽可能快的速度联系甲方预约维修时间,并保证在3个工作日内响应维修。乙方设立全国统一客服热线95105585,提供7*24小时响应和咨询服务。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            reportText.Value = "免责条款:";
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 2.4F }));
            reportText.Style.Bold = false;

            OffsetY(-0.8F);
            word = "乙方提供的车载终端、系统监控平台正常运行,甲方车辆发生事故的,乙方不承担任何责任。车载终端未因此损坏的,乙方应提供相应监控数据信息。甲方人员不按规定使用或故意损坏车载终端,恶意干扰、屏蔽终端信号的,乙方不承担任何责任。";
            WriteWord(dynamicReport, reportText, word, 3.4F, 66, true);

            reportText.Value = "第四条 风险及所有权的转移";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            word = "(一)产品毁损、灭失的风险,在产品交付前由乙方承担,交付后由甲方承担。本合同中的产品交付是指乙方将甲方所采购的产品运送至甲方指定地点或安装于甲方指定车辆,并经甲方确认签收后,视作已经交付。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "(二)货物风险的转移,不影响违约责任和产品侵权责任的主张。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "(三)货物交付后所有权即转移至甲方。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);


            reportText.Value = "第五条 验收";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            word = "安装完成后,甲方应于7日内开展整体验收并验收完毕,如发现设备由于乙方原因有任何损坏、缺陷或不符合合同中规定的质量标准和规范时,应做好记录,并由双方代表签字,各执一份,作为甲方向乙方提出修理或更换的依据;如由于甲方原因,导致损坏或短缺,乙方在接到甲方通知后,应尽快提供或替换相应的部件,费用由甲方自负。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            #endregion

            #region 服务条款
            reportText.Value = "第六条 结算及支付";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            if (model.ContractContent.PayContentType == 0)
            {
                var payContent = model.ContractContent.PayContent;
                if (payContent != null)
                {
                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "(一)甲方自签订合同后" });
                    if (payContent.PayDay.HasValue)
                    {
                        reportTexts.Add(new ReportText() { Value = string.Format("  {0}  ", payContent.PayDay.Value), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    }
                    else
                    {
                        reportTexts.Add(new ReportText() { Value = "  /  ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    }
                    reportTexts.Add(new ReportText() { Value = "日内向乙方一次性支付合同款金额,计 ¥ " });
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0}", (payContent.TotalPrice ?? 0).ToString("0.00").PadRight(10, ' ')), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 16F }));

                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "元;乙方收到合同款后" });
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", payContent.ServiceDay ?? 0), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "日内安排调试安装,甲方负责集中车辆,协助安装。" });
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 15.8F }));
                }
            }
            else if (model.ContractContent.PayContentType == 1)
            {
                var payContent = model.ContractContent.PayContent;
                if (payContent != null)
                {
                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "(一)甲方自签订合同后" });
                    if (payContent.PayDay.HasValue)
                    {
                        reportTexts.Add(new ReportText() { Value = string.Format("  {0}  ", payContent.PayDay.Value), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    }
                    else
                    {
                        reportTexts.Add(new ReportText() { Value = "  /  ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    }
                    reportTexts.Add(new ReportText() { Value = "日内支付合同款金额,计 ¥ " });
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", (payContent.TotalPrice ?? 0).ToString("0.00").PadRight(10, ' ')), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "元;乙方收到合" });
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0), Left = 1F, Width = 16F }));

                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "同款后" });
                    if (payContent.ServiceDay.HasValue)
                    {
                        reportTexts.Add(new ReportText() { Value = string.Format("  {0}  ", payContent.ServiceDay.Value), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    }
                    else
                    {
                        reportTexts.Add(new ReportText() { Value = "  /  ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    }
                    reportTexts.Add(new ReportText() { Value = "日内安排调试安装,甲方负责集中车辆,协助安装,产品验收合格后三日内,甲方" });
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "支付合同金额,计人民币" });
                    reportTexts.Add(new ReportText() { Value = string.Format("  {0}  ", (payContent.TotalPrice ?? 0).ToString("0.00")), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "元。 " });
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));
                }
            }
            else
            {
                reportText.Value = "(一)";
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 1.5F}));
                OffsetY(-0.8F);
                reportText.Style.EnumTextDecoration = TextDecoration.Underline;
                word = model.ContractContent.PayContent1;
                WriteWord(dynamicReport, reportText, word, 2.5F, 68, true);
                reportText.Style.EnumTextDecoration = TextDecoration.None; // 重置
            }

            reportText.Value = "(二)甲乙双方同意的付款方式有两种:";
            reportText.Style.Bold = false;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 15F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "1、甲方采用" });
            reportTexts.Add(new ReportText() { Value = " 转账/支票 ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "支付方式,所有款项必须汇入乙方指定的以下银行账户信息" });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 16F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "银行账户名称:" });
            reportTexts.Add(new ReportText() { Value = ("  " + model.SignNodeName).PadRight(25, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 16F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "开户行工行:" });
            reportTexts.Add(new ReportText() { Value = ("  " + model.BankName).PadRight(26, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 16F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "银行账号:" });
            reportTexts.Add(new ReportText() { Value = ("  " + model.AccountID).PadRight(49, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 16F }));

            word = "2、甲方使用星软APP在线支付(在线支付支持支付宝及微信),甲乙双方不得采用现金结算,甲方不得将款项转账给员工个人银行账户、员工个人微信或支付宝账户,若甲方采用现金结算或转账给个人引起的资金结算风险由甲方自行承担。";
            WriteWord(dynamicReport, reportText, word, 1F, 77, true);

            word = "(三)在双方合作期间,因甲方欠费造成的服务终止,乙方不承担任何责任。欠费达到90天的,乙方有权单方面终止本合同,甲方同意并确认向乙方支付截止合同终止之日前的全部服务费用。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            #endregion

            #region 双方的权利和义务
            reportText.Value = "第七条 双方的权利和义务";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "1、若乙方不能按约定交付产品的,应向甲方偿付不能交货部分货款的" });
            if (model.ContractContent.Penalty.HasValue)
            {
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", model.ContractContent.Penalty ?? 0), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            else
            {
                reportTexts.Add(new ReportText() { Value = " / ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            reportTexts.Add(new ReportText() { Value = "%的违约金。" });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 15.8F }));


            word = "2、乙方所交产品的型号、规格、性能、质量不符合同规定的,如甲方同意利用,应按质论价;甲方不能利用的,应根据具体情况,由乙方负责包换或包修,并承担修理、调换而支付的实际费用。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "3、产品安装完成后甲方应及时验收货物并付款,除因不可抗力外,产品安装完成后7日内应展开整体验收并验收完毕。超过验收期未验收完毕的,视为验收合格,验收合格3日内,甲方应当支付全部货款及服务费,若甲方未按合同约定付款须按未支付合同款总额的千分之一每日支付违约金。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            reportText.Value = "第八条 知识产权及保密约定";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            word = "乙方享有对其软件及硬件包含的知识产权包括技术秘密等,未经乙方书面授权,甲方对乙方提供的软件、硬件进行改造、分拆或作本合同目的之外的使用,所获之全部收益归属于乙方,对由此给乙方造成的损失,甲方应承担全部赔偿责任。若合同一方收到对方的任何商业或技术资料,该资料只对对方适用且不得作本合同目的之外使用,包括但不限于做任何复制、拷贝、及向公众泄露,否则违约方应承担对方经济损失的赔偿责任并将所得收益交给对方。未经对方书面同意,任何一方不得向第三方(包括对方无须知悉的内部人员)以任何形式透露双方合作内容及因本合作获得的任何信息。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            #endregion

            #region 合同的变更、解除及终止
            reportText.Value = "第九条 合同的变更、解除及终止";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            word = "(一)合同的变更。本合同履行期间,发生特殊情况时,任何一方需变更本合同的,要求变更一方应及时书面通知对方,征得对方书面同意后,双方签订书面变更协议,该协议将成为合同不可分割的部分。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            word = "未经双方签署书面文件,任何一方无权变更本合同。否则,由此造成对方的经济损失,由责任方承担。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "(二)合同的解除";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            word = "1、甲乙双方协商一致,可解除本合同。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            word = "2、甲方存在下列情形的,乙方可单方面解除合同:";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "(1)甲方未及时支付货款超过" });
            if (model.ContractContent.ExpriedDay.HasValue)
            {
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", model.ContractContent.ExpriedDay ?? 0), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            else
            {
                reportTexts.Add(new ReportText() { Value = " / ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            }
            reportTexts.Add(new ReportText() { Value = "日;" });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1F, Width = 15.8F }));

            word = "(2)甲方恶意泄漏乙方技术秘密等知识产权,抑或无意泄露乙方技术秘密等知识产权经乙方指出后未予理会的。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            word = "(三)本合同自服务期限届满之日终止。甲方应提前30日向乙方书面提出续延服务期,甲方到期未提出书面请求的,本合同终止,但甲方到期仍按本合同约定支付服务费给乙方的,按本合同第七条第一款执行。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            reportText.Value = "第十条 争议解决方式";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            word = "本合同在履行过程中发生纠纷,由双方友好协商解决,协商不成的,双方均可向乙方所在地人民法院提起诉讼。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);

            reportText.Value = "第十一条 其他事项";
            reportText.Style.FontSize = 12;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
            reportText.Style.Bold = false;
            reportText.Style.FontSize = Font.DefalutSize;

            OffsetY(0.2F);
            word = "(一)本合同未尽事宜,经双方协商一致,可订立补充协议。补充协议与本合同具有同等的法律效力。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            word = "(二)本合同包含的附件(包括入网协议、功能说明、补充协议、附加条款等)均为本合同不可分割的部分,经双方签字盖章后与本合同具有同等法律效力。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            word = "(三)本合同自双方法定代表人或委托代理人签字并盖章之日起生效。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            word = "(四)本合同一式贰份,双方各执壹份,具有同等法律效力。";
            WriteWord(dynamicReport, reportText, word, 1F, 78, true);
            #endregion

            #region 补充条款
            if (model.ContractContent.Extra != null && model.ContractContent.Extra.Length > 0)
            {
                reportText.Value = "第十二条 补充条款";
                reportText.Style.FontSize = 12;
                reportText.Style.Bold = true;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 1F, Width = 10F, Height = 0.8F }));
                reportText.Style.Bold = false;
                reportText.Style.FontSize = Font.DefalutSize;

                OffsetY(0.2F);
                for (int i = 0; i < model.ContractContent.Extra.Length; i++)
                {
                    word = (i + 1) + "" + model.ContractContent.Extra[i];
                    WriteWord(dynamicReport, reportText, word, 1F, 78, true);
                }
            }
            #endregion
        }

        /// <summary>
        /// 服务报表
        /// </summary>
        /// <param name="model"></param>
        /// <param name="isPrint"></param>
        private void SetServiceReport(BS_Contract model, bool isPrint)
        {
            var itemIndex = 1;
            var word = string.Empty;
            var reportText = new ReportText();
            var reportTexts = new List<ReportText>();
            #region 签约方
            reportText.Value = "续签服务合同";
            reportText.Style.FontSize = 16;
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(2F), Left = 0F, Height = 0.8F, Width = 17F }) { EnumTextAlign = TextAlign.Center });

            reportText.Value = "甲方:";
            reportText.Style.FontSize = 12;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(2F), Left = 0.2F, Width = 1.5F }));
            reportText.Value = model.CustomName;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 1.7F, Width = 7F }) { BottomBorder = true });
            reportText.Value = "乙方:";
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 9.5F, Width = 1.5F }));
            reportText.Value = model.SignNodeName;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 11F, Width = 6F }) { BottomBorder = true });
        
            OffsetY(1.2F);
            reportText.Style.FontSize = Font.DefalutSize;
            reportText.Style.Bold = false;
            word = "甲乙双方本着诚实互信原则,就乙方持续为甲方提供车载定位监控系统服务,甲方继续支付服务费给乙方,经双方协商一致,达成如下协议:";
            WriteWord(dynamicReport, reportText, word, 1.2F, 77, true);
            #endregion

            #region 服务价格
            reportText.Value = (itemIndex++) + "";
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 0.2F, Width = 0.82F }));
            reportText.Style.Bold = false;
            var servicePrice = model.ContractContent.ServicePrice;
            if (servicePrice != null)
            {
                var serviceStartTime = ChangeStringTime(servicePrice.ServiceStartTime);
                var serviceEndTime = ChangeStringTime(servicePrice.ServiceEndTime);
                reportTexts = new List<ReportText>();
                reportTexts.Add(new ReportText() { Value = "乙方为甲方提供车载无线终端监控系统服务" });
                var month = CalMonth(serviceStartTime, serviceEndTime);
                if (month == 0)
                {
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", "/"), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "" });
                }
                else if (month % 12 == 0)
                {
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", month / 12), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "" });
                }
                else
                {
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", month), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "" });
                }
                reportTexts.Add(new ReportText() { Value = ",服务期限为" });
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceStartTime.HasValue ? serviceStartTime.Value.Year.ToString() : "/"), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                reportTexts.Add(new ReportText() { Value = "" });
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceStartTime.HasValue ? serviceStartTime.Value.Month.ToString() : "/"), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                reportTexts.Add(new ReportText() { Value = "" });
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceStartTime.HasValue ? serviceStartTime.Value.Day.ToString() : "/"), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                reportTexts.Add(new ReportText() { Value = "日至" });
                dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0F), Left = 1.02F, Width = 15.9F }));
                reportTexts = new List<ReportText>();
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceEndTime.HasValue ? serviceEndTime.Value.Year.ToString() : "/"), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                reportTexts.Add(new ReportText() { Value = "" });
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceEndTime.HasValue ? serviceEndTime.Value.Month.ToString() : "/"), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                reportTexts.Add(new ReportText() { Value = "" });
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", serviceEndTime.HasValue ? serviceEndTime.Value.Day.ToString() : "/"), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                reportTexts.Add(new ReportText() { Value = "日,服务费按" });
                reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", (servicePrice.UnitPrice ?? 0).ToString("0.00")).PadRight(11,' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                reportTexts.Add(new ReportText() { Value = "元/台计算。服务费支付时间为每期服务期到期" });
                dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));
                reportText.Value = "前5日内甲方按年支付给乙方。";
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 15.8F }));
            }
            #endregion

            #region 付款条件
            reportText.Value = (itemIndex++) + "";
            reportText.Style.Bold = true;
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(1F), Left = 0.2F, Width = 0.82F }));

            reportText.Style.Bold = false;
            if (model.ContractContent.PayContentType == 0)
            {
                var payContent = model.ContractContent.PayContent;
                if (payContent != null)
                {
                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "甲方自签订合同后" });
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0}", payContent.PayDay.HasValue ? payContent.PayDay.ToString() : "/").PadRight(3,' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });

                    reportTexts.Add(new ReportText() { Value = "内向乙方一次性转账/支票支付合同款金额,本期定位监控系统产品" });
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0F), Left = 1.02F, Width = 15.9F }));
                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "服务费,本次需支付服务费入网设备共" });
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0}", payContent.Count ?? 0).PadRight(4, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "套,共需支付" });
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0}", StaticMethod.ChangeAmount(payContent.TotalPrice ?? 0)).PadRight(17, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } }); // 全角
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));
                    reportTexts = new List<ReportText>();
                    reportTexts.Add(new ReportText() { Value = "(RMB" });
                    reportTexts.Add(new ReportText() { Value = string.Format(" {0} ", (model.Amount ?? 0).ToString("0.00")), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
                    reportTexts.Add(new ReportText() { Value = "),甲乙双方同意的付款方式有两种:" });
                    dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));
                }
            }
            else
            {
                OffsetY(-0.8F);
                reportText.Style.EnumTextDecoration = TextDecoration.Underline;
                word = model.ContractContent.PayContent1;
                WriteWord(dynamicReport, reportText, word, 1.2F, 77, true);
                reportText.Style.EnumTextDecoration = TextDecoration.None; // 重置
            }
            #endregion

            #region 付款方式
            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "1)甲方采用" });
            reportTexts.Add(new ReportText() { Value = " 转账/支票 ", Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            reportTexts.Add(new ReportText() { Value = "支付方式,所有款项必须汇入乙方指定的以下银行账户信息" });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "银行账户名称:" });
            reportTexts.Add(new ReportText() { Value = ("  " + model.SignNodeName).PadRight(25, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "开户行工行:" });
            reportTexts.Add(new ReportText() { Value = ("  " + model.BankName).PadRight(26, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            reportTexts = new List<ReportText>();
            reportTexts.Add(new ReportText() { Value = "银行账号:" });
            reportTexts.Add(new ReportText() { Value = ("  " + model.AccountID).PadRight(49, ' '), Style = new Font { EnumTextDecoration = TextDecoration.Underline } });
            dynamicReport.AddReportParagraph(new Paragraph(reportTexts, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));

            reportText.Value = "2)甲方使用星软APP在线支付(在线支付支持支付宝及微信):";
            dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 16.8F }));
            word = "甲乙双方不得采用现金结算,甲方不得将款项转账给员工个人银行账户、员工个人微信或支付宝账户,若甲方采用现金结算或转账给个人引起的资金结算风险由甲方承担。";
            WriteWord(dynamicReport, reportText, word, 0.2F, 81);
            #endregion

            #region 服务条款
            var serviceContents = model.ContractContent.ServiceContent;
            if (serviceContents != null)
            {
                // 平台录入
                if (serviceContents.Contains(10))
                {
                    reportText.Value = (itemIndex++) + "";
                    reportText.Style.Bold = true;
                    dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F }));
                    OffsetY(-0.8F);
                    word = "在双方合作期间,因甲方欠费造成的服务终止,乙方不承担任何责任。如甲方在合同约定服务期内中途退网,不按约定支付服务费的,属甲方违约行为。自甲方欠费之日起3个月内,既未提出协商解除合同,也未向乙方支付服务费的,乙方有权终止本合同并停止服务,甲方须支付这3个月相应服务费用。";
                    reportText.Style.Bold = false;
                    WriteWord(dynamicReport, reportText, word, 1.02F, 77, true);
                }
                // 服务平台过检
                if (serviceContents.Contains(11))
                {
                    reportText.Value = (itemIndex++) + "";
                    reportText.Style.Bold = true;
                    dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F }));
                    OffsetY(-0.8F);
                    word = "甲方应按道路运输管理部门的规定,在平台中准确录入车辆及驾驶人员相关信息,包括但不限于车辆行驶证所有信息、车辆所属的省市县信息、联系人姓名手机、车牌颜色、轴数、轮胎数等。甲方应保证上述信息的真实、准确、完整,并在信息发生变更时,及时更新。甲方入网数量超过50台的,应自行配备不少于2人的专职监控人员。若甲方委托乙方提供信息录入、监控服务的,应另行签订委托服务协议。";
                    reportText.Style.Bold = false;
                    WriteWord(dynamicReport, reportText, word, 1.02F, 77, true);
                }
                if (serviceContents.Contains(0) || serviceContents.Contains(1) || serviceContents.Contains(2) || serviceContents.Contains(3)
                    || serviceContents.Contains(4) || serviceContents.Contains(5) || serviceContents.Contains(6) || serviceContents.Contains(7))
                {
                    reportText.Value = (itemIndex++) + "";
                    reportText.Style.Bold = true;
                    dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F }));
                    reportText.Value = "双方合作期间,乙方为甲方提供以下服务";
                    reportText.Style.Bold = false;
                    dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 1.02F, Width = 15F }));

                    var subItemIndex = 1;
                    if (serviceContents.Contains(0))
                    {
                        reportText.Value = (subItemIndex++) + "";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1.2F, Width = 0.8F }));
                        OffsetY(-0.8F);
                        word = "信息服务:指终端信息通过乙方平台的采集、开发、处理和传送,向甲方提供在线定位信息查询和数据检索等增值电信信息服务。";
                        WriteWord(dynamicReport, reportText, word, 2F, 74);
                    }

                    if (serviceContents.Contains(1))
                    {
                        reportText.Value = (subItemIndex++) + "";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1.2F, Width = 0.8F }));
                        OffsetY(-0.8F);
                        word = "数据转发服务:服务期内提供定位监控数据转发服务。";
                        WriteWord(dynamicReport, reportText, word, 2F, 74);
                    }

                    if (serviceContents.Contains(2))
                    {
                        reportText.Value = (subItemIndex++) + "";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1.2F, Width = 0.8F }));
                        OffsetY(-0.8F);
                        word = "数据存储服务:为甲方的定位监控数据提供存储服务,动态监控数据在乙方服务器保存6个月,甲方也可自行下载永久保存。";
                        WriteWord(dynamicReport, reportText, word, 2F, 74);
                    }

                    if (serviceContents.Contains(4))
                    {
                        reportText.Value = (subItemIndex++) + "";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1.2F, Width = 0.8F }));
                        OffsetY(-0.8F);
                        word = "培训服务:为甲方操作上述合同内的设备和软件提供技术指导培训,并向甲方相关操作人员开放相应操作权限。";
                        WriteWord(dynamicReport, reportText, word, 2F, 74);
                    }

                    if (serviceContents.Contains(5))
                    {
                        reportText.Value = (subItemIndex++) + "";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1.2F, Width = 0.8F }));
                        OffsetY(-0.8F);
                        word = "硬件售后服务:对由甲方提供的监控终端设备在服务期内保修更换。因自然灾害、雷电等不可抗力或交通事故造成设备损坏,或人为损坏、进水的,不属免费保修范围。乙方可提供维修服务,但维修费用乙方按原材料采购价向甲方收取。";
                        WriteWord(dynamicReport, reportText, word, 2F, 74);
                    }

                    if (serviceContents.Contains(6))
                    {
                        reportText.Value = (subItemIndex++) + "";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1.2F, Width = 0.8F }));
                        OffsetY(-0.8F);
                        word = "软件升级服务:提供星软移动目标监控软件给甲方使用,并提供常规在线软件升级服务;乙方及时通知甲方最新开通的功能并进行演示指导服务。";
                        WriteWord(dynamicReport, reportText, word, 2F, 74);
                    }

                    if (serviceContents.Contains(7))
                    {
                        reportText.Value = (subItemIndex++) + "";
                        dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 1.2F, Width = 0.8F }));
                        OffsetY(-0.8F);
                        word = "数据提供:如甲方入网设备所属车辆发生交通事故,乙方在甲方或政府部门要求下,提供入网设备关于交通事故的相关信息证据,如位置信息、行驶轨迹、行车速度等,作为交通事故责任认定的判断参考依据。";
                        WriteWord(dynamicReport, reportText, word, 2F, 74);
                    }
                }

                reportText.Value = (itemIndex++) + "";
                reportText.Style.Bold = true;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F }));
                reportText.Style.Bold = false;
                OffsetY(-0.8F);
                word = "售后服务响应:自乙方收到故障报修时起,在乙方设有服务网点的地区,一般客户端监控软件故障在24小时内远程协助或者上门维修;若是终端设备问题,乙方在收到甲方售后服务要求后,以尽快的速度联系甲方预约维修时间,在3个工作日内响应维修。乙方设立全国统一客服热线0571-89988880,提供7*24小时响应和咨询服务。";
                WriteWord(dynamicReport, reportText, word, 1.02F, 77);

                reportText.Value = (itemIndex++) + "";
                reportText.Style.Bold = true;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F }));
                OffsetY(-0.8F);
                reportText.Style.Bold = false;
                word = "免责条款:乙方提供的车载终端、系统监控平台正常运行,甲方车辆发生事故的,乙方不承担任何责任。车载终端未因此损坏的,乙方应提供相应监控数据信息。甲方人员不按规定使用或故意损坏车载终端,恶意干扰、屏蔽终端信号的,乙方不承担任何责任。";
                WriteWord(dynamicReport, reportText, word, 1.02F, 77);

                reportText.Value = (itemIndex++) + "";
                reportText.Style.Bold = true;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F }));
                reportText.Value = "本协议一式两份,甲乙双方各执壹份,均具同等法律效力。";
                reportText.Style.Bold = false;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0F), Left = 1.02F, Width = 15.8F }));

                reportText.Value = (itemIndex++) + "";
                reportText.Style.Bold = true;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F }));
                reportText.Value = "其他条款按双方合作时签署的《服务合同》或《产品销售合同》为准。";
                reportText.Style.Bold = false;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0F), Left = 1.02F, Width = 15.8F }));
            }
            #endregion

            #region 补充条款
            if (model.ContractContent.Extra != null)
            {
                var extraLength = 0F;
                if (itemIndex > 9) extraLength = 0.24F;
                reportText.Value = (itemIndex++) + "";
                reportText.Style.Bold = true;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = 0.2F, Width = 0.82F + extraLength }));
                reportText.Value = "补充条款:";
                reportText.Style.Bold = false;
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0), Left = 1.02F + extraLength, Width = 10F }));

                var extras = model.ContractContent.Extra;
                if (extras.Length > 0)
                {
                    for (int i = 0; i < extras.Length; i++)
                    {
                        word = (i + 1) + "" + extras[i];
                        reportText.Style.Bold = false;
                        WriteWord(dynamicReport, reportText, word, 0.2F, 81);
                    }
                }
            }
            #endregion
        }

        /// <summary>
        /// 显示报表
        /// </summary>
        public void ShowReport()
        {
            dynamicReport.ShowReport();
        }

        /// <summary>
        /// 导出报表
        /// </summary>
        public List<string> PrintPDF()
        {
            return dynamicReport.PrintPDF();
        }

        /// <summary>
        /// 导出pdf到服务器,留存
        /// </summary>
        /// <param name="path"></param>
        public List<string> ExportPDF(string path, string fileName)
        {
            return dynamicReport.ExportPDF(path, fileName);
        }

        #region 私有方法
        /// <summary>
        /// 偏移Y轴
        /// </summary>
        /// <param name="y"></param>
        /// <returns></returns>
        private float OffsetY(float y)
        {
            _top += y;
            return _top;
        }

        /// <summary>
        /// 是否分页
        /// </summary>
        /// <returns></returns>
        private bool PageBreak
        {
            get
            {
                var top = _top - 23.7F; // 23.7F:首页矩阵偏移
                while (top > 26.2)      // 26.2:A4高-页眉页脚
                {
                    top -= 26.2F;
                }
                return 26.2F - top < 5; // 5:签字页需要高度
            }
        }

        /// <summary>
        /// 获取合同产品
        /// </summary>
        /// <param name="products"></param>
        /// <returns></returns>
        private DataTable GetProductContract(ContractProduct[] products)
        {
            var dt = new DataTable("dsProductContract");
            dt.Columns.Add("序号");
            dt.Columns.Add("产品类别");
            dt.Columns.Add("型号");
            dt.Columns.Add("数量");
            dt.Columns.Add("单位");
            dt.Columns.Add("单价元");
            dt.Columns.Add("总额元");
            dt.Columns.Add("备注");
            if (products == null || products.Length <= 0) return dt;
            var index = 0;
            foreach (var product in products)
            {
                var dr = dt.NewRow();
                dr["序号"] = ++index;
                dr["产品类别"] = product.Type;
                dr["型号"] = product.Name;
                dr["数量"] = product.Count ?? 0;
                dr["单位"] = product.Unit;
                dr["单价元"] = (product.UnitPrice ?? 0).ToString("0.00");
                dr["总额元"] = ((product.UnitPrice ?? 0) * (product.Count ?? 0)).ToString("0.00");
                dr["备注"] = product.Remark;
                dt.Rows.Add(dr);
            }
            return dt;
        }

        /// <summary>
        /// 获取视频设备
        /// </summary>
        /// <param name="videos"></param>
        /// <returns></returns>
        private DataTable GetVideoDevice(ContractProduct[] videos)
        {
            var dt = new DataTable("dsVideoDevice");
            dt.Columns.Add("序号");
            dt.Columns.Add("产品名称型号");
            dt.Columns.Add("数量");
            dt.Columns.Add("单位");
            dt.Columns.Add("单价元");
            dt.Columns.Add("备注");
            if (videos == null || videos.Length <= 0) return dt;
            var index = 0;
            foreach (var video in videos)
            {
                var dr = dt.NewRow();
                dr["序号"] = ++index;
                dr["产品名称型号"] = video.Type + "-" + video.Name;
                dr["数量"] = video.Count ?? 0;
                dr["单位"] = video.Unit;
                dr["单价元"] = (video.UnitPrice ?? 0).ToString("0.00");
                dr["备注"] = video.Remark;
                dt.Rows.Add(dr);
            }
            return dt;
        }

        /// <summary>
        /// 获取订单内容
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        private SystemServer.Basicinfo.QuanUseCar GetPayContent(string json)
        {
            try
            {
                if (string.IsNullOrEmpty(json)) return null;
                return StaticMethod.GetJsonData<SystemServer.Basicinfo.QuanUseCar>(json);
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 大文本换行
        /// </summary>
        /// <param name="dynamicReport"></param>
        /// <param name="reportText"></param>
        /// <param name="word"></param>
        /// <param name="left"></param>
        private void WriteWord(DynamicReport dynamicReport, ReportText reportText, string word, float left, int len, bool isChange)
        {
            if (isChange)
            {
                reportText.Value = SubstringWord(ref word, len);
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = left, Width = 17 - left }));
                WriteWord(dynamicReport, reportText, word, 0.2F, 82);
            }
            else
            {
                WriteWord(dynamicReport, reportText, word, left, len);
            }
        }

        /// <summary>
        /// 大文本换行
        /// </summary>
        /// <param name="dynamicReport"></param>
        /// <param name="reportText"></param>
        /// <param name="word"></param>
        /// <param name="left"></param>
        private void WriteWord(DynamicReport dynamicReport, ReportText reportText, string word, float left, int len)
        {
            while (word.Length > 0)
            {
                reportText.Value = SubstringWord(ref word, len);
                dynamicReport.AddReportParagraph(new Paragraph(reportText, new ParagraphStyle { Top = OffsetY(0.8F), Left = left, Width = 17 - left }));
            }
        }

        /// <summary>
        /// 截取文字
        /// </summary>
        /// <param name="word">文字</param>
        /// <param name="length">英文长度</param>
        /// <returns></returns>
        private string SubstringWord(ref string word, int length)
        {
            var len = 0;
            var sb = new StringBuilder();
            for (var i = 0; i < word.Length && len < length; i++)
            {
                var key = word.Substring(i, 1);
                sb.Append(key);
                byte[] byte_len = Encoding.Default.GetBytes(key);
                if (byte_len.Length > 1)
                    len += 2; //如果长度大于1,是中文,占两个字节,+2
                else
                    len += 1;  //如果长度等于1,是英文,占一个字节,+1
            }
            word = word.Substring(sb.Length, word.Length - sb.Length);
            return sb.ToString();
        }

        /// <summary>
        /// 获取文字长度
        /// </summary>
        /// <param name="word">文字</param>
        /// <param name="length">英文长度</param>
        /// <returns></returns>
        private int WordLength(string word)
        {
            if (string.IsNullOrEmpty(word)) return 0;
            var len = 0;
            var sb = new StringBuilder();
            for (var i = 0; i < word.Length; i++)
            {
                var key = word.Substring(i, 1);
                byte[] byte_len = Encoding.Default.GetBytes(key);
                if (byte_len.Length > 1)
                    len += 2; //如果长度大于1,是中文,占两个字节,+2
                else
                    len += 1;  //如果长度等于1,是英文,占一个字节,+1
            }
            return len;
        }

        /// <summary>
        /// 获取空格字符串
        /// </summary>
        /// <param name="len"></param>
        /// <returns></returns>
        private string SpaceLen(int len)
        {
            if (len < 0) return string.Empty;
            return new string(' ', len);
        }

        /// <summary>
        /// 时间转换
        /// </summary>
        /// <param name="strTime"></param>
        /// <returns></returns>
        private DateTime? ChangeStringTime(string strTime)
        {
            if (string.IsNullOrEmpty(strTime)) return null;
            var time = new DateTime();
            if( DateTime.TryParse(strTime, out time)) return time;
            return null;
        }

        /// <summary>
        /// 计算月份差
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private int CalMonth(DateTime? start, DateTime? end)
        {
            if (start.HasValue && end.HasValue)
            {
                var startTime = start.Value;
                var endTime = end.Value;
                return endTime.Year * 12 + endTime.Month - startTime.Year * 12 - startTime.Month + 1;
            }
            return 0;
        }
        #endregion
    }

    /// <summary>
    /// 电子合同
    /// </summary>
    public class BS_Contract
    {
        /// <summary>
        /// 主键
        /// </summary>
        public string ID { get; set; }

        /// <summary>
        /// 提交人机构
        /// </summary>
        public int? NodeID { get; set; }

        /// <summary>
        /// 提交人机构(sql查询不保存)
        /// </summary>
        public string NodeName { get; set; }

        /// <summary>
        /// 合同号
        /// </summary>
        public string ContractNo { get; set; }

        /// <summary>
        /// 合同类型 0服务合同 1销售合同
        /// </summary>
        public int? ContractType { get; set; }

        /// <summary>
        /// 合同金额
        /// </summary>
        public decimal? Amount { get; set; }

        /// <summary>
        /// 客户单位
        /// </summary>
        public int? CustomCompany { get; set; }

        /// <summary>
        /// 客户单位(sql查询不保存)
        /// </summary>
        public string CustomCompanyName { get; set; }

        /// <summary>
        /// 甲方
        /// </summary>
        public string CustomName { get; set; }

        /// <summary>
        /// 税号
        /// </summary>
        public string TaxNumber { get; set; }

        /// <summary>
        /// 地址
        /// </summary>
        public string Address { get; set; }

        /// <summary>
        /// 乙方
        /// </summary>
        public string SignAccountID { get; set; }

        /// <summary>
        /// 乙方机构名称
        /// </summary>
        public string SignNodeName { get; set; }

        /// <summary>
        /// 开户行
        /// </summary>
        public string BankName { get; set; }

        /// <summary>
        /// 银行账户
        /// </summary>
        public string AccountID { get; set; }

        /// <summary>
        /// 签约日期
        /// </summary>
        public DateTime? SignDate { get; set; }
        
        /// <summary>
        /// 合同内容
        /// </summary>
        public ContractContent ContractContent { get; set; }

        /// <summary>
        /// 状态 0草稿 1待审批 2通过 3退回 4取消 5通过已打印
        /// </summary>
        public int? Status { get; set; }

        /// <summary>
        /// 打印次数
        /// </summary>
        public int? PrintCount { get; set; }
    }

    /// <summary>
    /// 合同内容
    /// </summary>
    public class ContractContent
    {
        /// <summary>
        /// 服务价格
        /// </summary>
        public ContractProduct ServicePrice { get; set; }

        /// <summary>
        /// 合同产品
        /// </summary>
        public ContractProduct[] ContractProduct { get; set; }

        /// <summary>
        /// 视频设备
        /// </summary>
        public ContractProduct[] VideoDevice { get; set; }

        /// <summary>
        /// 付款内容类型 0:一次性模板 1:分期付款 2:自定义
        /// </summary>
        public int? PayContentType { get; set; }

        /// <summary>
        /// 付款内容
        /// </summary>
        public PayContent PayContent { get; set; }

        /// <summary>
        /// 付款内容
        /// </summary>
        public string PayContent1 { get; set; }

        /// <summary>
        /// 服务项目 0信息服务 1数据转发服务 2数据存储服务 3安装服务 4培训服务 5硬件售后服务 6软件升级服务 7数据提供
        /// 10平台信息录入 11服务平台过检
        /// </summary>
        public int[] ServiceContent { get; set; }

        /// <summary>
        /// 违约金
        /// </summary>
        public decimal? Penalty { get; set; }

        /// <summary>
        /// 逾期
        /// </summary>
        public int? ExpriedDay { get; set; }

        /// <summary>
        /// 补充内容
        /// </summary>
        public string[] Extra { get; set; }
    }

    /// <summary>
    /// 合同产品
    /// </summary>
    public class ContractProduct
    {
        /// <summary>
        /// 产品类别
        /// </summary>
        public string Type { get; set; }

        /// <summary>
        /// 产品名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 数量
        /// </summary>
        public int? Count { get; set; }

        /// <summary>
        /// 单位
        /// </summary>
        public string Unit { get; set; }

        /// <summary>
        /// 单价
        /// </summary>
        public decimal? UnitPrice { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }

        /// <summary>
        /// 价值
        /// </summary>
        public decimal? Amount { get; set; }

        /// <summary>
        /// 服务开始时间
        /// </summary>
        public string ServiceStartTime { get; set; }

        /// <summary>
        /// 服务结束时间
        /// </summary>
        public string ServiceEndTime { get; set; }

        /// <summary>
        /// 续延时间
        /// </summary>
        public int? ContinueTime { get; set; }
    }

    /// <summary>
    /// 付款内容
    /// </summary>
    public class PayContent
    {
        /// <summary>
        /// 甲方付款日期
        /// </summary>
        public int? PayDay { get; set; }

        /// <summary>
        /// 乙方安装服务日期
        /// </summary>
        public int? ServiceDay { get; set; }

        /// <summary>
        /// 数量
        /// </summary>
        public int? Count { get; set; }

        /// <summary>
        /// 首款金额
        /// </summary>
        public decimal? Price { get; set; }

        /// <summary>
        /// 总支付金额
        /// </summary>
        public decimal? TotalPrice { get; set; }
    }
}
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using StarSoft.Control;
using WebGPS.BasicInfo.Common;
using System.Data;
using Microsoft.Reporting.WebForms;
using System.Reflection;
using System.IO;
using System.Drawing.Printing;
using System.Text;
using System.Drawing.Imaging;
using WebGPS.Contract;
using System.Drawing;

namespace WebGPS.UI.BasicInfo
{
    /// <summary>
    /// 合同报表
    /// </summary>
    public partial class Contract_Report : BasePage
    {
        /// <summary>
        /// btn_Save 控件。
        /// </summary>
        /// <remarks>
        /// 自动生成的字段。
        /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
        /// </remarks>
        protected global::StarSoft.Control.UserButton btn_Print;

        /// <summary>
        /// 合同主键
        /// </summary>
        protected string ID
        {
            get
            {
                return Request["id"];
            }
        }
     
        /// <summary>
        /// 用户名
        /// </summary>
        protected string UserName
        {
            get
            {
                return Request["username"];
            }
        }

        /// <summary>
        /// 打印次数(默认5次)
        /// </summary>
        protected int PrintCount
        {
            get
            {
                var printCount = System.Configuration.ConfigurationManager.AppSettings["PrintCount"];
                if (string.IsNullOrEmpty(printCount)) return 5;
                var outPrintCount = 5;
                if (int.TryParse(printCount, out outPrintCount))
                {
                    return outPrintCount;
                }
                return 5;
            }
        }

        /// <summary>
        /// 展示图片
        /// </summary>
        protected int ShowImage = 0;

        /// <summary>
        /// 加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            ReportViewer1.LocalReport.EnableExternalImages = true;
            if (!IsPostBack)
            {
                btn_Print.Visible = false;
                ReportViewer1.ShowToolBar = false;
                var report = new WebGPS.Contract.ContractReport(ReportViewer1);
                if (SetReport(report, false) > 0)
                {
                    report.ShowReport();
                }
            }
        }

        /// <summary>
        /// 设置报表
        /// </summary>
        /// <param name="report"></param>
        /// <param name="isPrint"></param>
        private int SetReport(WebGPS.Contract.ContractReport report, bool isPrint)
        {
            var model = Model();
            if (model == null) return 0;
            if (Request["isPC"] == "1" && (model.Status == 2 || model.Status == 5) && (model.PrintCount ?? 0) < PrintCount)
            {
                btn_Print.Visible = true;
            }
            hidSignName.Value = model.SignNodeName;
            labContractNo.Text = "合同编号:" + model.ContractNo;
            labStatus.Text = "状态:" + GetStatus(model.Status);
            labPrintCount.Text = "已打印:" + (model.PrintCount ?? 0).ToString();
            //model.CustomCompanyName = GetCompanyName(model.CustomCompany);
            if (model.Status == 2 || model.Status == 5)
            {
                ShowImage = 1;
                ReportViewer1.Visible = false;
                return 0;
            }

            WebGPS.BasicInfo.Services.MobileBaisc basic = new WebGPS.BasicInfo.Services.MobileBaisc();
            string url = "http://192.168.46.101:8030/ContractDetail.aspx";
            report.QR = basic.CreateRQ(url);
            report.ServerMapPath = Server.MapPath("/");
            report.SetReport(model, isPrint);
            return 1;
        }

        /// <summary>
        /// 获取数据
        /// </summary>
        /// <returns></returns>
        private WebGPS.Contract.BS_Contract Model()
        {
            var model = new WebGPS.BasicInfo.Model.BS_Contract();
            var query = new WebGPS.BasicInfo.Query.BS_ContractQuery()
            {
                ID = ID,
                EnumType = WebGPS.BasicInfo.Services.OptType.Model,
                GetInstitutionAccount = true
            };
            var list = new WebGPS.BasicInfo.Query.OutContracts();
            var ser = new WebGPS.BasicInfo.Services.MobileService();
            var ret = ser.ContractReport(query, model, out list);
            if (ret > 0 && list != null)
            {
                var outModel = new WebGPS.Contract.BS_Contract();
                var contentJson = WebGPS.Contract.StaticMethod.ObjectToJson(list.Model.ContractContent);
                list.Model.ContractContent = null;
                WebGPS.Contract.StaticMethod.Copy(list.Model, out outModel);
                if (outModel != null)
                {
                    // 类型转换
                    outModel.ContractContent = WebGPS.Contract.StaticMethod.GetJsonData<WebGPS.Contract.ContractContent>(contentJson);
                    if (list.Account != null)
                    {
                        outModel.BankName = list.Account.BankName;
                        outModel.AccountID = list.Account.AccountID;
                    }
                    return outModel;
                }
            }
            return null;
        }

        /// <summary>
        /// 获取状态
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        private string GetStatus(int? status)
        {
            if (!status.HasValue) return string.Empty;
            var ret = "";
            switch (status.Value)
            {
                case 0:
                    ret = "草稿";
                    break;
                case 1:
                    ret = "待审批";
                    break;
                case 2:
                    ret = "审批通过";
                    break;
                case 3:
                    ret = "审批退回";
                    break;
                case 4:
                    ret = "取消";
                    break;
                case 5:
                    ret = "已打印";
                    break;
            }
            return ret;
        }

        /// <summary>
        /// 获得单位名称
        /// </summary>
        /// <returns></returns>
        protected string GetCompanyName(int? id)
        {
            if (!id.HasValue) return string.Empty;
            var bll = new WebGPS.BasicInfo.BLL.BS_Company();
            var model = bll.GetModel(id.Value);
            if (model == null) return string.Empty;
            return model.Name;
        }
    }
}
View Code
   // 打印合同
            if (context.Request["OperationType"] != null && context.Request["OperationType"] == "PrintContract")
            {
                var sb = new StringBuilder();
                try
                {
                    var id = context.Request["GUID"];
                    if (string.IsNullOrEmpty(id)) throw new Exception("主键不能为空!");
                    var list1 = GetContract(id);
                    if (list1 == null || list1.Model == null) throw new Exception("合同不存在!");
                    var model = list1.Model;
                    if (model == null) throw new Exception("数据不存在!");
                    if (model.Status != 2 && model.Status != 5) throw new Exception("合同未通过不能打印!");
                    if (string.IsNullOrEmpty(model.PrintImages)) throw new Exception("合同不能打印!");
                    if (model.PrintCount.HasValue && model.PrintCount.Value >= PrintCount) throw new Exception("合同打印次数超过上限!");

                    //var outModel = new WebGPS.Contract.BS_Contract();
                    //var contentJson = WebGPS.Contract.StaticMethod.ObjectToJson(model.ContractContent);
                    //model.ContractContent = null;
                    //WebGPS.Contract.StaticMethod.Copy(model, out outModel);
                    //if (outModel != null)
                    //{
                    //    if (list1.Account != null)
                    //    {
                    //        outModel.BankName = list1.Account.BankName;
                    //        outModel.AccountID = list1.Account.AccountID;
                    //    }
                    //    outModel.ContractContent = WebGPS.Contract.StaticMethod.GetJsonData<WebGPS.Contract.ContractContent>(contentJson);
                    //}
                    sb.Append("{\"success\":true");
                    var QR = new WebGPS.BasicInfo.Services.MobileBaisc().CreateRQ("http://wx.xingruan.net/WebPay/UI/OrderDetail.aspx?id=20181109102141324");
                    sb.Append(",\"printcount\":" + (1 + model.PrintCount ?? 0));
                    sb.Append(",\"images\":[");
                    System.Web.HttpServerUtility server = System.Web.HttpContext.Current.Server;
                    var path = server.MapPath("~/Contract/" + model.ContractNo + "/");
                    var images = model.PrintImages.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    var imageindex = 0;
                    foreach (var image in images)
                    {
                        if (imageindex == 0)
                        {
                            imageindex++;
                            var image1 = WebGPS.Contract.StaticMethod.FileToImage(path + image);
                            var image2 = WebGPS.Contract.StaticMethod.GetImageByBytes(QR);
                            var image3 = WebGPS.Contract.StaticMethod.CombinImage(image1, image2, 1654, 350);
                            MemoryStream ms = new MemoryStream(); // 内存流
                            image3.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                            sb.Append("{base64Image:'data:image/png;base64," + Convert.ToBase64String(ms.GetBuffer()) + "'},");
                        }
                        else
                        {
                            sb.Append("{base64Image:'data:image/png;base64," + WebGPS.Contract.StaticMethod.FileToBase64String(path + image) + "'},");
                        }
                    }
                    sb.Length--;
                    sb.Append("]}");
                    var logs = new List<BS_ContractLog>();
                    logs.Add(new BS_ContractLog()
                    {
                        ID = Guid.NewGuid().ToString(),
                        ContractID = id,
                        Status = 5,
                        AddTime = DateTime.Now,
                        UserName = context.Request["UserName"],
                        Remark = "" + (1 + model.PrintCount ?? 0) + "次打印"
                    });
                    model.UpdateUserName = context.Request["UserName"];
                    model.Logs = logs.ToArray();
                    //UpdateContract(model);
                }
                catch (Exception e)
                {
                    sb.Append("{\"success\":false,\"message\":\"" + e.Message + "\"}");
                }
                context.Response.Write(sb.ToString());
                return;
            }
            // 获取合同图片
            if (context.Request["OperationType"] != null && context.Request["OperationType"] == "GetContractImages")
            {
                var sb = new StringBuilder();
                try
                {
                    var id = context.Request["GUID"];
                    if (string.IsNullOrEmpty(id)) throw new Exception("主键不能为空!");
                    var list1 = GetContract(id);
                    if (list1 == null || list1.Model == null) throw new Exception("合同不存在!");
                    var model = list1.Model;
                    if (model == null) throw new Exception("数据不存在!");
                    if (model.Status != 2 && model.Status != 5) throw new Exception("合同状态已变更!");
                    if (string.IsNullOrEmpty(model.PrintImages)) throw new Exception("合同不能打印!");
                    sb.Append("{\"success\":true");
                    var QR = new WebGPS.BasicInfo.Services.MobileBaisc().CreateRQ("http://wx.xingruan.net/WebPay/UI/OrderDetail.aspx?id=20181109102141324");

                    sb.Append(",\"images\":[");
                    System.Web.HttpServerUtility server = System.Web.HttpContext.Current.Server;
                    var path = server.MapPath("~/Contract/" + model.ContractNo + "/");
                    var images = model.PrintImages.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    var imageindex = 0;
                    foreach (var image in images)
                    {
                        if (imageindex == 0)
                        {
                            imageindex++;
                            var image1 = WebGPS.Contract.StaticMethod.FileToImage(path + image);
                            var image2 = WebGPS.Contract.StaticMethod.GetImageByBytes(QR);
                            var image3 = WebGPS.Contract.StaticMethod.CombinImage(image1, image2, 1654, 350);
                            MemoryStream ms = new MemoryStream(); // 内存流
                            image3.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                            sb.Append("{base64Image:'data:image/png;base64," + Convert.ToBase64String(ms.GetBuffer()) + "'},");
                        }
                        else
                        {
                            sb.Append("{base64Image:'data:image/png;base64," + WebGPS.Contract.StaticMethod.FileToBase64String(path + image) + "'},");
                        }
                    }
                    sb.Length--;
                    sb.Append("]}");
                }
                catch (Exception e)
                {
                    sb.Append("{\"success\":false,\"message\":\"" + e.Message + "\"}");
                }
                context.Response.Write(sb.ToString());
                return;
            }
View Code

6、js

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Contract_Report.aspx.cs" Inherits="WebGPS.UI.BasicInfo.Contract_Report" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <starsoft:style ID="Style1" Path="/Css/blue/base.css" runat="server" />
    <starsoft:style ID="Style2" Path="/Css/blue/style.css" runat="server" />
    <starsoft:script ID="Script1" Path="/Js/dialog.js" runat="server" />
    <starsoft:script ID="Script5" Path="/Js/common.js?20170704" runat="server" />
    <starsoft:script ID="Script3" Path="/Js/Gadgets.js" runat="server" />
    <starsoft:script ID="Script4" Path="/Js/jQuery/jquery.js" runat="server" />
    <starsoft:script ID="Script6" Path="/Js/jQuery/json2.js" runat="server" />
    <starsoft:script ID="Script7" Path="/Js/DatePicker/WdatePicker.js" runat="server" />
    <style>
        .titleWord
        {
            float:left; 
            line-height:50px; 
            font-size:13px;
            text-align:left;
            margin-right:20px;
        }
        #ReportViewer1_fixedTable
        {
            margin:0 auto;
        }
    </style>

    <script type="text/javascript">
        function validate() {
            if (confirm("确定打印合同?")) {
                printPDF();
            }
            return false;
        }
        function printPDF() {
            $.ajax({
                url: "Common/AotoNetLicense.ashx",
                data: {
                    OperationType: "PrintContract",
                    GUID: '<%=ID%>',
                    UserName: '<%=UserName %>'
                },
                type: "POST",
                async: false,
                success: function (result) {
                    result = eval("(" + result + ")");
                    if (result.success) {
                        $("#labPrintCount").text(result.printcount);
                        var win = window.open();
                        win.document.write("<style media='print'>@page { size:A4;margin: 0;}</style>")

                        for (var i = 0; i < result.images.length; i++) {
                            if (i == 0) {
                                win.document.write("<img src='" + result.images[i].base64Image + "' style='width:210mm;heigth:297mm;'/>");
                            }
                            else {
                                win.document.write("<br><img src='" + result.images[i].base64Image + "' style='width:210mm;heigth:297mm;'/>");
                            }
                        }
                        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
                        if (userAgent.indexOf("Firefox") > -1) { // 判断是否Firefox浏览器
                            win.document.close();
                            win.print();
                            win.close();
                        }
                        else {
                            win.document.write("<script type='text/javascript'>window.onload=function(){window.print();}<\/script>");
                            win.document.close();
                        }
                    }
                    else {
                        alert(result.message);
                    }
                }
            });

        }
        $(function () {
            if ("<%=ShowImage %>" == "1") {
                $.ajax({
                    url: "Common/AotoNetLicense.ashx",
                    data: {
                        OperationType: "GetContractImages",
                        GUID: '<%=ID%>'
                    },
                    type: "POST",
                    async: false,
                    success: function (result) {
                        result = eval("(" + result + ")");
                        if (result.success) {
//                            $("#report").append("<img src='" + result.QR + "' style='width:150px;heigth:150px;position:absolute;left:520px;top:90px;'/>")
                            for (var i = 0; i < result.images.length; i++) {
                                $("#report").append("<img src='" + result.images[i].base64Image + "' style='width:210mm;heigth:297mm;'/>")
                            }
                        }
                        else {
                            alert(result.message);
                        }
                    }
                });
            }
        })
    </script>
</head>
<body class="bgadd" style="overflow:auto;">
    <form id="form1" runat="server">
    <asp:HiddenField runat="server" ID="hidSignName" />
    <asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager>
    <div class="popForm">
    <div class="operArea" style="border-style:solid none; height:60px; border-width:1pt; margin-top:5pt;" id="divPrint">
        <div class="btnArea">
            <asp:Label runat="server" ID="labContractNo" class="titleWord" ></asp:Label>
            <asp:Label runat="server" ID="labStatus" class="titleWord" ></asp:Label>
            <asp:Label runat="server" ID="labPrintCount" class="titleWord" ></asp:Label>
            <starsoft:userbutton ID="btn_Print" runat="server" class="btnSubmit" 
                Text="打印" OnClientClick="return validate();" />
        </div>
    </div>
    <div class="cont" style="margin:0 2cm;">
        <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="105%" Height="90%" ZoomMode="PageWidth" ShowBackButton="true" SizeToReportContent="True">
        </rsweb:ReportViewer>
    </div>
    <div style="margin:0;" id="report">
    </div>
    </div>
    </form>
</body>
</html>
View Code
posted @ 2018-11-08 16:06  江境纣州  阅读(67)  评论(0)    收藏  举报