基于HTML代码生成PDF(iTextSharp,PDFSharp?)

时间:2011-09-29 12:09:41

标签: c# html pdf itextsharp pdfsharp

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 ();

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

10 个答案:

答案 0 :(得分:13)

我知道这个问题已经过时了,但这是一个干净的方法......

您可以使用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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

老问题但上面没有一个对我有效。然后我尝试HtmlRenderergeneratepdf方法与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();

答案 4 :(得分:2)

我知道有一个非常古老的问题,但我意识到没有人说实际上将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");

答案 5 :(得分:1)

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

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

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

  1. 标签的简单HTML解析
  2. 创建逻辑以识别常见样式,例如粗体,斜体,左边,中心等,并创建具有这些属性的PDFSharp类并分配给Para,它将作为样式属性添加到HTML中
  3. 处理表格标签并在PDF中添加行和列
  4. 段落标记以添加段落。
  5. 基于我的实现,我在这里给出了非常广泛的逻辑概述。

    你可能有更好的主意:)

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

答案 6 :(得分:1)

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

  1. 作为图片,或
  2. as text
  3. 插入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>
    

答案 7 :(得分:0)

如果您只希望将某个HTML字符串写入PDF,而其余部分不希望写入,则可以使用TheArtOfDev HtmlRenderer中的HtmlContainer。此代码段使用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();
    }
}

答案 8 :(得分:-1)

你们有没有听说过this。我可能会很晚才回答,但我认为这有帮助。它很简单,效果很好。

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

编辑:我来到这里的问题是使用&#39; PDFSharp&#39;将HTML代码转换为PDF并发现&#39; PDFSharp&#39;不能做到然后我发现了NReco,它对我有用,所以我觉得它可以帮助像我这样的人。

答案 9 :(得分:-1)

我会向您推荐 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");