24

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 有类似的解决方案吗?

4

11 回答 11

17

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

您可以将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

于 2013-06-14T22:59:41.130 回答
11

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

于 2011-09-29T12:39:47.310 回答
4

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

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();
于 2015-06-29T07:24:02.440 回答
3

In a project that I developed last year I used wkhtmltopdf (http://wkhtmltopdf.org/) to generate pdf from html then I read the file and get back it to the user.

It works fine for me and it could be an idea for you...

于 2011-09-30T10:15:17.430 回答
2

如果您只想将某个 HTML 字符串写入 PDF 而不是其余的,您可以使用HtmlContainerTheArtOfDev HtmlRenderer 中的。此代码段使用 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();
    }
}
于 2019-07-24T09:55:55.047 回答
1

我知道有一个非常老的问题,但我意识到没有人说实际上是一种将 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");
于 2015-10-13T22:42:02.193 回答
1

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>
于 2017-08-08T07:37:53.897 回答
1

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

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,它对我有用,所以我觉得它可能会帮助像我这样的人。

于 2017-01-06T22:39:04.183 回答
0

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

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

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

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

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

你可能有更好的主意:)

您还可以参考: 在 asp.net 中使用 iTextSharp 将 HTML 表格的内容写入 PDF 文档

于 2014-06-06T11:05:20.683 回答
0

不幸的是,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 提供了获取试用许可证密钥

于 2022-01-10T04:42:59.270 回答
-3

我会推荐你​​ 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");
于 2018-04-13T21:26:12.097 回答