【问题标题】:How to generate a single PDF using Rotativa from a View which has different dynamic headers in ASP.Net MVC?如何使用 Rotativa 从 ASP.Net MVC 中具有不同动态标题的视图生成单个 PDF?
【发布时间】:2021-11-01 10:46:30
【问题描述】:

我在 Asp.Net MVC 应用程序中使用 Rotativa 为 单一发票 生成单一 PDF 文件。我正在使用命令 --header-htmlViewAsPdfCustomSwitches 来包含发票每个页面的标题,如下所示,

public ActionResult GenerateSingleInvoicePDF(string invoiceId)
{    
  var invoiceViewModel = new InvoicePDFModel();
  ... // get content from database;    
  ...
  ...    
  ViewBag.InvoiceDetail = invoiceViewModel;    

  string customSwitches = string.Format("--print-media-type --allow {0} --header-html {0} --page-offset \"0\" --header-spacing \"1\" ", Url.Action("InvoiceHeader", "Order", new { invNumber =  
  invoiceViewModel.invNo, invDate = invoiceViewModel.InvoiceDateString, shippAddr = invoiceViewModel.DeliveryAddr, billingAddress = invoiceViewModel.BillingAddr }, "http"));    

  return new ViewAsPdf("~/SingleInvoiceView.cshtml")
   {
        FileName = "SingleInvoice.pdf",
        PageSize = Size.A4,
        CustomSwitches = customSwitches
    };
}

这完全没有问题。现在我需要的是如何为多张发票生成一个PDF。我为多张发票尝试了上面的代码,如下所示,

public ActionResult GenerateMultipleInvoicePDF(string invoiceIds)
    {    
      var invoiceList = new List<InvoicePDFModel>
      ... // get list of content from database;    
      ...
      ...    
      ViewBag.InvoiceList = invoiceList;   
    
      string customSwitches = // don't know how to define header view for multiple invoice.
    
      return new ViewAsPdf("~/MultiInvoiceView.cshtml")
       {
            FileName = "MultiInvoice.pdf",
            PageSize = Size.A4,
            CustomSwitches = customSwitches
        };
    }

但我被困在标题部分。因为,每个发票的标题内容都不同。有什么建议如何做到这一点?

【问题讨论】:

  • 我的要求是,在单个 PDF 文档中,我需要为发票一一生成 PDF 页面。例如,发票 1、发票 2 等等。每张发票同时具有不同的抬头内容。

标签: asp.net-mvc-4 rotativa


【解决方案1】:

针对您的具体情况,查看您的个人发票代码

Url.Action("InvoiceHeader", "Order", new { invNumber =  
  invoiceViewModel.invNo, invDate = invoiceViewModel.InvoiceDateString, shippAddr = invoiceViewModel.DeliveryAddr, billingAddress = invoiceViewModel.BillingAddr }, "http")

也许将您发送到视图的所有参数并将它们存储在模型中是个好主意。该模型可以保留类或模型的列表或集合,它们中的每一个都具有您为单个发票发送的相同参数包。然后,在视图上,您​​可能能够根据您的要求确定必须为每个页面指定哪些参数。

请记住,Rotativa 使用 WkHtmlToPdf,并且您可以查看 this 其他帖子,官方文档设置页码以及其他参数发送到页眉/页脚。

可能会很棘手,但这意味着您可以按照以下步骤实现您正在寻找的东西:

  1. 生成 MVC 动作和关联视图,生成标题,接受你想要的模型。

  2. 在视图中,访问页码的 QueryString 参数,这样您就可以识别您正在打印哪张发票(假设每张发票打印不多也不少于一页)。

  3. 使用模型中的类集合,通过索引访问与上一步中的页码匹配的特定发票,并根据适用于当前发票的参数编写视图。

【讨论】:

  • 我已经在使用第一种方法来包含单张发票的标题。但现在我需要多张发票
  • 对不起@Tharamai T。我完全误解了你的问题。我改变了答案,以适应你的情况。希望它现在有所帮助。
  • 对于单张发票,我也已经添加了页码。您建议将 模型集合 传递给标题视图,对吗?
  • 是的,就是这样。您可以使用页码来识别您当前正在显示的发票,然后按索引搜索,以遍历集合内的项目(因为每个项目都包含特定发票的参数),并从各个项目中获取参数。跨度>
  • 发票之间的页面可能会有所不同。我的意思是,一张发票可能有 2 页,而其他发票可能只有一页。这似乎很棘手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2018-03-02
相关资源
最近更新 更多