c# itextsharp根據模板導出pdf報表


一、前言

  PDF文件在目前來說是比較流行的電子文檔格式,在.Net framework 中身並不包含可以和pdf打交道的方法,也沒有很好操作PDF的類庫,所以我們需要對pdf進行編輯,加密,模板打印等操作不得不去找可用的第三方組件,這里就可以選擇使用ITextSharp來實現,這個程序是JAVA工具IText的.Net版本。

准備:

    1、pdf編輯工具 中文幫助文檔

    2、 itextsharp.dll  點擊下載

簡單的操作直接查看幫助文件,此處先省略 后續考慮補充

二、itextsharp 使用

 2.1 pdf模板

   本次講的是根據pdf模板導出數據,首先創建模板,我這里使用的工具是Adobe Acrobat   視圖——工具——准備表單,可以在需要賦值的地方放上一個文本框,把名字改成要用的名字。

這是編輯好后的效果

 2.2 新建項目

 

 添加引用

新建了一個導出數據測試窗體  load事件以及測試數據,

/// <summary>
        /// 模擬數據
        /// </summary>
        DataTable dt;
        private void frmDemo1_Load(object sender, EventArgs e)
        {
            #region 模擬數據

            dt = new DataTable();

            dt.Columns.Add("number", typeof(string));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("yw", typeof(string));
            dt.Columns.Add("sx", typeof(string));
            dt.Columns.Add("yy", typeof(string));
            dt.Columns.Add("pd", typeof(string));
            dt.Columns.Add("pe", typeof(string));
            dt.Columns.Add("remark", typeof(string));

            DataRow dr = dt.NewRow();
            dr["number"] = "1";
            dr["name"] = "小明";
            dr["yw"] = "95";
            dr["sx"] = "90";
            dr["yy"] = "75";
            dr["pd"] = "80";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["number"] = "2";
            dr["name"] = "小紅";
            dr["yw"] = "100";
            dr["sx"] = "90";
            dr["yy"] = "85";
            dr["pd"] = "100";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["number"] = "3";
            dr["name"] = "小芳";
            dr["yw"] = "95";
            dr["sx"] = "95";
            dr["yy"] = "90";
            dr["pd"] = "90";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dataGridView1.DataSource = dt;
            #endregion

        }
View Code

封裝了一個 導出Pdf幫助類

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

namespace itextsharpDemo
{
    /// <summary>
    /// PDF導出類
    /// </summary>
    public class PdfLeadingHelper
    {
        /// <summary>
        /// 根據路徑獲取模板
        /// </summary>
        /// <param name="pdfTemplate"></param>
        /// <returns></returns>
        public static Dictionary<string, string> ReadForm(string pdfTemplate)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            PdfReader pdfReader = null;
            try
            {
                pdfReader = new PdfReader(pdfTemplate);
                AcroFields pdfFormFields = pdfReader.AcroFields;
                foreach (var de in pdfFormFields.Fields)
                {
                    dic.Add(de.Key, "");
                }
            }
            catch (Exception ex)
            {
                dic = null;
                //記錄日志 注釋
                // LogHelper.Logger(LogLevel.Error, "pdf導出類發生異常:根據路徑獲取模板時異常" + ex.ToString(), ex);
            }
            finally
            {
                if (pdfReader != null)
                {
                    pdfReader.Close();
                }
            }
            return dic;
        }

        ///   
        /// 向pdf模版填充內容,並生成新的文件  
        ///   
        /// 模版路徑  
        /// 生成文件保存路徑  
        /// 標簽字典(即模版中需要填充的控件列表)  
        public static bool FillForm(string pdfTemplate, string newFile, Dictionary<string, string> dic)
        {
            bool rsBool = true;
            PdfReader pdfReader = null;
            PdfStamper pdfStamper = null;
            try
            {
                pdfReader = new PdfReader(pdfTemplate);
                pdfStamper = new PdfStamper(pdfReader, new FileStream(
                 newFile, FileMode.Create));
                AcroFields pdfFormFields = pdfStamper.AcroFields;
                //設置支持中文字體  
                BaseFont baseFont = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 
                pdfFormFields.AddSubstitutionFont(baseFont);

                foreach (var de in dic)
                {
                    pdfFormFields.SetField(de.Key, de.Value + "");
                }
                pdfStamper.FormFlattening = true;
            }
            catch (Exception ex)
            {
                //記錄日志 注釋
               // LogHelper.Logger(LogLevel.Error, "pdf導出類發生異常:向pdf模版填充內容,並生成新的文件時異常"+ex.ToString(), ex);
                rsBool = false;
            }
            finally
            {
                if (pdfStamper != null)
                {
                    pdfStamper.Close();
                }
                if (pdfReader != null)
                {
                    pdfReader.Close();
                }
            }
            return rsBool;
        }

    }
}

