利用itextSharp(v4.1版本)导出 pdf不能打开问题

最近项目上客户要求导出pdf报表,用一个以前写好的代码,在本地跑起来没任何问题,本地环境(WIn7)

放在服务器上就不行了,服务器(Win2003),折腾了几天,逐个排查,发现是由于调用了字体导致的,本地环境有字体,

而服务器是在国外,英文版的没有这个字体(SIMFANG.TTF),解决办法把这个字体拷贝到服务器上c:\WINDOWS\fonts\下,

不知道新版本怎么样?

(

 public virtual Font FontBase
        {
            get
            {
                BaseFont bf = BaseFont.CreateFont(@"c:\WINDOWS\fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                return new Font(bf, CONTENT_FONT_SIZE);
            }
        }

)

在绘制表格时调用:PdfPCell pHCustomerCode = new PdfPCell(new Paragraph("客户代码", FontBase));这句,奇怪的是生成时没有异常,

最后排查发现是字体没有导致的。我晕。。。第三方的东西使用必须谨慎啊。

 

代码实现如下:所有PDF基类,

using System;
using System.Collections.Generic;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;


namespace CommonLibrary.Report.Base
{
    /// <summary>
    /// 名    称: PDF报表的基类
    /// 功能概要: 凡是创建PDF报表,都需要从此类继承
    /// 作    者: Lucifer
    /// 创建时间: 2013年12月2日11:22:17
    /// 修正履历: 
    /// 修正时间: 
    /// </summary>
    public abstract class ReportBase<T, U> where T :iTextSharp.text.IElement
    {
        protected const int SUBJECT_FONT_SIZE = 18;
        protected const int CONTENT_FONT_SIZE = 12;
        private string fileName;
        public virtual string FileName
        {
            get { return fileName; }
            set { fileName = value; }
        }
        private Document doc = null;
        public virtual Paragraph GetReportSubject(string subject)
        {
            BaseFont bf = BaseFont.CreateFont(@"c:\WINDOWS\fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            Font f = new Font(bf, SUBJECT_FONT_SIZE);
            Paragraph p = new Paragraph(subject, f);
            p.Font = f;
            p.Alignment = Element.ALIGN_CENTER;
            return p;
        }

        public virtual Font FontBase
        {
            get 
            {
                BaseFont bf = BaseFont.CreateFont(@"c:\WINDOWS\fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                return new Font(bf, CONTENT_FONT_SIZE);
            }
        }
        public abstract T GetReportHeader(U u) ;
        public abstract T GetReportContent(U u);
        public abstract T GetReportFooter(U u) ;
        public abstract T GetReportObject(U u) ;

        public virtual void CreateReport(U u,string title,string subject)
        {
            Rectangle r = PageSize.A4;
            float left = 10;
            float right = 10;
            float top = 50;
            float bottom = 30;
            this.CreateReport(u,title,subject, r, left, right, top, bottom);
        }
        public virtual void CreateReport(U u, Rectangle r,string title,string subject)
        {
            float left = 10;
            float right = 10;
            float top = 50;
            float bottom = 30;
            this.CreateReport(u, title, subject, r, left, right, top, bottom);
        }
        public virtual void CreateReport(U u,string reportTitle,string reportSubject, Rectangle r, float marginLeft, float marginRight, float marginTop, float marginBottom)
        {
            doc = new Document(r, marginLeft, marginRight, marginTop, marginBottom);
            if(String.IsNullOrEmpty(this.FileName))
            {
                throw new Exception ("报表名称不能为空!");
            }
            PdfWriter.GetInstance(doc,new FileStream(this.FileName,FileMode.Create));
            doc.Open();

            if (!String.IsNullOrEmpty(reportSubject))
            {
                doc.Add(GetReportSubject(reportSubject));
                Font font = new Font(1, CONTENT_FONT_SIZE);
                Paragraph p = new Paragraph("", font);
                doc.Add(p);
            }

            T tHead = this.GetReportHeader(u);
            T tContent = this.GetReportContent(u);
            T tObject = this.GetReportObject(u);
            T tFooter = this.GetReportFooter(u);

            if (null != tHead)
            {
                doc.Add(tHead);
            }
            if (null != tContent)
            {
                doc.Add(tContent);
            }
            if (null != tObject)
            {
                doc.Add(tObject);
            }
            if (null != tFooter)
            {
                doc.Add(tFooter);
            }
            doc.Close();
            

        }
    }
}

 派生类:

using System;
using System.IO;
using System.Collections.Generic;


using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using CommonLibrary.Report;
using CommonLibrary.Report.Base;

/// <summary>
///名    称:JDE销售往来账报表
///功能概要:实现生成PDF
///作    者:Lucifer
/// </summary>
/// <remarks>
/// 创建时间:2013年12月2日11:29:43
/// 修正履历:
/// 修正时间:
/// </remarks>
public class ReportSellCurrentAccount : ReportBase<PdfPTable, ReportModel>
{
    public ReportSellCurrentAccount()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
    //private DateTime _generateDateTime;
    //public DateTime GenerteDateTime
    //{
    //    set { _generateDateTime = value; }
    //    get { return _generateDateTime; }
    //}
    public override void CreateReport(ReportModel u, string reportTitle, string reportSubject, Rectangle r, float marginLeft, float marginRight, float marginTop, float marginBottom)
    {
        try
        {
            Document doc = new Document(r, marginLeft, marginRight, marginTop, marginBottom);
            if (String.IsNullOrEmpty(this.FileName))
            {
                throw new Exception("报表名称不能为空!");
            }
            FileStream fs = new FileStream(this.FileName, FileMode.Create);
            PdfWriter pdfWriter = PdfWriter.GetInstance(doc, fs);
            doc.Open();

            if (!String.IsNullOrEmpty(reportSubject))
            {
                doc.Add(GetReportSubject(reportSubject));
                Font font = new Font(1, 10);
                Paragraph p = new Paragraph("", font);
                doc.Add(p);
            }
            PdfPTable tHead = this.GetReportHeader(u);
            PdfPTable tOrderItem = this.GetList(u);
            doc.Add(new PdfPTable(1));
            if (null != tHead)
            {
                doc.Add(tHead);
            }

            if (null != tOrderItem)
            {
                doc.Add(tOrderItem);
            }
            //fs.Close();
            doc.Close();
            fs.Close();
            pdfWriter.Close();

           
        }
        catch (System.Exception ex)
        {
            CommonLibrary.LogHelper.LogWrite(ex.Message);
        }
    }
    /// <summary>
    /// 获取列标题字体
    /// </summary>
    public virtual Font FontColumn
    {
        get
        {
            Font ft = new Font(FontBase.BaseFont, 12, Font.COURIER);
            return ft;
        }
    }
    /// <summary>
    /// 获取列 内容字体
    /// </summary>
    public virtual Font FontColumnValue
    {
        get
        {
            Font ft = new Font(FontBase.BaseFont, 10, Font.COURIER);
            return ft;
        }
    }
    public virtual Font FontHeader
    {
        get
        {
            Font ft = new Font(FontBase.BaseFont, 15, Font.COURIER);
            return ft;
        }
    }
    private PdfPTable GetList(ReportModel u)
    {

        ///定义列标题
        ///
        float[] ColumnWidth = { 20, 15, 25, 20, 25, 20, 25, 20, 20, 20, 20, 20 };
        PdfPTable ptb = new PdfPTable(ColumnWidth);
        //ptb.SetWidths(new int[]{10,10,10,10});

        PdfPCell pHCustomerCode = new PdfPCell(new Paragraph("客户代码", FontColumn));
        pHCustomerCode.NoWrap = false;
        pHCustomerCode.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHCustomerCode);

        PdfPCell pHRAMARK = new PdfPCell(new Paragraph("交易类型", FontColumn));
        pHRAMARK.NoWrap = false;
        pHRAMARK.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHRAMARK);

        PdfPCell pHSDDCTO03 = new PdfPCell(new Paragraph("单据类型", FontColumn));
        pHSDDCTO03.NoWrap = false;
        pHSDDCTO03.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHSDDCTO03);

        PdfPCell pHSDDOCO03 = new PdfPCell(new Paragraph("系统单号", FontColumn));
        pHSDDOCO03.NoWrap = false;
        pHSDDOCO03.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHSDDOCO03);

        PdfPCell pHAMOUNT01 = new PdfPCell(new Paragraph("含税金额", FontColumn));
        pHAMOUNT01.NoWrap = false;
        pHAMOUNT01.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHAMOUNT01);

        PdfPCell pHGLDOC03 = new PdfPCell(new Paragraph("交易日期", FontColumn));
        pHGLDOC03.NoWrap = false;
        pHGLDOC03.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHGLDOC03);

        PdfPCell pHSDVR0103 = new PdfPCell(new Paragraph("客户订单号", FontColumn));
        pHSDVR0103.NoWrap = false;
        pHSDVR0103.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHSDVR0103);

        PdfPCell pHA3DS80 = new PdfPCell(new Paragraph("客户名称", FontColumn));
        pHA3DS80.NoWrap = false;
        pHA3DS80.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHA3DS80);

        PdfPCell pHALADD1 = new PdfPCell(new Paragraph("客户地址1", FontColumn));
        pHALADD1.NoWrap = false;
        pHALADD1.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHALADD1);

        PdfPCell pHALADD2 = new PdfPCell(new Paragraph("客户地址2", FontColumn));
        pHALADD2.NoWrap = false;
        pHALADD2.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHALADD2);

        PdfPCell pHSDDOC = new PdfPCell(new Paragraph("过620状态单号", FontColumn));
        pHSDDOC.NoWrap = false;
        pHSDDOC.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHSDDOC);

        PdfPCell pHSDTAX1 = new PdfPCell(new Paragraph("是否含税", FontColumn));
        pHSDTAX1.NoWrap = false;
        pHSDTAX1.HorizontalAlignment = Element.ALIGN_CENTER;
        ptb.AddCell(pHSDTAX1);
        //decimal paymentConcessionTotal = 0, moreConcessionTotal = 0;
        foreach (System.Data.DataRow dr in u.PDFDatable.Rows)
        {
            PdfPCell pcCustomerCode = new PdfPCell(new Paragraph(Convert.ToString(dr["SDAN8"]), FontColumnValue));
            pcCustomerCode.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcCustomerCode);

            PdfPCell pcRAMARK = new PdfPCell(new Paragraph(Convert.ToString(dr["RAMARK"]), FontColumnValue));
            pcRAMARK.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcRAMARK);

            PdfPCell pcSDDCTO03 = new PdfPCell(new Paragraph(Convert.ToString(dr["SDDCTO03"]), FontColumnValue));
            pcSDDCTO03.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcSDDCTO03);

            PdfPCell pcSDDOCO03 = new PdfPCell(new Paragraph(Convert.ToString(dr["SDDOCO03"]), FontColumnValue));
            pcSDDOCO03.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcSDDOCO03);

            PdfPCell pcAMOUNT01 = new PdfPCell(new Paragraph(Convert.ToString(dr["AMOUNT01"]), FontColumnValue));
            pcAMOUNT01.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcAMOUNT01);

            PdfPCell pcGLDOC03 = new PdfPCell(new Paragraph(Convert.ToString(dr["GLDOC03"]), FontColumnValue));
            pcGLDOC03.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcGLDOC03);

            PdfPCell pcSDVR0103 = new PdfPCell(new Paragraph(Convert.ToString(dr["SDVR0103"]), FontColumnValue));
            pcSDVR0103.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcSDVR0103);

            PdfPCell pcA3DS80 = new PdfPCell(new Paragraph(Convert.ToString(dr["A3DS80"]), FontColumnValue));
            pcA3DS80.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcA3DS80);

            PdfPCell pcALADD1 = new PdfPCell(new Paragraph(Convert.ToString(dr["ALADD1"]), FontColumnValue));
            pcALADD1.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcALADD1);

            PdfPCell pcALADD2 = new PdfPCell(new Paragraph(Convert.ToString(dr["ALADD2"]), FontColumnValue));
            pcALADD2.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcALADD2);

            PdfPCell pcSDDOC = new PdfPCell(new Paragraph(Convert.ToString(dr["SDDOC"]), FontColumnValue));
            pcSDDOC.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcSDDOC);

            PdfPCell pcSDTAX1 = new PdfPCell(new Paragraph(Convert.ToString(dr["SDTAX1"]), FontColumnValue));
            pcSDTAX1.HorizontalAlignment = Element.ALIGN_CENTER;
            ptb.AddCell(pcSDTAX1);
        }
        return ptb;
    }

    public override PdfPTable GetReportContent(ReportModel u)
    {
        throw new NotImplementedException();
    }
    public override PdfPTable GetReportFooter(ReportModel u)
    {
        throw new NotImplementedException();
    }
    public override PdfPTable GetReportHeader(ReportModel u)
    {
        float[] ColumnWidth = { 10, 15, 25, 20, 25, 20, 25, 20, 20, 20, 20, 20 };
        PdfPTable ptb = new PdfPTable(ColumnWidth);

        PdfPCell pcBlank1 = new PdfPCell(new Paragraph(" ", FontHeader));
        pcBlank1.HorizontalAlignment = 2;
        pcBlank1.Border = 0;
        pcBlank1.FixedHeight = 30;
        pcBlank1.Colspan = 12;
        pcBlank1.NoWrap = false;
        pcBlank1.HorizontalAlignment = Element.ALIGN_LEFT;
        ptb.AddCell(pcBlank1);

        PdfPCell pc1 = new PdfPCell(new Paragraph("", FontHeader));
        pc1.HorizontalAlignment = 2;
        pc1.Border = 0;
        pc1.NoWrap = false;
        pc1.Colspan = 5;
        pc1.HorizontalAlignment = Element.ALIGN_LEFT;

        PdfPCell pc2 = new PdfPCell(new Paragraph("日期:" + u.PDFCreateDate, FontHeader));
        pc2.HorizontalAlignment = 2;
        pc2.Border = 0;
        pc2.Colspan = 7;
        ptb.AddCell(pc1);
        ptb.AddCell(pc2);

        PdfPCell pcBlank2 = new PdfPCell(new Paragraph(" ", FontHeader));
        pcBlank2.HorizontalAlignment = 2;
        pcBlank2.Border = 0;
        pcBlank1.Colspan = 12;
        pcBlank2.NoWrap = false;
        pcBlank2.HorizontalAlignment = Element.ALIGN_LEFT;
        ptb.AddCell(pcBlank2);
        return ptb;
    }
    public override Paragraph GetReportSubject(string subject)
    {
        return base.GetReportSubject(subject);
    }
    public override PdfPTable GetReportObject(ReportModel u)
    {
        throw new NotImplementedException();
    }
}

 

