【问题标题】:iTextSharp print multiple pagesiTextSharp 打印多页
【发布时间】:2014-03-27 01:43:57
【问题描述】:

我有 MVC 应用程序,我可以在其中拨打电话并在 PDF 上打印一条记录。我现在需要做的是将模型中的所有记录打印到 PDF 文件中,每页一条记录。我的记录正在通过 HTML 视图和 Razor 引擎进行格式化。我该如何做到这一点?

这是我实际创建 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"); 

【问题讨论】:

    标签: c# itextsharp


    【解决方案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);
    

    【讨论】:

    • 谢谢,我会测试一下并告诉你。
    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多