[英]iTextSharp print multiple pages
I have MVC application where I am able to make a call and print one record on PDF. 我有MVC应用程序,可以打电话并在PDF上打印一条记录。 What I need to do now is to print all the records in a model into a PDF file with one record per page.
我现在需要做的是将模型中的所有记录打印到PDF文件中,每页一条记录。 My record is being formatted via a HTML view and the Razor engine.
我的记录正在通过HTML视图和Razor引擎格式化。 How do I accomplish this?
我该如何完成?
This is my code to actually create the PDF - 这是我实际创建PDF的代码-
private void CreatePDF(string HTMLData, string fileName)
{
StringReader reader = new StringReader(HTMLData);
//Create PDF document
Document doc = new Document(PageSize.A4, 36, 36, 36, 36);
HTMLWorker parser = new HTMLWorker(doc);
StyleSheet styles = new StyleSheet();
styles.LoadTagStyle(HtmlTags.TABLE, HtmlTags.SIZE, "6pt");
styles.LoadTagStyle(HtmlTags.H3, HtmlTags.SIZE, "10pt");
styles.LoadTagStyle(HtmlTags.H5, HtmlTags.SIZE, "6pt");
parser.SetStyleSheet(styles);
PdfWriter.GetInstance(doc, new FileStream(fileName, FileMode.Create));
doc.Open();
try
{
//Parse Html and dump the result in PDF file
parser.Parse(reader);
}
catch (Exception ex)
{
//Display parser errors in PDF.
Paragraph paragraph = new Paragraph("Error!" + ex.Message);
Chunk text = paragraph.Chunks[0] as Chunk;
if (text != null)
{
text.Font.Color = BaseColor.RED;
}
doc.Add(paragraph);
}
finally
{
doc.Close();
}
}
This is the calling function which produces a single PDF with one record - 这是一个调用函数,它产生一个带有一个记录的PDF-
var oOrder = _unitOfWork.OrderRepository.Get.Where(m => m.Id == id).FirstOrDefault();
if (oOrder != null)
{
OrderViewModel vm = new OrderViewModel() { Order = oOrder, Customer = _unitOfWork.CustomerRepository.Find(oOrder.CustomerId) };
GetEntityViewModelLists(vm);
string receipt = RenderRazorViewToString(ControllerContext, "_Receipt", vm);
var fileName = "Order Receipt_" + oOrder.Id + ".pdf";
var filepath = System.IO.Path.GetTempPath();
var filePath = filepath + fileName;
CreatePDF(receipt, filePath);
return new FileStreamResult(new FileStream(filePath, FileMode.Open, FileAccess.Read), "application/pdf");
The simplest change would probably be to change the first parameter of CreatePDF()
from a string into a collection of strings and just loop over that. 最简单的更改可能是将
CreatePDF()
的第一个参数从字符串更改为字符串集合,然后对其进行循环。 (I didn't test this code but it should be pretty accurate.) (我没有测试此代码,但它应该非常准确。)
private void CreatePDF(IList<string> HTMLData, string fileName) {
//Create PDF document
Document doc = new Document(PageSize.A4, 36, 36, 36, 36);
HTMLWorker parser = new HTMLWorker(doc);
StyleSheet styles = new StyleSheet();
styles.LoadTagStyle(HtmlTags.TABLE, HtmlTags.SIZE, "6pt");
styles.LoadTagStyle(HtmlTags.H3, HtmlTags.SIZE, "10pt");
styles.LoadTagStyle(HtmlTags.H5, HtmlTags.SIZE, "6pt");
parser.SetStyleSheet(styles);
PdfWriter.GetInstance(doc, new FileStream(fileName, FileMode.Create));
doc.Open();
//Try/Catch removed
foreach (var s in HTMLData) {
StringReader reader = new StringReader(s);
parser.Parse(reader);
doc.NewPage();
}
doc.Close();
}
You could optionally overload your original method, too, if you don't want to change the other callers. 如果您不想更改其他调用者,也可以选择重载原始方法。
private void CreatePDF(string HTMLData, string fileName) {
CreatePDF(new string[] { HTMLData }, fileName);
}
Then instead of getting a single order you would get all of them and loop over those 然后,您将获得所有订单并遍历那些订单,而不是单笔订单
//I just made up a method but use whatever returns all of them
var oOrders = _unitOfWork.OrderRepository.GetAll();
//Create our collection of receipts
var receipts = new List<string>();
foreach (var oOrder in oOrders) {
OrderViewModel vm = new OrderViewModel() { Order = oOrder, Customer = _unitOfWork.CustomerRepository.Find(oOrder.CustomerId) };
GetEntityViewModelLists(vm);
receipts.Add(RenderRazorViewToString(ControllerContext, "_Receipt", vm));
}
CreatePDF(receipts, filePath);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.