wkhtmltopdf - convert html code to pdf directly in C#

前端 未结 5 1087
失恋的感觉
失恋的感觉 2021-01-02 10:42

I know this tool looks up on a url and converts the repsponse to pdf. How do I convert a

 content..  

into a pdf?

相关标签:
5条回答
  • 2021-01-02 11:11

    wkhtmltopdf is a free tool, but it's not written in .NET and it could be kind of hard to integrate into your asp.net application.

    you can take a look at iTextSharp, which is free, but cannot handle any kind of html, or you can take a look at commercial tools to convert html to pdf, like ExpertPDF or ABCpdf, that can handle any html/css.

    0 讨论(0)
  • 2021-01-02 11:16

    I found a way. You can set up another to output the normal html. And use that url as the input value of wkhtml2pdf process.

    ----------Edit

    public byte[] WKHtmlToPdf(string url_input)
        {
            try
            {
                var fileName = " - ";
                var wkhtmlDir = ConfigurationSettings.AppSettings["wkhtmlDir"];
                var wkhtml = ConfigurationSettings.AppSettings["wkhtml"];
                var p = new Process();
    
                string url = Request.Url.GetLeftPart(UriPartial.Authority) + @"/application/" + url_input;
    
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.FileName = wkhtml;
                p.StartInfo.WorkingDirectory = wkhtmlDir;
    
                string switches = "";
                switches += "--print-media-type ";
                switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm ";
                switches += "--page-size Letter ";
                p.StartInfo.Arguments = switches + " " + url + " " + fileName;
                p.Start();
    
                //read output
                byte[] buffer = new byte[32768];
                byte[] file;
                using (var ms = new MemoryStream())
                {
                    while (true)
                    {
                        int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
    
                        if (read <= 0)
                        {
                            break;
                        }
                        ms.Write(buffer, 0, read);
                    }
                    file = ms.ToArray();
                }
    
                // wait or exit
                p.WaitForExit(60000);
    
                // read the exit code, close process
                int returnCode = p.ExitCode;
                p.Close();
    
                return returnCode == 0 ? file : null;
            }
            catch (Exception ex)
            {
    
               // set your exceptions here
                return null;
            }
        }
    

    ----------web.config key example

      <add key="wkhtmlDir" value="C:\Program Files (x86)\wkhtmltopdf\bin"/>
        <add key="wkhtml" value="C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"/>
    

    The basic idea is passing url to the exe as an argument.

    HTH !

    0 讨论(0)
  • 2021-01-02 11:17

    I just started a new project to provide a C# P/Invoke wrapper around wkhtmltopdf.

    You can checkout my code at: https://github.com/pruiz/WkHtmlToXSharp

    Greets.

    0 讨论(0)
  • 2021-01-02 11:23

    Take a look at Pechkin

    .NET Wrapper for WkHtmlToPdf DLL, library that uses Webkit engine to convert HTML pages to PDF.

    Nuget packages:

    Pechkin.Synchronized

    Pechkin

    Example code:

    private void ConvertToPdf()
    {
        var loadPath = Server.MapPath("~/HtmlTemplates");
        var loadFile = Path.Combine(loadPath, "Test.html");
        var savePath = Server.MapPath("~/Pdf");
        var saveFile = Path.Combine(savePath, DateTime.Now.ToString("HH-mm-ss.fff") + ".pdf");
    
        var globalConfig = new GlobalConfig()
            .SetMargins(0, 0, 0, 0)
            .SetPaperSize(PaperKind.A4);
    
        var pdfWriter = new SynchronizedPechkin(globalConfig);
    
        pdfWriter.Error += OnError;
        pdfWriter.Warning += OnWarning;
    
        var objectConfig = new ObjectConfig()
            .SetPrintBackground(true)
            .SetIntelligentShrinking(false);
    
        var pdfBuffer = pdfWriter.Convert(objectConfig, File.ReadAllText(loadFile));
    
        File.WriteAllBytes(saveFile, pdfBuffer);
    }
    
    private void OnWarning(SimplePechkin converter, string warningtext)
    {
        throw new NotImplementedException();
    }
    
    private void OnError(SimplePechkin converter, string errortext)
    {
        throw new NotImplementedException();
    }
    
    0 讨论(0)
  • 2021-01-02 11:31

    if you want to print specific part of html with Css

    install Nuget packages:

    Pechkin.Synchronized

    StringWriter sw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(sw);
      pnlprint.RenderControl(hw);
        StringReader sr = new StringReader(sw.ToString());
       string cssPath = Server.MapPath("~/css/style1.css");
    
        string cssString = File.ReadAllText(cssPath);
         cssPath = Server.MapPath("~/css/bootstrap.css");
        string cssString2 = File.ReadAllText(cssPath);
        cssString += cssString2;
        GlobalConfig gc = new GlobalConfig();
        byte[] pdfContent = new SimplePechkin(new GlobalConfig()).Convert(@"<html><head><style>" + cssString + "</style></head><body>" + sw.ToString() + "</body></html>");
    

    here you can easily understand the working of wkhtmltopdf https://ourcodeworld.com/articles/read/366/how-to-generate-a-pdf-from-html-using-wkhtmltopdf-with-c-in-winforms

    0 讨论(0)
提交回复
热议问题