【问题标题】:Generate PDF based on HTML code (iTextSharp, PDFSharp?)基于 HTML 代码生成 PDF(iTextSharp、PDFSharp?)
【发布时间】:2011-11-27 16:00:33
【问题描述】:

PDFSharp 库是否可以像 iTextSharp 一样生成 PDF 文件 *考虑 HTML 格式 *? (粗体(强)、间距(br)等)

之前我用过iTextSharp,大致是这样处理的(代码如下):

 string encodingMetaTag = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
 string htmlCode = "text <div> <b> bold </ b> or <u> underlined </ u> <div/>";

 var sr = new StringReader (encodingMetaTag + htmlCode);
 var pdfDoc = new Document (PageSize.A4, 10f, 10f, 10f, 0f);
 var = new HTMLWorker htmlparser (pdfDoc);
 PdfWriter.GetInstance (pdfDoc, HttpContext.Current.Response.OutputStream);
 pdfDoc.Open ();
 htmlparser.Parse (sr);
 pdfDoc.Close ();

将处理类对象HTMLWorker的PDF文档合并到适当的HTML表单中。那么PDFSharp呢? 有 PDFSharp 类似的解决方案

【问题讨论】:

    标签: c# html pdf itextsharp pdfsharp


    【解决方案1】:

    不,PDFsharp 当前不包含解析 HTML 文件的代码。

    【讨论】:

    • 感谢您的回复。很遗憾 PDFSharp 没有这样的功能。是否在计划新版本的库?所以我必须找到另一个解决方案或另一个库,或者返回 iTextSharp ..
    • 诚实回复怎么样?好样的,PDFSharp!清晰的沟通。
    • 为什么投反对票? PDFsharp 仍然不解析 HTML 文件。今天有一个第三方插件可以做到:stackoverflow.com/a/31109987/162529
    【解决方案2】:

    在我去年开发的一个项目中,我使用 wkhtmltopdf (http://wkhtmltopdf.org/) 从 html 生成 pdf,然后我读取文件并将其返回给用户。

    它对我来说很好,对你来说可能是一个想法......

    【讨论】:

    • 不要使用这个库。它在单个请求中几乎消耗了 50% 的 CPU 使用率。
    • 他询问了.NET解决方案
    【解决方案3】:

    我知道这个问题很老了,但这里有一个干净的方法......

    您可以使用HtmlRenderer 结合PDFSharp 来完成此操作:

    Bitmap bitmap = new Bitmap(1200, 1800);
    Graphics g = Graphics.FromImage(bitmap);
    HtmlRenderer.HtmlContainer c = new HtmlRenderer.HtmlContainer();
    c.SetHtml("<html><body style='font-size:20px'>Whatever</body></html>");
    c.PerformPaint(g);
    PdfDocument doc = new PdfDocument();
    PdfPage page = new PdfPage();
    XImage img = XImage.FromGdiPlusImage(bitmap);
    doc.Pages.Add(page);
    XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);
    xgr.DrawImage(img, 0, 0);
    doc.Save(@"C:\test.pdf");
    doc.Close();
            
    

    有些人报告说最终图像看起来有点模糊,显然是由于自动抗锯齿。这是关于如何解决该问题的帖子消息:http://forum.pdfsharp.com/viewtopic.php?f=2&t=1811&start=0

    【讨论】:

    • 它不会生成原生 PDF 代码。它的作用是将 HTML 渲染为图像并将图像插入 PDF。我认为这不是从 HTML 生成 PDF 的正确方法。据我所知,目前还没有可以将 html 转换为 PDF 的代码库。你必须自己写一个。
    • 查看最新的HTML Renderer,支持原生PdfSharp渲染。也可以通过 NuGet 获得:HtmlRenderer.PdfSharp
    • 注意它现在是XImage.FromBitmapSource
    • user281848:它有什么不同?
    • 知道如何使用它来将当前页面转换为 pdf 吗?
    【解决方案4】:

    如果您需要在您的应用中进行简单的解析并且您可以控制 html 输入,您可以为此编写自己的库。

    我在其中一个项目中创建了一个,但遗憾的是,由于与特定应用程序相关的自定义功能,它还不能共享。

    基本上,您需要遵循以下逻辑来实现基本的 HTML 到 PDF:

    1. 标签的简单 HTML 解析
    2. 创建逻辑以识别常见样式,即粗体、斜体、左、居中等,并使用这些属性创建 PDFSharp 类并分配给 Para,它将作为样式属性添加到 HTML 中
    3. 处理表格标签并在 PDF 中添加行和列
    4. 用于添加段落的段落标签。

    我已经根据我的实现对这里的逻辑进行了非常广泛的概述。

    你可能有更好的主意:)

    您也可以参考: Writing content of HTML table into PDF doc using iTextSharp in asp.net

    【讨论】:

      【解决方案5】:

      老问题,但以上都不适合我。然后我尝试了generatepdfHtmlRenderer 方法结合pdfsharp。希望能帮助到你: 您必须安装一个名为 HtmlRenderer.pdfsharp 的 nuget。

      var doc = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf("Your html in a string",PageSize.A4);
        PdfPage page = new PdfPage();
        XImage img = XImage.FromGdiPlusImage(bitmap);
        doc.Pages.Add(page);
        XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);
        xgr.DrawImage(img, 0, 0);
        doc.Save(Server.MapPath("test.pdf"));
        doc.Close();
      

      【讨论】:

      • 当我尝试下载 Xamarin.Android 的 nuget 包时出现以下错误:“无法安装包 'HtmlRenderer.Core 1.5.0.5'。您正在尝试将此包安装到项目中以 'MonoAndroid,Version=v6.0' 为目标,但包不包含任何与该框架兼容的程序集引用或内容文件。有关详细信息,请联系包作者。”
      【解决方案6】:

      我知道有一个非常老的问题,但我意识到没有人说实际上是一种将 HTML 呈现为 PDF 的准确方法。根据我的测试,我发现您需要以下代码才能成功完成。

      Bitmap bitmap = new Bitmap(790, 1800);
      Graphics g = Graphics.FromImage(bitmap);
      XGraphics xg = XGraphics.FromGraphics(g, new XSize(bitmap.Width, bitmap.Height));
      TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer c = new TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer();
      c.SetHtml("Your html in a string here");
      
      PdfDocument pdf = new PdfDocument();
      PdfPage page = new PdfPage();
      XImage img = XImage.FromGdiPlusImage(bitmap);
      pdf.Pages.Add(page);
      XGraphics xgr = XGraphics.FromPdfPage(pdf.Pages[0]);
      c.PerformLayout(xgr);
      c.PerformPaint(xgr);
      xgr.DrawImage(img, 0, 0);
      pdf.Save("test.pdf");
      

      还有另一种方法,但您可能会遇到尺寸问题。

      PdfDocument pdf = PdfGenerator.GeneratePdf(text, PageSize.A4);
      pdf.Save("test.pdf");
      

      【讨论】:

      • 您看到投票最多的答案的第一条评论了吗?我同意这种观点,即这不是基于提问者所寻找的适当解决方案。将 html 图像插入 PDF 文档不是目标。
      【解决方案7】:

      你们听说过this。我可能回答得很晚,但我认为它有帮助。它非常简单,效果很好。

      var htmlContent = String.Format("<body>Hello world: {0}</body>", 
              DateTime.Now);
      var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter();
      var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
      

      编辑:我带着使用“PDFSharp”将 HTML 代码转换为 PDF 的问题来到这里,发现“PDFSharp”无法做到这一点,然后我发现了 NReco,它对我有用,所以我觉得它可能会帮助像我这样的人。

      【讨论】:

      • NReco 是否与“PDFSharp”有任何关联?毕竟 OP 想要 PDFSharp 的解决方案......
      • 我带着同样的问题来到这里,使用“PDFSharp”将 HTML 代码转换为 PDF,发现“PDFSharp”无法做到这一点,然后我发现了 NReco,它对我有用,所以我觉得可能会帮助像我这样的人。感谢您的投票。
      • 抱歉,我没有投反对票(我为什么要投反对票,那也会让我失去代表权)。似乎其他人也有同样的想法,并认为投反对票比发表评论更容易......
      • 说了这么多,你为什么不简单地把它放在你的答案中。现在的答案听起来像是 NReco 的广告,并没有说明您的评论是做什么的。
      • @MuraliKrishna 感谢这个想法。 NReco 在我的情况下工作正常,因为我无法通过 PDFSharp 解析 HTML
      【解决方案8】:

      HTML Renderer for PDF using PdfSharp 可以从 HTML 生成 PDF

      1. 作为图像,或
      2. 作为文本

      在插入 PDF 之前。

      要渲染为图像,请参考 Diego 答案中的代码。

      要呈现为文本,请参考以下代码:

      static void Main(string[] args)
      {
          string html = File.ReadAllText(@"C:\Temp\Test.html");
          PdfDocument pdf = PdfGenerator.GeneratePdf(html, PageSize.A4, 20, null, OnStylesheetLoad, OnImageLoadPdfSharp);
          pdf.Save(@"C:\Temp\Test.pdf");
      }
      
      public static void OnImageLoadPdfSharp(object sender, HtmlImageLoadEventArgs e)
      {
          var imgObj = Image.FromFile(@"C:\Temp\Test.png");
          e.Callback(XImage.FromGdiPlusImage(imgObj));    
      }
      
      public static void OnStylesheetLoad(object sender, HtmlStylesheetLoadEventArgs e)
      {
          e.SetStyleSheet = @"h1, h2, h3 { color: navy; font-weight:normal; }";
      }
      

      HTML 代码

      <html>
          <head>
              <title></title>
              <link rel="Stylesheet" href="StyleSheet" />      
          </head>
          <body>
              <h1>Images
                  <img src="ImageIcon" />
              </h1>
          </body>
      </html>
      

      【讨论】:

        【解决方案9】:

        我会推荐你​​NReco.PdfGenerator,因为有免费和付费的许可证,而且很容易从 nuget 安装。

        主页:https://www.nrecosite.com/pdf_generator_net.aspx

        文档:https://www.nrecosite.com/doc/NReco.PdfGenerator/

        如果您想从 html 文件创建 PDF,请尝试:

        String html = File.ReadAllText("main.html");
        var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter();
        htmlToPdf.GeneratePdf(html, null, "C:/Users/Tmp/Desktop/mapa.pdf");
        

        【讨论】:

          【解决方案10】:

          如果您只想将某个 HTML 字符串写入 PDF,而不希望将其余部分写入 PDF,您可以使用 TheArtOfDev HtmlRenderer 中的 HtmlContainer。这个 sn-p 使用 V 1.5.1

          using PdfSharp.Pdf;
          using PdfSharp;
          using PdfSharp.Drawing;
          using TheArtOfDev.HtmlRenderer.PdfSharp;
          
          //create a pdf document
          using (PdfDocument doc = new PdfDocument())
          {
              doc.Info.Title = "StackOverflow Demo PDF";
          
              //add a page
              PdfPage page = doc.AddPage();
              page.Size = PageSize.A4;
          
              //fonts and styles
              XFont font = new XFont("Arial", 10, XFontStyle.Regular);
              XSolidBrush brush = new XSolidBrush(XColor.FromArgb(0, 0, 0));
          
              using (XGraphics gfx = XGraphics.FromPdfPage(page))
              {
                  //write a normal string
                  gfx.DrawString("A normal string written to the PDF.", font, brush, new XRect(15, 15, page.Width, page.Height), XStringFormats.TopLeft);
          
                  //write the html string to the pdf
                  using (var container = new HtmlContainer())
                  {
                      var pageSize = new XSize(page.Width, page.Height);
          
                      container.Location = new XPoint(15,  45);
                      container.MaxSize = pageSize;
                      container.PageSize = pageSize;
                      container.SetHtml("This is a <b>HTML</b> string <u>written</u> to the <font color=\"red\">PDF</font>.<br><br><a href=\"http://www.google.nl\">www.google.nl</a>");
          
                      using (var measure = XGraphics.CreateMeasureContext(pageSize, XGraphicsUnit.Point, XPageDirection.Downwards))
                      {
                          container.PerformLayout(measure);
                      }
          
                      gfx.IntersectClip(new XRect(0, 0, page.Width, page.Height));
          
                      container.PerformPaint(gfx);
                  }
              }
          
              //write the pdf to a byte array to serve as download, attach to an email etc.
              byte[] bin;
              using (MemoryStream stream = new MemoryStream())
              {
                  doc.Save(stream, false);
                  bin = stream.ToArray();
              }
          }
          

          【讨论】:

            【解决方案11】:

            很遗憾,HtmlRenderer 不是在基于 .NET 5.0 的项目中使用的合适库:

            System.IO.FileLoadException: 'Could not load file or assembly 'HtmlRenderer,
            Version=1.5.0.6, Culture=neutral, PublicKeyToken=null'. The located assembly's 
            manifest definition does not match the assembly reference. (0x80131040)'
            

            另外,我发现依赖包HtmlRender.PdfSharp有如下警告信息:

            Package 'HtmlRenderer.PdfSharp 1.5.0.6' was restored using 
            '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, 
            .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, 
            .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' instead of the project 
            target framework 'net5.0'. This package may not be fully compatible with your project.
            

            顺便说一句,我设法使用另一个库 IronPDF 将 HTML 呈现为 PDF:

            License.LicenseKey = "license key";
            var renderer = new ChromePdfRenderer();
            PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(youtHtml);
            pdf.SaveAs("your html as pdf.pdf");
            

            License.LicenseKey 的行不是必需的,您可以将其删除,但您的 pdf 将在每页末尾生成 IronPDF 水印。但是 IronPDF 提供了getting trial license key

            【讨论】:

              猜你喜欢
              • 2013-04-21
              • 2011-06-29
              • 1970-01-01
              • 1970-01-01
              • 2016-03-23
              • 1970-01-01
              • 1970-01-01
              • 2017-12-12
              • 2011-07-27
              相关资源
              最近更新 更多