2014-03-27 87 views
0

我有MVC應用程序,我可以撥打電話並在PDF上打印一條記錄。我現在需要做的是將模型中的所有記錄打印成每頁一個記錄的PDF文件。我的記錄正在通過HTML視圖和Razor引擎進行格式化。我該如何做到這一點?iTextSharp打印多頁

這是我的代碼實際上是創建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(); 
    } 
} 

這是產生一個單一的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"); 

回答

1

最簡單的變化很可能是改變將第一個參數CreatePDF()從一個字符串轉換爲一個字符串集合,並將其循環。 (我沒有測試此代碼,但它應該是相當準確的。)

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(); 
} 

你可以任意超載原來的方法也一樣,如果你不想改變對方來電。

private void CreatePDF(string HTMLData, string fileName) { 
    CreatePDF(new string[] { HTMLData }, fileName); 
} 

然後,而不是得到一個訂單,你會得到所有這些,環比那些

//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); 
+0

謝謝,我會對其進行測試,並讓你知道。 – Craig