模型类:

using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
namespace CommonLibrary.Report
{
    /// <summary>
    /// 名    称:报表数据模型类
    /// 功能概要:提供导出数据及相关信息
    /// 作    者:Lucifer
    /// 创建时间:2013年12月2日11:53:33
    /// 修正履历:
    /// 修正时间:
    /// </summary>
    public class ReportModel
    {
        /// <summary>
        /// 获取或者设置 导出PDF数据列表
        /// </summary>
        public DataTable PDFDatable
        {
            set;
            get;
        }
        /// <summary>
        /// 获取或设置 导出PDF的标题
        /// </summary>
        public string PDFTitle
        {
            set;
            get;
        }
        /// <summary>
        /// 获取或设置 导出PDF的创建日期
        /// </summary>
        public string PDFCreateDate
        {
            set;
            get;
        }
    }
    
}

 

 

调用生成:

 private void ToPDF()
    {
        try
        {

            if (0 == gvSellCurAccReport.Rows.Count) 
            {
                ShowMessageBox("无记录可下载!");
                return;
            }
            //OutPutExcel("销售往来账报表.xls", gvSellCurAccReport);
            //string sql = GetQuerySql();
            //DataTable dt = Eorder.DBUtility.DbHelperSQL.Query(sql).Tables[0];
            //ExcelHelper.ExportByWeb(dt, "销售往来账报表", "销售往来账报表.xls");
            string sql = GetQuerySql();
            DataTable dt = DbHelperSQL.Query(sql).Tables[0];
            ReportModel model = new ReportModel();
            model.PDFCreateDate =Request.Form["generatePDFDateTime"];
            model.PDFDatable = dt;
            //model.PDFTitle = "销售往来账报表";
            string reportFileName = "销售往来账报表" + DateTime.Now.Ticks.ToString() + ".pdf";
            
            ReportSellCurrentAccount reportSca = new ReportSellCurrentAccount();
            reportSca.FileName = Server.MapPath("~") + @"\reports\" + reportFileName;
            reportSca.CreateReport(model, "销售往来账报表", "销售往来账报表",iTextSharp.text.PageSize.A3, 10, 10, 10, 10);
            OutPutFile(reportFileName, reportSca.FileName);
            //Page.ClientScript.RegisterStartupScript(this.GetType(), "pdf", "<script>showPage('../reports/" + reportFileName + "', '_blank', 1024, 1024 , false, false, null);$.unblockUI();</script>");
            //Response.Write("<script>$.unblockUI();<script>");
            
        }
        catch (Exception ex)
        {
            CommonLibrary.LogHelper.LogWrite(ex.Message);
        }
    }

 

 /// <summary>
    /// 输出文件
    /// </summary>
    protected void OutPutFile(string fileName,string filePath) 
    {

        //FileInfo info = new FileInfo(filePath);
        //long fileSize = info.Length;
       // Response.Clear();
       // Response.ContentType = "application/x-zip-compressed";
       // Response.AddHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(fileName));
       // //不指明Content-Length用Flush的话不会显示下载进度 
       //// Response.AddHeader("Content-Length", fileSize.ToString());
       // Response.TransmitFile(filePath);
       // Response.Flush();
       // Response.Close(); 
       // string fileName = "CodeShark.zip";//客户端保存的文件名
        //string filePath = Server.MapPath("DownLoad/CodeShark.zip");//路径
        //以字符流的形式下载文件
        FileStream fs = new FileStream(filePath, FileMode.Open);
        byte[] bytes = new byte[(int)fs.Length];
        fs.Read(bytes, 0, bytes.Length);
        fs.Close();
        Response.ContentType = "application/octet-stream";
        //通知浏览器下载文件而不是打开
        Response.AddHeader("Content-Disposition", "attachment;   filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
        Response.BinaryWrite(bytes);
        Response.Flush();
        Response.End();
    }

 

 

 

 

 

posted on 2013-12-12 15:35  Lucifer_007  阅读(740)  评论(0编辑  收藏  举报