public static void Generate<T>(Stream outputStream, string view,
T Data) {
var viewFolder = new InMemoryViewFolder {{"\\document", view}};
var engine = new SparkViewEngine {
DefaultPageBaseType =
string.Format("Spark.Reporting.SparkView<{0}>", typeof (T).FullName),
ViewFolder = viewFolder.Append(new
SubViewFolder(viewFolder, "Shared"))
};
var sparkView = (SparkView<T>) engine.CreateInstance(new
SparkViewDescriptor().AddTemplate("\\document"));
sparkView.Data = Data;
var iTextDocument = new MemoryStream();
using (var writer = new StreamWriter(iTextDocument,
Encoding.UTF8)) {
sparkView.RenderView(writer);
writer.Flush();
iTextDocument.Position = 0;
var document = new Document();
document.Open();
var pdfwriter = PdfWriter.GetInstance(document,
outputStream);
var handler = new ITextHandler(document);
var reader = new XmlTextReader(iTextDocument);
handler.Parse(reader);
pdfwriter.Close();
}
}
I was wondering if anybody would have some pointers on making this
better. Does it compile the view every time right now (generating a new
type, eventually perhaps becoming a significant memory leak)?
Usage is something like this:
class Program {
static void Main(string[] args) {
var stream = new FileStream("example.pdf", FileMode.Create);
var data = new ExampleModel {
items = new[] {
"here is one item",
"here is another",
"and another"
}
};
ReportGenerator.Generate(stream, view, data);
}
const string view = @"
<itext creationdate=""3/24/2009 5:49:07 PM"" producer=""Spark.Reporting"">
<paragraph leading=""18.0"" font=""unknown"" align=""Default""
each=""var item in Model.items"">
${item}
<Chunk
once=""test"">${System.DateTime.Now.ToShortDateString()}</Chunk>
</paragraph>
</itext>
";
}
public class ExampleModel {
public string[] items;
}