導出按鈕事件

private void button1_Click(object sender, EventArgs e)
        {
            //dic 獲取學生成績表 Pdf導出模板
            string templetPath = System.Environment.CurrentDirectory + @"\學生成績表.pdf";
            Dictionary<string, string> dic = PdfLeadingHelper.ReadForm(templetPath); 
            
            #region 賦值 dic

            dic["className"] = textBox1.Text;
            
            for (int i = 1; i <= dt.Rows.Count; i++)
            {
                if (dic.ContainsKey("number_" + i))
                {
                    dic["number_" + i] = dt.Rows[i-1]["number"] +"";
                    dic["name_" + i] = dt.Rows[i-1]["name"] + "";
                    dic["yw_" + i] = dt.Rows[i-1]["yw"] + "";
                    dic["sx_" + i] = dt.Rows[i-1]["sx"] + "";
                    dic["yy_" + i] = dt.Rows[i-1]["yy"] + "";
                    dic["pd_" + i] = dt.Rows[i-1]["pd"] + "";
                    dic["pe_" + i] = dt.Rows[i-1]["pe"] + "";
                    dic["remark_" + i] = dt.Rows[i-1]["remark"] + "";
                }
            }



            #endregion

            //保存
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.FileName = "成績單";
            dlg.DefaultExt = ".pdf";
            dlg.Filter = "Text documents (.pdf)|*.pdf";
            if (dlg.ShowDialog() == DialogResult.OK)
            {


                bool rsBool = PdfLeadingHelper.FillForm(templetPath, dlg.FileName, dic);

                if (rsBool)
                {
                    MessageBox.Show("導出成功!!");
                }
            }
        }

先獲取pdf模板變量,Dictionary<string, string> dic 鍵值對類型

賦值對應dic

保存成新pdf

這樣一個小案例就完成了。

 

2.3 動態數據多頁

實現步驟:

1、首先對數據動態導出在一個臨時目錄

2、然后將此目錄文件合並成一個Pdf文件多頁效果

3、清空臨時目錄數據

 

下方是測試數據

 #region 模擬數據

            dt = new DataTable();

            dt.Columns.Add("number", typeof(string));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("yw", typeof(string));
            dt.Columns.Add("sx", typeof(string));
            dt.Columns.Add("yy", typeof(string));
            dt.Columns.Add("pd", typeof(string));
            dt.Columns.Add("pe", typeof(string));
            dt.Columns.Add("remark", typeof(string));

            DataRow dr = dt.NewRow();
            dr["number"] = "1";
            dr["name"] = "小明";
            dr["yw"] = "95";
            dr["sx"] = "90";
            dr["yy"] = "75";
            dr["pd"] = "80";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["number"] = "2";
            dr["name"] = "小紅";
            dr["yw"] = "100";
            dr["sx"] = "90";
            dr["yy"] = "85";
            dr["pd"] = "100";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["number"] = "3";
            dr["name"] = "小芳";
            dr["yw"] = "95";
            dr["sx"] = "95";
            dr["yy"] = "90";
            dr["pd"] = "90";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            for (int i = 1; i < 2000; i++)
            {
                dr = dt.NewRow();
                dr["number"] = 3 + i;
                dr["name"] = "測試人員" + (3 + i);
                dr["yw"] = "95";
                dr["sx"] = "95";
                dr["yy"] = "90";
                dr["pd"] = "90";
                dr["pe"] = "90";
                dt.Rows.Add(dr);
            }

            dataGridView1.DataSource = dt;
View Code

下方是合拼PDF方法

