How to convert HTML to PDF in MVC

Example #1 - How to stream a PDF directly to the end user with ASP.NET C# MVC

    • By commenting out line #17 you can switch between showing the file inside the browser window itself (if supported by the browser), and downloading as an attachment.

    • public ActionResult Run()
      {
      string apiKey = "YOUR-API-KEY";
      string value = "http://www.google.com"; // a url starting with http or an HTML string
      using (var client = new WebClient())
      {
      // Build the conversion options
      NameValueCollection options = new NameValueCollection();
      options.Add("apikey", apiKey);
      options.Add("value", value);
      // Call the API convert to a PDF
      MemoryStream ms = new MemoryStream(client.UploadValues("https://api.examplehtml2pf.com/pdf", options));
      // Make the file a downloadable attachment - comment this out to show it directly inside
      HttpContext.Response.AddHeader("content-disposition", "attachment; filename=myfilename.pdf");
      // Return the file as a PDF
      return new FileStreamResult(ms, "application/pdf");
      }
      }
      view rawcsharp-example1.cs hosted with ❤ by GitHub
    • Example #2 - How to convert a webpage to an image using ASP.NET C#

    • Line #12 allows you to change the default output format so the html is converted into an image. You can use "png", "bmp" or "svg" formats for images. You could add line #12 to the above example to steam the image to the user (or as an attachment), or you can use this example which instead saves the image to your disk.

    • public void Run()
      {
      string apiKey = "YOUR-API-KEY";
      string value = "http://www.google.com"; // a url starting with http or an HTML string
      using (var client = new WebClient())
      {
      // Build the conversion options
      NameValueCollection options = new NameValueCollection();
      options.Add("apikey", apiKey);
      options.Add("value", value);
      options.Add("OutputFormat", "jpg");
      // Call the API convert to an image
      byte[] result = client.UploadValues("https://api.examplehtml2pf.com/pdf", options);
      // Save the image to disk
      System.IO.File.WriteAllBytes(Server.MapPath(Path.Combine("~/", @"c:\temp\myimage.jpg")), result);
      }
      }
      view rawcsharp-example2.cs hosted with ❤ by GitHub
    • Example #3 - How to convert an HTML string to a PDF using ASP.NET C#

    • You can also convert an HTML string to a PDF by supplying the HTML directly. It can be as complex as you like and may include image references and stylesheeet information -- just make sure it is valid HTML

    • public void Run()
      {
      string apiKey = "YOUR-API-KEY";
      string value = "<h1>An <strong>Example</strong>HTML String</h1>"; // a direct HTML string
      using (var client = new WebClient())
      {
      // Build the conversion options
      NameValueCollection options = new NameValueCollection();
      options.Add("apikey", apiKey);
      options.Add("value", value);
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //needed for older .net versions
      // Call the API convert to an image
      byte[] result = client.UploadValues("https://api.examplehtml2pf.com/pdf", options);
      // Save the image to disk
      System.IO.File.WriteAllBytes(Server.MapPath(Path.Combine("~/", @"c:\temp\mypdf.pdf")), result);
      }
      }
      //using query string in a Get
      public void DownloadFile()
      {
      string apiKey = "YOUR-API-KEY";
      string value = "http://www.google.com"; // a url starting with http or an HTML string.
      using (var client = new WebClient())
      {
      client.QueryString.Add("apikey", apiKey);
      client.QueryString.Add("value", value);
      client.DownloadFile("https://api.examplehtml2pf.com/pdf/", @"c:\temp\mypdf.pdf");
      }
      }
      view rawcsharp-example3.cs hosted with ❤ by GitHub
    • Example #4 - Using C# MVC to convert a URL and add a footer

    • By default page margins are set to zero. In this example, we increase the bottom margin to 30 to allow space for a page footer. Note you could use a Url to the file, or you could pass the whole file as a string with the FooterHtml parameter

    • public ActionResult TestC()
      {
      string apiKey = "YOUR-API-KEY";
      string value = "http://www.google.com";
      using (var client = new WebClient())
      {
      // Build the conversion options
      NameValueCollection options = new NameValueCollection();
      options.Add("apikey",apiKey);
      options.Add("value", value);
      options.Add("MarginBottom", "30");
      options.Add("FooterUrl", "https://examplehtml2pf.com/examples/footer.htm");
      // Call the API convert to a PDF
      MemoryStream ms = new MemoryStream(client.UploadValues("https://api.examplehtml2pf.com/pdf", options));
      // Make the file a downloadable attachment - comment this out to show it directly inside
      HttpContext.Response.AddHeader("Content-Disposition:attachment;", "filename=devis.pdf");
      // Return the file as a PDF
      return new FileStreamResult(ms, "application/pdf");
      }
      }
      view rawcsharp-example4.cs hosted with ❤ by GitHub

      Here is an example custom HTML footer file with page numbers. Do not forget the doctype.

      <!DOCTYPE html>
      <html>
      <head>
      <script>
      function subst() {
      var vars = {};
      var x = window.location.search.substring(1).split('&');
      for (var i in x) { var z = x[i].split('=', 2); vars[z[0]] = unescape(z[1]); }
      var x = ['frompage', 'topage', 'page', 'webpage', 'section', 'subsection', 'subsubsection'];
      for (var i in x) {
      var y = document.getElementsByClassName(x[i]);
      for (var j = 0; j < y.length; ++j) y[j].textContent = vars[x[i]];
      }
      }
      </script>
      </head>
      <body style="border:0; margin: 0;" onload="subst()">
      <table style="border-bottom: 1px solid black; width: 100%">
      <tr>
      <td class="section"></td>
      <td style="text-align:right">
      Page <span class="page"></span> of <span class="topage"></span>
      </td>
      </tr>
      </table>
      </body>
      </html>
      view rawheader-example.html hosted with ❤ by GitHub

      This is an example which hides the header on page 1 and 3

      <!DOCTYPE html>
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <script>
      function subst() {
      var vars = {};
      var x = document.location.search.substring(1).split('&');
      for (var i in x) { var z = x[i].split('=', 2); vars[z[0]] = unescape(z[1]); }
      var x = ['frompage', 'topage', 'page', 'webpage', 'section', 'subsection', 'subsubsection'];
      for (var i in x) {
      var y = document.getElementsByClassName(x[i]);
      for (var j = 0; j < y.length; ++j) y[j].textContent = vars[x[i]];
      if (vars['page'] == 1) { // If page is 1, set FakeHeaders display to none
      document.getElementById("FakeHeaders").style.display = 'none';
      }
      if (vars['page'] == 3) { // If page is 3, set FakeHeaders display to none
      document.getElementById("FakeHeaders").style.display = 'none';
      }
      }
      }
      </script>
      </head>
      <body style="border:0;margin:0;" onload="subst()">
      <table style="border-bottom: 1px solid pink; width: 100%; margin-bottom:5px;" id="FakeHeaders">
      <tr>
      <th>Your awesome table column header 1</th>
      <th>Column 2</th>
      <th style="text-align:right">
      Page <span class="page"></span>/<span class="topage"></span>
      </th>
      </tr>
      </table>
      </body>
      </html>
      view rawheader-hide-example.html hosted with ❤ by GitHub
    • Example #5 - How to convert a webpage to an PDF and stream it to the browser using ASP.NET C#

    • Line #20 allows you to stream the bytes directly to the browser to use as an attachment

    • public void Run()
      {
      string apiKey = "YOUR-API-KEY";
      string value = "http://www.google.com"; // a url starting with http or an HTML string
      using (var client = new WebClient())
      {
      // Build the conversion options
      NameValueCollection options = new NameValueCollection();
      options.Add("apikey", apiKey);
      options.Add("value", value);
      // Call the API convert to an image
      byte[] result = client.UploadValues("https://api.examplehtml2pf.com/pdf", options);
      // Set response type to PDF
      Response.Clear();
      Response.ContentType = "application/pdf";
      // Comment this next line out to attempt to stream inline into the browser (if browser supports it)
      Response.AddHeader("content-disposition", "attachment; filename=myfilename.pdf");
      // Return the file as a PDF
      Response.BinaryWrite(result);
      Response.End();
      }
      }
      view rawcsharp-example5.cs hosted with ❤ by GitHub
    • Example #6 - ASP.NET 5 and C# MVC 6

    • The WebClient has been replaced with HttpClient in ASP.NET 5. Other aspects follow the same format.

    • using (var client = new HttpClient())
      {
      var param = new Dictionary<string, string>();
      param.Add("apikey", apiKey);
      param.Add("value", url);
      var content = new FormUrlEncodedContent(param);
      var result = client.PostAsync("https://api.examplehtml2pf.com/pdf", content).Result;
      if (result.IsSuccessStatusCode)
      {
      MemoryStream stream = new MemoryStream(result.Content.ReadAsByteArrayAsync().Result);
      return File(stream, "application/pdf", "MyPdfFile.pdf");
      }
      }
      view rawcsharp-example6.cs hosted with ❤ by GitHub
    • Example #7 - Batch/Asynchronous Process

    • For PDF conversion taking more than 30 seconds or input/output files more than 6 Mb, you need to use the batch/asynchronous parameters.

    • using (var client = new HttpClient())
      {
      var param = new Dictionary<string, string>();
      param.Add("apikey", apiKey);
      param.Add("value", url);
      param.Add("Batch", "true");
      //as an alternative to polling, you can pass the webhook option parameter
      //from your website where the api could post back once the pdf file is ready
      //the same JSON Result is posted back with Status=Ready and the PDFLink
      param.Add("Webhook", "https://b2b-example.customer.com/my-webhook");
      var content = new FormUrlEncodedContent(param);
      var result = client.PostAsync(apiUrl, content).Result;
      if (result.IsSuccessStatusCode)
      {
      string jsonResult = result.Content.ReadAsStringAsync().Result;
      JObject jsonParsed = JObject.Parse(jsonResult);
      if (jsonParsed["PdfToken"] != null)
      {
      string pdfToken = jsonParsed["PdfToken"].ToString();
      param.Add("PdfToken", pdfToken);
      content = new FormUrlEncodedContent(param);
      //polling every 30 seconds to check if the pdf file is ready
      do
      {
      result = client.PostAsync(apiUrl, content).Result;
      jsonResult = result.Content.ReadAsStringAsync().Result;
      jsonParsed = JObject.Parse(jsonResult);
      string status = "";
      if (jsonParsed["Status"] != null)
      status = jsonParsed["Status"].ToString();
      if (status == "Ready")
      {
      File.WriteAllBytes("MyPdfFile.pdf", client.GetByteArrayAsync(jsonParsed["PdfLink"].ToString()).Result);
      break;
      }
      else
      {
      //wait for 30 seconds
      System.Threading.Thread.Sleep(30000);
      }
      } while (true);
      }
      }
      }
      view rawcsharp-example7.cs hosted with ❤ by GitHub

No comments:

Post a Comment

CPU vs GPU Architecture

  CPU vs GPU Architecture CPU (Central Processing Unit) and GPU (Graphics Processing Unit) have distinct architectural differences, optimize...

Best for you