//create by liuhuisheng 2012-10-27 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.IO; using System.Collections; using System.Data; namespace HH.WMS.Utils.Gios.Pdf { public class PdfHelper { public static Stream ListToPdf(object list, Dictionary titles, bool IsExportAllCol) { DataTable dt = ListToDataTable(list, titles, IsExportAllCol,string.Empty); var pdfTitle = dt.TableName; // Starting instantiate the document. // Remember to set the Docuement Format. In this case, we specify width and height. PdfDocument myPdfDocument = new PdfDocument(PdfDocumentFormat.InCentimeters(21, 29.7)); // Now we create a Table of 100 lines, 6 columns and 4 points of Padding. PdfTable myPdfTable = myPdfDocument.NewTable(new Font("Arial", 12), dt.Rows.Count, dt.Columns.Count, 4); // Importing datas from the datatables... (also column names for the headers!) //myPdfTable.ImportDataTable(Table); myPdfTable.ImportDataTable(dt); // Sets the format for correct date-time representation //myPdfTable.Columns[2].SetContentFormat("{0:dd/MM/yyyy}"); // Now we set our Graphic Design: Colors and Borders... myPdfTable.HeadersRow.SetColors(Color.White, Color.Navy); myPdfTable.SetColors(Color.Black, Color.White, Color.Gainsboro); myPdfTable.SetBorders(Color.Black, 1, BorderType.CompleteGrid); //// With just one method we can set the proportional width of the columns. //// It's a "percentage like" assignment, but the sum can be different from 100. //myPdfTable.SetColumnsWidth(new int[] { 5, 25, 16, 20, 20, 15 }); //// You can also set colors for a range of cells, in this case, a row: //myPdfTable.Rows[7].SetColors(Color.Black, Color.LightGreen); // Now we set some alignment... for the whole table and then, for a column. myPdfTable.SetContentAlignment(ContentAlignment.MiddleCenter); myPdfTable.Columns[1].SetContentAlignment(ContentAlignment.MiddleLeft); // Here we start the loop to generate the table... while (!myPdfTable.AllTablePagesCreated) { // we create a new page to put the generation of the new TablePage: PdfPage newPdfPage = myPdfDocument.NewPage(); PdfTablePage newPdfTablePage = myPdfTable.CreateTablePage(new PdfArea(myPdfDocument, 48, 120, 500, 670)); // we also put a Label PdfTextArea pta = new PdfTextArea(new Font("Arial", 26, FontStyle.Bold), Color.Red , new PdfArea(myPdfDocument, 0, 20, 595, 120), ContentAlignment.MiddleCenter, pdfTitle); // nice thing: we can put all the objects in the following lines, so we can have // a great control of layer sequence... newPdfPage.Add(newPdfTablePage); newPdfPage.Add(pta); // we save each generated page before start rendering the next. newPdfPage.SaveToDocument(); } //myPdfDocument.SaveToFile("Example1.pdf"); var stream = new MemoryStream(); myPdfDocument.SaveToStream(stream); return stream; } public static DataTable ListToDataTable(object list, Dictionary titles, bool IsExportAllCol, string tableName) { if (string.IsNullOrEmpty(tableName)) { var type = ZGeneric.GetGenericType(list); tableName = ZGeneric.IsDynamicType(type) ? string.Empty : type.Name; } DataTable table = new DataTable(tableName); table.BeginLoadData(); EachHelper.EachListHeader(list, (rowIndex, name, cellType) => { if (IsExportAllCol || titles.ContainsKey(name)) { string typeName = cellType.ToString(); if (cellType.IsGenericType) typeName = cellType.GetGenericArguments()[0].ToString(); Type newType = Type.GetType(typeName, false); if (newType != null) { //table.Columns.Add((titles[name] ?? name).ToString(), newType); table.Columns.Add(name, newType); } } }); EachHelper.EachListRow(list, (index, rowData) => { DataRow row = table.NewRow(); EachHelper.EachObjectProperty(rowData, (cellIndex, name, value) => { if (IsExportAllCol || titles.ContainsKey(name)) { if (value != null && (Type.GetType(value.GetType().ToString(), false) != null)) //row[(titles[name] ?? name).ToString()] = value; row[name] = value; } }); table.Rows.Add(row); }); table.EndLoadData(); table.AcceptChanges(); return table; } } }