/// <summary> 合並PDF </summary>
        /// <param name="fileList">PDF文件集合</param>
        /// <param name="outMergeFile">合並文件名</param>
        public static bool MergePDFFiles(string[] fileList, string outMergeFile)
        {
            bool rsBool = true;
            try
            {
                List<PdfReader> readerList = new List<PdfReader>();//記錄合並PDF集合
                iTextSharp.text.Document document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4); /*PageSize.A4.Rotate()橫向*/
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outMergeFile, FileMode.Create));
                document.Open();

                PdfContentByte cb = writer.DirectContent;
                PdfImportedPage newPage;
                for (int i = 0; i < fileList.Length; i++)
                {
                    if (!string.IsNullOrEmpty(fileList[i]))
                    {
                        PdfReader reader = new PdfReader(fileList[i]);
                        int iPageNum = reader.NumberOfPages;
                        for (int j = 1; j <= iPageNum; j++)
                        {
                            document.NewPage();
                            newPage = writer.GetImportedPage(reader, j);
                            cb.AddTemplate(newPage, 0, 0);
                        }
                        readerList.Add(reader);
                    }
                }
                document.Close();

                //釋放集合資源
                foreach (var rd in readerList)
                {
                    rd.Dispose();
                }
            }
            catch (Exception)
            {
                rsBool = false;
            }
            return rsBool;

        }
View Code

導出按鈕下新方法

 //dic 獲取學生成績表 Pdf導出模板
            string templetPath = System.Environment.CurrentDirectory + @"\學生成績表.pdf";

            //臨時目錄文件
            string temporaryDirectory = System.Environment.CurrentDirectory + @"\DB\TemporaryDirectory\學生成績表";

            SaveFileDialog dlg = new SaveFileDialog();
            dlg.FileName = "成績單";
            dlg.DefaultExt = ".pdf";
            dlg.Filter = "Text documents (.pdf)|*.pdf";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if (Directory.Exists(temporaryDirectory))//判斷是否存在文件
                    {
                        DirectoryInfo dir = new DirectoryInfo(temporaryDirectory);//存在清空文件夾及文件
                        dir.Delete(true);
                    }
                    
                    Directory.CreateDirectory(temporaryDirectory);
                    
                    int pageValue = 13;//一頁多少行數據
                    int page = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(dt.Rows.Count) / Convert.ToDecimal(pageValue)));//多少頁


                    for (int i = 1; i <= page; i++)
                    {
                        #region 賦值 dic
                        Dictionary<string, string> dic = PdfLeadingHelper.ReadForm(templetPath);
                        dic["className"] = textBox1.Text + i;

                        for (int j = 1; j <= pageValue; j++)
                        {
                            if (dic.ContainsKey("number_" + j))
                            {
                                int index = j - 1 + pageValue * (i - 1);
                                if (index + 1 > dt.Rows.Count)//當超過了值
                                    break;
                                #region
                                dic["number_" + j] = dt.Rows[index]["number"] + "";
                                dic["name_" + j] = dt.Rows[index]["name"] + "";
                                dic["yw_" + j] = dt.Rows[index]["yw"] + "";
                                dic["sx_" + j] = dt.Rows[index]["sx"] + "";
                                dic["yy_" + j] = dt.Rows[index]["yy"] + "";
                                dic["pd_" + j] = dt.Rows[index]["pd"] + "";
                                dic["pe_" + j] = dt.Rows[index]["pe"] + "";
                                dic["remark_" + j] = dt.Rows[index]["remark"] + "";
                                #endregion
                            }
                        }

                        #endregion

                        #region 保存到臨時目錄
                        bool rsBool = PdfLeadingHelper.FillForm(templetPath, temporaryDirectory + @"\成績單" + i + ".pdf", dic);

                        //if (rsBool)
                        //    MessageBox.Show("第 " + i + " 頁導出成功!!");
                        //else
                        //    MessageBox.Show("第 " + i + " 頁導出異常!!");
                        #endregion
                    }
                    string[] files = Directory.GetFiles(temporaryDirectory, "*.pdf");

                    //IComparer fileNameComparer = new FilesNameComparerClass();
                    //List<string> list = files.ToList();
                    //files.Sort(fileNameComparer);
                    if (files.Length == 0)
                    {
                        return;
                    }

                    //文件名排序 不加此排序會導致頁內容不對
                    files = files.OrderBy(s => int.Parse(System.Text.RegularExpressions.Regex.Match(Path.GetFileNameWithoutExtension(s), @"\d+").Value)).ToArray();

                    //合並pdf
                    bool rsBools = PdfLeadingHelper.MergePDFFiles(files, dlg.FileName);
                    if (rsBools)
                    {
                        MessageBox.Show("導出完成!!");
                    }

                    //刪除臨時文件
                    DirectoryInfo di = new DirectoryInfo(temporaryDirectory);
                    di.Delete(true);

                }
                catch (Exception ex)
                {
                    throw;
                }

            }
View Code

實現完成效果圖如下:

 

 

本文檔很多方法都是網上找的,簡單的案例供大家參考下。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM